2009-10-09 172 views
28

私はほとんどシングルスレッド、シングルユーザーのアプリケーションで作業しています。 ここにはいくつかのワーカースレッドがあり、スレッドセーフなオブジェクトとクラスのみを使用しています。単体テストは実際に複数のスレッド(テスト用に明示的に作成されたもの)を持つものをテストしており、うまくテストされます。MSTestsでユニットテストを順次実行する方法はありますか?

スレッドセーフではないビジネスオブジェクトとサブシステムをテストすると、VSTSユニットテストが失敗します。スレッドセーフではないことは大丈夫です。アプリケーションで使用する方法です。

しかし、MSテストの「TestMethodごとの1つのスレッド」アプローチは私たちを殺します。私は多くの単体テスト・クラスでオブジェクト・ロックを実装しなければなりません。テストが順番に実行されるようにする必要があります(私は実際には順序は気にしませんが、同じオブジェクトに2つのテスト・メソッドを当てることはできません同じ時間)。

コードは次のようになります。

[TestClass] 
public class TestSomeObject 
{ 
    static object turnStile = new object(); 
... 
    [TestMethod] 
    public void T01_TestThis() 
    { 
     lock(turnStile) 
     { 
     .. actual test code 
     } 
    } 

    [TestMethod] 
    public void T02_TestThat() 
    { 
     lock(turnStile) 
     { 
     -- actual test code 
     } 
    } 

} 

は、テスト実行の順番を作るために、より良い/よりエレガントな方法はありますか?

+0

すべてのテストでいくつかのオブジェクトのインスタンスを再利用しているようですか? – BlackTigerX

+0

はい、本質的です。場合によってはデータベースであることもありますが、時にはシングルトンです - アプリケーションで使用されているように、 –

+1

があなたのタグで* unit-testing *と主張しているので、依存関係、特にスレッドセーフではない依存関係をモック/スタブする必要があります。 – mxmissile

答えて

16

テストを順番にリストすることができる「オーダードテスト」の概念があります。それは特定の連続的な順序を確実にするように調整されていますが、BがAが完了するのを待たなければ、それがどうなるかはわかりません。

それ以外は、テストがお互いに干渉することは残念です。テストごとに使用できるSetup/TearDownメソッドがあり、テストを互いに分離することが可能な場合があります。

+0

MSTestが同じアプリケーションドメイン内のすべてのテストを実行するため、テストが相互に干渉する可能性があることは残念です。 – Triynko

23

Ordered Testを使用してください。

テスト>新しいテスト>順序付きテスト

Test > New Test

Ordered Test

+0

すばらしいもの。私は簡単な方法であることを知っていた... :) –

+0

注文テストを使用するときに.runsettingsファイルをどのように指定しますか?具体的には、.runsettingsで指定されたパラメータでTestContextにアクセスする必要があります。 –

+0

@ajhuddy:新しいStack Overflow質問の候補者のように思えます。最初にあなたの質問がまだ尋ねられておらず、答えられていないことを確認し、新しい質問を書くときにこの質問を参照してください。 –

8

私は最終的に注文した試験方法を使用していました。それはうまくいく。

しかし、私はそれがNAntビルドで動作するのはかなり時間がかかりました。 のみを実行するビルドの順序付きテストリストには、MSTest呼び出しブロックの/ testmetadataおよび/ testlistスイッチを使用する必要があります。 これらのドキュメントは、種類の説明を使用するために概要を示しています。私はすべての "MSTest/testmetadata/testlist"の例のためのGoogleの効果はない。

しかし、このトリックは単純ですが、他の誰かが同じ問題にぶつかる場合に備えて、私はコミュニティに返すよう強く感じています。

  1. 編集(.vsmdi拡張子を持つ)テストメタデータファイル、およびテストのリスト(左 ペインのツリー内の最初のノードに新しいリスト を追加します。それをしたい名前を付け、 [SequentialTests]など
  2. MSTest呼び出しに/ testcontainerスイッチを使用した場合は、それを削除します。
  3. MSTestを のためのスイッチの追加 - >/testmetadata:MSTEST /testlistというスイッチを追加し
  4. を:SequentialTests(またはあなたが使用する任意の名前)

その後MSTestをテストに記載されているのみでテストを実行しますあなたが作成したリスト。

誰かがより良い方法を持っている場合、私はそれを聞いてみたいです!

12

あなたは、具体的(同じミューテックス文字列を共有するものは何でも)のいずれか、あなたがシリアライズしたい特定のテストでは、クラスのすべてのテストのために、各テスト実行のためのミューテックスを必要とすることができます。全体のテストクラスのために

、あなたはTestInitializeとTestCleanupはそうのような属性を使用することができます。

private readonly Mutex testMutex = new Mutex(true, "MySpecificTestScenarioUniqueMutexString"); 

[TestInitialize] 
public void Initialize() 
{ 
    testMutex.WaitOne(TimeSpan.FromSeconds(1)); 
} 

[TestCleanup] 
public void Cleanup() { 
    testMutex.ReleaseMutex(); 
} 

これはテストの機能ではありません明確にするために、いかなるロック構造が動作するはずです。私は、この場合にはミューテックスを提供するシステムを使用しています: https://msdn.microsoft.com/en-us/library/system.threading.mutex(v=vs.110).aspx

+0

こんにちは、あなたは精巧にできますか?たとえば、私はこのことを明確にする必要があります。...同じミューテックス文字列を共有しています。また、testMutex Private ReadOnlyを宣言しますが、FileTestMutexを使用している初期化とクリーンアップで... thx – CTZStef

+0

こんにちは!参照ミスマッチはタイプミスで、私はそれを修正しました。私はまた、説明のためにMutexクラスへのリンクを追加しました。 MutexはMicrosoftが提供するロック構造であり、システム全体の文字列をロックに使用するため、テストごとに、またはテストごとに異なるシリアル化を行うために、文字列を一意にする必要がありますクラス。文字列をどこにでもコピー/貼り付けすると、その文字列が使用されるたびにシリアル化されます。 上記の 'OrderedTest'の提案にも注意してください。それはおそらくあなたのために良いアイデアです。ミューテックス(または他の手動ロック)アプローチは複雑です。 –

2

私が注文したテストを使用し、また、ジェンキンス上で簡単に構成されたばかりのコマンド

MSTestを/testcontainer:"orderedtestfilename.orderedtest使用「/ resultsfileを:」testresults .trx」

16

はあなたが

右の試験方法をクリックしてプレイリストを使用することができます - > [プレイリストに追加 - >新規プレイリスト

実行順序を指定することができます enter image description here

+0

私はこれが質問に対する最良の答えだと感じています。 – user969153

+1

ベストを尽くし、1分以内にセットアップするのは簡単でした。 – Ruan

関連する問題