2017-02-10 38 views
1

テストが失敗したときにいつでもテスト実行を中止/中止できるように、MSテスト(Windowsコンソールから)でユニットテストを実行したい閾値。* n *失敗したテストの後にMsTestテストの実行を中止する方法

私の場合、特定の割合のテストが既に失敗した場合、テストを実行し続ける必要はありません。

私はmstest.exe実行をラップする新しいコンソールアプリケーションを作成する際に考えることができるので、私はリアルタイムで標準出力を解析することができ、 、最終的には例えば、プロセスを殺す:

var pi = new ProcessStartInfo() 
{ 
    FileName = MS_TEST, 
    UseShellExecute = false, 
    RedirectStandardOutput = true, 
    Arguments = MS_TEST_ARGS 
}; 
int passed = 0; int failed = 0; 
using (var process = Process.Start(pi)) 
{ 
    while (!process.StandardOutput.EndOfStream) 
    { 
     string line = process.StandardOutput.ReadLine(); 
     if (line.Contains("Passed")) 
      passed++; 
     if (line.Contains("Failed")) 
      failed++; 
     if (failed >= THRESHOLD) 
     { 
      process.Kill(); 
      break; 
     } 
    } 
} 

誰もこれを行うためのより良い方法を提案することはできますか?私はこれがMsTestによってネイティブにサポートされているとは思わない。

PowerShellはオプションのようですが、標準出力リダイレクトは簡単ではありません。

更新

注意点として、私はテストコードを変更することはできません、私はどのような方法でテストコードを変更せずに行われるために、これを必要とします。

答えて

2

BaseTestClassを作成します。このメソッドには、テストを実行するプロセスを強制終了するメソッドが含まれています。

using System.Diagnostics; 

namespace UnitTestProject1 
{ 
    public class BaseTestClass 
    { 
     private readonly int _threshold = 1; 
     private static int _failedTests; 

     protected void IncrementFailedTests() 
     { 
      if (++_failedTests >= _threshold) 
       Process.GetCurrentProcess().Kill(); 
     } 
    } 
} 

あなたがBaseTestClassから、すべてのテストクラスを継承して[TestCleanup]属性を使用する必要があります。 TestCleanup()メソッドは、DemoTestsクラスで定義されたテストが実行を終了したときに評価されます。この方法では、終了したテストの出力を評価します。失敗した場合は、テストを実行するプロセスを終了します。

次の例では、3つのテストを定義しています。 2番目のテストTest_Substracting_Operation()は意図的に失敗するため、3番目のテストは実行されません。

using Microsoft.VisualStudio.TestTools.UnitTesting; 

namespace UnitTestProject1 
{ 
    [TestClass] 
    public class DemoTests : BaseTestClass 
    { 
     public TestContext TestContext { get; set; } 

     [TestCleanup] 
     public void TestCleanup() 
     { 
      if (TestContext.CurrentTestOutcome == UnitTestOutcome.Failed) 
      { 
       IncrementFailedTests(); 
      } 
     } 
     [TestMethod] 
     public void Test_Adding_Operation() 
     { 
      // Arrange 
      int x = 1; 
      int y = 2; 

      // Act 
      int result = x + y; 

      // Assert 
      Assert.AreEqual(3, result); 
     } 

     [TestMethod] 
     public void Test_Substracting_Operation() 
     { 
      // Arrange 
      int x = 1; 
      int y = 2; 

      // Act 
      int result = x - y; 

      // Assert 
      Assert.AreEqual(100, result); 
     } 

     [TestMethod] 
     public void Test_Multiplication_Operation() 
     { 
      // Arrange 
      int x = 1; 
      int y = 2; 

      // Act 
      int result = x * y; 

      // Assert 
      Assert.AreEqual(2, result); 
     } 
    } 
} 
+0

この回答のおかげで、私はテストコード:(その答えのため – thepirat000

+0

感謝を変更することはできませんよ。それは、廃棄の問題を持っているブラックボックスのアイテムを使用してテストを私に巨大な問題を解決しました。 テストクラスにディストラクタを追加しました。そこでは、テスト結果が計算され、更新された後、プロセスが終了しました。 – Seffix

関連する問題