2017-10-02 1 views
-3

私はVisual Studio 2013で作業していますが、「すべて実行」を選択すると単体テストのほとんどが失敗しますが、失敗したテストを選択して単独で実行すると、そのテストは成功します。さらに、これらのテストのいくつかを選択して実行すると、実行する最初のテストは合格し、他のテストは失敗します。ただし、単独で実行すると、それぞれが通過します。Run Allを選択してから一度に1つしか実行しないと、ユニットテスト(ほとんど)が失敗するのはなぜですか?

私は、失敗したテストのほとんどが "System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません"と気付きましたが、これはすべてのテストを実行した場合にのみ表示されます。

私はこれらのテストを一度に1つずつ実行することができましたが、私はそれを避けたいと思います。以前誰かがこの問題に遭遇した場合、どのように修正しましたか?

コンテキスト:.NET 4.6.2がインストールされたVisual Studio 2013でこれを実行します。

更新:テスト環境の状態を設定するすべてのテストの前に、テスト初期化プログラムが実行されています。その環境をきれいにするためにテストごとに実行するdisposeメソッドもあります。

ここでは、テストイニシャライザの最初のパスの前に存在しないオブジェクトが特に存在することがわかりましたが、それは後で存在します。最初のテストの後のクリーンアップでは、他のほとんどのオブジェクトは削除されますが、これはただnullになります。テストイニシャライザの2回目(そして後のすべてのパス)には、実際のテストの前に、最初のパスのようにファイルパスを取得するのではなく、「null」のままです。

これらの他のテストのいずれかがそのオブジェクトを呼び出そうとすると、null値が返されてその例外がスローされます。

+0

クラスレベルのオブジェクトをnullに設定して、それを後のテストで使用するかどうかを確認します。それはコードを見ずに私の推測だろう – WebDever

+0

@WebDeverそうであるようです。最初のテストの後にリセットされないクリーンアップメソッドが処理しているオブジェクトがあるため、他のすべてがSystem.NullRefernceExceptionを取得します。これを回答として投稿したい場合、私はこれを閉じる前に待つことができます。 – MrSpudtastic

+0

答えとして投稿、ありがとう – WebDever

答えて

1

クラスレベルのオブジェクトをnullに設定して、それを後のテストで使用するかどうかを確認します。

1

あなたのコードを見ることなく、私は推測することしかできないので、ここにあります。

オブジェクトは、setupメソッドの代わりに、テストクラスのコンストラクタ内で初期化しています。これは、複数のテストが同時に同じオブジェクトを使用していることを意味し、それらのオブジェクトは他のテストで入れられたどの状態でもかまいません。

0

各テスト後にnullオブジェクトを廃棄する静的メソッドを構築しました。私は、そのメソッドがスレッドセーフであることを確認して、使用中であるかどうかを確認し、ロックしてから再度チェックして使用中かどうかを確認します。

これで、testInitializerが再び実行されるたびに、そのオブジェクトが作成され、nullのままではなく正しいパスを指すようになります。

関連する問題