2012-01-19 61 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

相关问题