2012-01-19 81 views
2

我有一系列組成單個測試用例的CodedUI測試方法。測試方法需要按順序運行(IE testmethoda然後運行testmethodb然後testmethodc),我希望結果在Microsoft Test Manager中顯示,看起來像testmethoda通過,testmethodb通過,testmethodc失敗。有沒有辦法做到這一點,而能夠運行整個測試用例的多個迭代?在測試管理器中訂購編碼的UI測試和結果

我曾嘗試將測試方法放入單一測試方法中並調用該方法。這爲我提供了所需的測試順序和進行多次測試運行的能力,但測試管理器在整個測試用例中顯示了一次通過/失敗。

我也嘗試將數據源附加到單個測試方法,並在測試管理器中對它們進行排序,從而在測試管理器中給出期望的測試結果,但是具有副作用,如果我想運行多個數據行,弄亂了。例如3個數據行可以運行:

testmethoda
testmethoda
testmethoda

testmethodb
testmethodb
testmethodb

testmethodc
testmethodc
testmethodc

I W螞蟻他們運行:
testmethoda
testmethodb
testmeothdc

testmethoda
testmethodb
testmethodc等。

我曾想過使用有序測試很好,但仍然顯示爲一個單一的在MTM中進行測試,並且我不知道數據驅動它的方法,所以它會有它自己的問題。

是否有一個功能,我缺少VS或MTM來獲得這些結果?也許一種方法可以讓我在結果文件中定義測試運行?編寫/編輯trx文件是否將我的結果導入MTM?我有一種感覺,我也必須對T​​FS數據庫進行更改,這不是一個選項。

回答

0

我不認爲有辦法通過VS或MTM來做到這一點。將所有測試方法添加到單個測試方法的選項聽起來不錯,但當其中一個失敗時,「父」測試方法會停止並拋出其中一個內部測試引發的「AssertFailedException」。如果你的測試方法(a,b,c ...)完全是(這意味着如果testMethodA失敗,其他測試可以毫無問題地運行),我會嘗試捕獲所有的內部異常,並在最後打印哪些方法通過,哪些不是。

[TestClass] 
public class TestClass 
{ 
    Dictionary<string, string> testMethods; 
    bool testResult; 

    [TestInitialize] 
    public void TestInitialize() 
    { 
     testMethods = new Dictionary<string, string>(); 
     testResult = true; 
    } 

    [TestMethod] 
    public void TestMethod() 
    { 
     //Run TestMethodA 
     try 
     { 
      TestMethodA(); 
      testMethods.Add("TestMethodA", "Passed"); 
     } 
     catch (AssertFailedException exception) //Edit: better catch a generic Exception because CodedUI tests often fail when searcing for UI Controls 
     { 
      testResult = false; 
      testMethods.Add("TestMethodA", "Failed: " + exception.Message); 
     } 

     //Run TestMethodB 
     try 
     { 
      TestMethodB(); 
      testMethods.Add("TestMethodB", "Passed"); 
     } 
     catch (AssertFailedException exception) 
     { 
      testResult = false; 
      testMethods.Add("TestMethodB", "Failed: " + exception.Message); 
     } 
    } 

    [TestCleanup] 
    public void TestCleanup() 
    { 
     foreach (KeyValuePair<string, string> testMethod in testMethods) 
     { 
      //Print the result for each test method 
      TestContext.WriteLine(testMethod.Key.ToString() + " --> " + testMethod.Value.ToString()); 
     } 

     //Assert if the parent test was passed or not. 
     Assert.IsTrue(testResult, "One or more inner tests were failed."); 
    } 
} 

您還可以創建一個不同的類,將管理所有的這種行爲,以避免所有這些「的try-catch」。

+0

是的不幸的是,B和C確實會相互影響。如果A失敗,B和C就不能運行,所以他們不得不退出。真正的問題是A B和C都應該被認爲是一個測試用例。 – stoj

+0

雖然您的測試方法是一個測試用例,但是將它們分爲較小的方法是一種很好的做法,因此您可以稍後在其他測試用例中重用它們。例如,如果A方法是'LoginToSite()',我相信有多個測試用例使用它,所以如果您的登錄頁面發生任何更改,您只需更改(或重新記錄)一種方法。至於我的回答,我已經在一個'黑盒'測試中使用它,在這個測試中,對Web服務的簡單調用會執行許多數據庫聲明,並期望對其他應用程序進行多次調用,因此,如果任何數據庫聲明或預期調用失敗測試不會停止。 – Schaliasos

+0

是的,從發展的角度來看,它們應該是分開的,否則它們將是不可修復的500行函數沒有提到違反DRY ....從測試用例報告的角度來看,儘管我認爲它們應該是單個案例。 – stoj

相關問題