24

わかりました、これは迷惑です。

MSTestはすべてのテストを同時に実行するため、一部のテストが失敗します。いいえ、これは私のテストが壊れやすく、ビルド順序の影響を受けやすいためではなく、ファイルから実行されているDb4oオブジェクトデータベースを使用するデモプロジェクトであるためです。

そのため、リポジトリが正しく機能してブームになることを確認するDataAccessテストがいくつかあります。MSTestが爆発します。すべてのテストを同時に実行しようとするため、他のテストが使用しているときにテストがデータベースファイルにアクセスしようとすると、エラーが発生します。

誰かがこれを回避する簡単な方法を考えることができますか?私はMSTestを捨てたくありません(私はそうしますが、別の話です)そして私は本格的なデータベースサービスを実行したくないので、MSTestを同時に実行しないように強制するか、ファイルを開く。

誰かアイデアはありますか?

4

3 に答える 3

34

Monitorを使用して、TestInitialize に入り、TestCleanup で終了することをお勧めします。すべてのテスト クラスが外部ファイルに依存している場合は、それらすべてに対して 1 つのロック オブジェクトを使用する必要があります。

public static class LockClass
{
    public static object LockObject = new object();
}

...

[TestInitialize]
public void TestSetup()
{
     Monitor.Enter(LockClass.LockObject);
}

[TestCleanup]
public void TestCleanup()
{
     Monitor.Exit(LockClass.LockObject);
}

これにより、すべてのテストが連続して実行され、すべてのテストが成功/失敗する限り実行されます。ただし、それらのいずれかが予期しない例外をスローした場合、失敗したテストに対して終了コードが実行されないため、残りはすべてハングします。

于 2009-03-31T05:19:41.460 に答える
5

このようにロックを使ってみました。ただし、私が経験したのは、VS2010はデフォルトではテストを並行して実行せず、単一のスレッドで順次実行するということでした。(ただし、並列実行をオンに切り替えることはできますが、これで問題を完全に防ぐことはできません)

私が非常に気がかりなのは、テストクラス間でも、順次実行が任意の順序で実行されることです。

したがって、たとえば、実行順序は次のようになります。

  • クラスA-TestInitialize:ロックが確立されます
  • クラスA-TestMethod1:実行します、OK
  • クラスB-TestInitialize:ロックが確立されます=>スレッドがブロックされます=>完全なUnitTestsがブロックされます!原因は、クラスAのメソッドを実行するスレッドが他にないためです。したがって、Montor.Exit()に到達することはありません。

MSがなぜそうしているのかわかりません。他のUnitTestフレームワーク(JUnitなど)は、クラスごとにテストメソッドを実行します。そうしないと、SetUp / TearDownメソッドのインターリーブが発生し、説明されている混乱が発生します...

MSTestがテストクラス間をジャンプするのを防ぐ方法を知っている人はいますか?(現在、Resharpersテストランナーを使用しています。これは期待どおりに動作し、次のクラスに進む前に、あるクラスのすべてのテストメソッドを実行します)

于 2010-05-17T13:28:35.753 に答える
3

順序付けられたテストを使用する

http://msdn.microsoft.com/en-us/library/ms182630(v=VS.90).aspx

于 2011-11-01T21:19:23.897 に答える