2017-02-10 216 views
1

我想通過MS Test(從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]屬性。在DemoTests類中定義的測試已完成運行時,將評估TestCleanup()方法。在這種方法中,我們評估剛剛完成的測試的輸出。如果失敗了,我們殺死負責運行測試的進程。

在下面的例子中,我們定義了三個測試。第二個測試Test_Substracting_Operation()旨在故意失敗,因此第三個測試將永遠不會運行。利用具有處置問題黑匣子項目

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

相關問題