Visual Studio 2017でNUnit3を使用してTDDを実行しています。コードを更新して最新のテストに合格したので、本当に奇妙なことが起こっています。
次のように、[すべてのテストを実行]をクリックすると、他の3つのテストが失敗します。
これは、私のAssertメソッドの実際の値と期待される値が等しくないことを教えてくれています。
ただし、Assertメソッドが存在する行にブレークポイントを配置してデバッグを開始すると、スタックトレースに期待値と実際値が同じ値であることが示され、次のようにテストに合格します。
私は愚かなことをしていますか、それともVS2017やNUnitなどにバグがあるのでしょうか?
これは他の誰かに起こりますか?
[編集:おそらく、各テストを個別のクラスとして記述したことを追加する必要があります]
失敗したテストは、一緒にテストするとすべてに影響するリソースを共有します。影響を受けるテストとその対象を再確認します。
サブジェクトのstaticフィールドまたはプロパティも調べる必要があります。クラスの設計時に適切に使用しないと、問題が発生する傾向があります。
微妙な違いが発生する場合があります。たとえば、最初のテストが2番目のテストの動作に影響を与える状態を変更した場合、この2番目のテストの結果は、単独で実行した場合と同じにならない可能性があります。
ブレークポイントを使用できないときにテストの失敗を理解するのに役立つアイデアは、ロギングを追加することです。
とにかく、あなたの質問に答えるには:
これは他の誰かに起こりますか?
はい
私は愚かなことをしていますか、それともVS2017やNUnitなどにバグがあるのでしょうか?
どちらでもないことは間違いありません。少しだけ微妙なケースです
自分でこの現象に遭遇しましたが、原因は簡単にわかりました。より具体的には、いくつかの行列計算をテストし、テストクラスで計算するデータをクラス変数として定義し、それを使用して計算を実行しました。ただし、私のマトリックスルーチンは元のデータを変更したため、テストクラスで「テストの実行」を使用すると、最初のテストでデータが破損し、次のテストは成功しませんでした。
以下のサンプルコードは、私が何を意味するかを示すための試みです。
[TestFixture]
public void MyTestClass()
{
[Test]
public void TestMethod1()
{
MyMatrix m = new MyMatrix();
// Method1() modifies the data...
m.Method1(_data);
}
[Test]
public void TestMethod2()
{
MyMatrix m = new MyMatrix();
// here you test with modified data and, in general, cannot expect success
m.Method2(_data);
}
// the data to test with
private double[] _data = new double[1, 2, 3, 4]{};
}
テストフレームワークとしてMSTestを使用しているVisual Studio 2017でも同様の問題が発生しました。ユニットテストのアサーションは、テストの実行時に失敗していましたが、ユニットテストのデバッグ時に合格していました。これは少数の単体テストで発生しましたが、すべてではありませんでした。アサーションの失敗に加えて、System.TypeLoadException( アセンブリエラーからタイプをロードできませんでした )のために、ユニットテストの多くも失敗していました。私は最終的に問題を解決する次のことをしました:
これらの手順を実行した後、すべての単体テストは実行時に合格し始めました。