2016-03-31 33 views
2

我有以下設置並聯運行我的測試(用於Selenium測試):如何在MSTest的測試執行過程中添加一個非測試方法作爲測試?

[TestClass] 
public class ParallelTests 
{ 
    [TestMethod] 
    public void TestAllParallel() 
    { 
     var testActions = Assembly.GetExecutingAssembly().GetTypes() 
      .Where(t => 
       t.GetCustomAttribute<CompilerGeneratedAttribute>() == null && 
       t.GetCustomAttribute<TestClassAttribute>() != null) 
      .Select(t => new Action(() => RunTest(t))) 
      .ToArray(); 

     System.Threading.Tasks.Parallel.Invoke(testActions); 
    } 

    private static void RunTest(Type test) 
    { 
     var instance = Activator.CreateInstance(test); 

     ExecuteTestMethods(instance); 
    } 

    private static void ExecuteTestMethods(object instance) 
    { 
     var testMethods = instance.GetType().GetMethods() 
      .Where(m => 
       m.GetCustomAttribute<TestMethodAttribute>(false) != null && 
       m.GetCustomAttribute<IgnoreAttribute>(false) == null) 
      .ToArray(); 

     foreach (var methodInfo in testMethods) 
     { 
      methodInfo.Invoke(instance, null);; 
     } 
    } 
} 

這工作得很好,雖然我的詹金斯服務器上的測試結果報告只能說明一個測試已運行。我希望在報告中看到由TestAllParallel()運行的所有測試。

這可能嗎?我在想,也許可以在運行時將方法作爲測試添加到MSTest中。

+0

我不認爲mstest有一個方法來在運行時添加測試。您可以爲測試創建一個單獨的trx文件(在您的方法中生成文件),然後Jenkins中的mstest插件會認爲它是從MSTest輸出的。 –

+0

也許你可以嘗試檢查測試代碼本身的代碼覆蓋率(而不是被測試的代碼)。雖然我不知道如何在jenkins和mstest中做到這一點。 –

+0

爲什麼你自己執行所有的測試,而不是指導你的Jenkins服務器爲你做? – silver

回答

1

恐怕不可能添加一個方法,但是您可以報告該特定測試中所有運行的結果。用類似的測試方法第一包絡執行以下代碼,這樣可以節省運行的結果:

private static void ExecuteMethod(MethodInfo method, object instance) 
    { 
     try 
     { 
      method.Invoke(instance, null); 
      threadSafeStringBuilder.Append("Test: " + method.Name + " passed"); 
     } 
     catch (UnitTestAssertException utException) 
     { 
      threadSafeStringBuilder.Append("Test: " + method.Name + " assertion failed" + utException.Message); 
      _allPassed = false; 
     } 
     catch (Exception ex) 
     { 
      threadSafeStringBuilder.Append("Test: " + method.Name + " exception: " + ex.Message"); 
     } 

    } 

在testAllParallel後來:

public void TestAllParallel() 
{ 
//... 
System.Threading.Tasks.Parallel.Invoke(testActions); 
if(_allPassed){ 
    Assert.IsTrue(true, "All tests Passed:\n"+threadSafeStringBuilder.ToString()); 
    }else{ 
    Assert.Fail("Some tests failed:\n"+threadSafeStringBuilder.ToString()); 
    } 

) 

請記住,這只是一個想法,不完全有效的代碼。特別是.net中沒有ThreadSafeStringBuilder,所以可能需要實現自己的或使用某個庫。

+0

這將收集錯誤日誌中的多個故障,並對我的設置有所改進,儘管它沒有解決我的問題。但你得到賞金! – Drutten

0

還有另一個系統可以使用System.Diagnostics.WriteLine。它會輸出你寫的任何內容。這是另一個討論它的SO問題:Add custom message to unit test result

該線程中非常有趣的一點是,如果沒有狀態消息,某人可能會通過刪除所有測試內容來「破壞」測試,因此您可能需要反正在正常測試中發送診斷信息。

+0

恐怕寫入控制檯不會將測試添加到Jenkins中的結果列表中。 – Drutten

0

我不確定我是否正確理解了你的問題,但我認爲你應該改變你的解決方案以克服這個挫折。 嘗試在Jenkins中構建一個只執行命令行的項目,該命令可以使用MSTest命令執行所有測試。 你可以看到如何去做here

相關問題