在Test Manager中订购编码的UI测试和结果

时间:2012-01-19 18:56:58

标签: c# unit-testing coded-ui-tests microsoft-test-manager

我有一系列CodedUI测试方法组成一个测试用例。测试方法需要按顺序运行(IE testmethoda运行然后testmethodb然后testmethodc)我希望结果显示在Microsoft Test Manager中看起来像testmethoda通过,testmethodb通过,testmethodc失败。有没有办法在能够运行整个测试用例的多次迭代时执行此操作?

我试过将测试方法放入一个测试方法并调用它。这为我提供了所需的测试顺序和进行多次测试运行的能力,但测试经理在整个测试用例中显示单次通过/失败。

我还尝试将数据源附加到各个测试方法并在测试管理器中对它进行排序,这样可以在测试管理器中提供所需的测试结果,但副作用是,如果我想运行多个数据行,则命令获得弄乱。例如,将运行3个数据行:

testmethoda
testmethoda
testmethoda

testmethodb
testmethodb
testmethodb

testmethodc
testmethodc
testmethodc

我希望他们跑:
testmethoda
testmethodb
testmeothdc

testmethoda
testmethodb
testmethodc等。

我已经考虑过使用有序测试但是仍然在MTM中显示为单个测试,并且没有一种方法我知道数据驱动它无论如何它会有它自己的问题。

我是否在VS或MTM中缺少一项可以获得这些结果的功能?也许一种允许我在结果文件中定义测试运行的方法?编写/编辑trx文件会将我的结果导入MTM吗?我有一种感觉,我也必须对T​​FS数据库进行更改,这不是一个选项。

1 个答案:

答案 0 :(得分:0)

我认为通过VS或MTM无法实现这一目标。将所有测试方法添加到单个测试方法的选项听起来不错但是当其中一个测试方法失败时,'parent'测试方法会停止并抛出其中一个内部测试抛出的'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'。