2009-07-20 5 views
1

質問は少し漠然としたことが、ここで私は(擬似コード)を知りたいの例だことがあります。すべてのテストケースは最後に操作を取り消す必要がありますか?

//start test-case for CreateObject function 
{ 
// initialization of parameters 
MyObject *obj = CreateObject(); 
// test results 
} 
//end test-case for CreateObject function 

は、それはまた、「DestroyObjectの」関数を呼び出してメモリを解放するために、この場合に必要ですか? [これはこの質問を生み出した特殊なケースです]

私の個人的な意見は、機能の実行を元に戻すべきではありませんが、多くのテストが実行されるとメモリ/リソースなしで残ることができますそのテストスイートのために(起こりそうにないが...)。

あなたはどう思いますか?この場合また一般的な場合には。

おかげで、この場合は

イウリアン

答えて

8

は、あなたのテストケースが割り当てられたメモリを解放する必要があります。こうすることで、テストを実行してメモリが漏れていないことを確認できるツールを使用できます。あなたのテストコードがメモリにリークするということは、これが失敗することを意味し、リークがテスト中であって、あなたのプロダクションコードではないことを確かに伝えることができません。

より一般的な状況では、テストは自分が行ったことをクリーンアップする必要があります。ほとんどのユニットテストフレームワークでは、これを行うtearDown()メソッドを実装できます。そうすれば、1つのテストが失敗した場合、それはそのテストの問題であり、別のテストとの相互作用ではないことがわかります。

1

通常、分離されたコードパスと分離された機能をテストし、毎回公平なテストにしたいとします。これは、新鮮な状態から始め、必要なものを正確に設定してから、テスト環境を破棄することを意味します。これにより、異なるテストケースの問題が回避され、後続の実行の結果や動作が変更される可能性があります。また、テストがすべて互いに独立していることを保証できること、および任意のサブセットを任意の順序で実行できることも意味します。

しかし、全体的なテスト環境(データベースなど)を設定する前と後のセットアップとティアダウンの方法を持つことも非常に一般的ですユニットテストの束に対して実行することができます。

4

実際には、すべてのモックオブジェクトをスタックに作成してください(スマートポインタを使用する)。そうすることで、テスト関数が範囲外になると自動的に破壊されます。テストを行うには

直接
+1

@ミランは言った、と入力して私の最後の5分をいくぶん冗長にする。 –

3

ない、しかし、あなたのようなものを行うC++コードがある場合:

MyObject *obj = CreateObject(); 

「objは」スマートポインタでないか、クラスによって管理されていない場合は、その後、あなたが持っているの問題。私がテストを書いていた場合、私は言ってないだろう:

MyObject obj; 
// tests on obj here 

どんなにあなたのテストの結果は、objが正しく破棄されますか。 C++でオブジェクトを動的に作成しないでください。

+0

それを避けることができない場合は、それをスマートポインタで包みます。 – GManNickG

関連する問題