2011-10-05 12 views
10

NUnitを使用して統合テストを実行します。これらのテストは非常に時間がかかります。多くの場合、障害を検出する唯一の方法はタイムアウトです。NUnitを最初の失敗時にテストを実行する方法

単一の障害が検出されるとすぐにテストの実行を停止したいと思います。

これを行う方法はありますか?

+0

私はこれがテストランナー特有の習慣だと思うので、どのようにテストを実行しますか? NUnit-console、msbuild NUnitタスク、他のランナー? – sll

答えて

1

これはおそらく理想的な解決策ではありませんが、テストが失敗した場合は残りのテストを無視してください。

[TestFixture] 
    public class MyTests 
    { 
     [Test] 
     public void Test1() 
     { 
      Ascertain(() => Assert.AreEqual(0, 1)); 
     } 

     [Test] 
     public void Test2() 
     { 
      Ascertain(() => Assert.AreEqual(1, 1)); 
     } 

     private static void Ascertain(Action condition) 
     { 
      try 
      { 
       condition.Invoke(); 
      } 

      catch (AssertionException ex) 
      { 
       Thread.CurrentThread.Abort(); 
      } 
     } 
    } 

あなたが潜在的にそれに装飾されたこの属性で基本クラスを作成して確かめることでメソッドを保護し、そこからすべてのTestFixtureクラスを派生を持つことができますのでTestFixtureAttributeは、継承可能なので。

唯一の欠点は、既存のすべてのアサーションをリファクタリングする必要があることです。

+0

これは正しい方向への一歩です。それは例外ではなく、アサートのためだけに機能します。しかし、それは面白い考えです...私は例外のために同様のことをすることができるかもしれません。 – willem

+0

@willem最初に成功した場合は、例外の回避策を投稿してください。私もやってみよう。 – Raghu

+0

テストメソッド本体全体をAscertainでラップして、すべての例外をキャプチャすることはできませんか? –

22

nunit-consoleを使用するには、/ stoponerrorコマンドラインパラメータを使用します。

コマンドラインリファレンスについては、hereを参照してください。

+4

私はこれがより良いアプローチだと信じています。プロセスに介入するのではなく、テストコードを不要なもので汚染するのではなく、NUnitにこれを処理させます! – mosu

+0

nunit ** 3 ** - console.exe --stoponerror –

6

私はNUnit 3を使用しています。次のコードは私のために働きます。

public class SomeTests { 
    private bool stop; 

    [SetUp] 
    public void SetUp() 
    { 
     if (stop) 
     { 
      Assert.Inconclusive("Previous test failed"); 
     } 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     if (TestContext.CurrentContext.Result.Outcome.Status == TestStatus.Failed) 
     { 
      stop = true; 
     } 
    } 
} 

また、これを抽象クラスにして派生させることもできます。

関連する問題