2

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

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

我还尝试将数据源附加到各个测试方法并在测试管理器中对它们进行排序,这可以在测试管理器中为我提供所需的测试结果,但如果我想运行多个数据行,则顺序会变得混乱。例如 3 个数据行将运行:

测试
方法测试方法
测试方法

测试
方法 测试方法
测试方法

测试
方法测试方法
测试方法

我希望他们运行:
testmethoda
testmethodb
testmeothdc

testmethoda
testmethodb
testmethodc 等。

我也考虑过使用有序测试,但这仍然显示为 MTM 中的单个测试,而且我不知道有一种方法可以数据驱动它,所以它会有自己的问题。

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

4

1 回答 1

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”。

于 2012-02-02T19:39:17.947 回答