2

単一のテストケースを構成する一連のCodedUIテストメソッドがあります。テストメソッドは順番に実行する必要があり(IE testmethodaは、testmethodb、testmethodcの順に実行されます)、結果をMicrosoft Test Managerに表示して、testmethodaに合格、testmethodbに合格、testmethodcに失敗したように見せたいです。テストケース全体の複数の反復を実行できるようにしながら、これを行う方法はありますか?

私はテストメソッドを単一のテストメソッドに入れてそれを呼び出すことを試みました。これにより、目的のテスト順序と複数のテスト実行を実行できるようになりますが、テストマネージャーはテストケース全体で単一の合格/不合格を示します。

また、個々のテストメソッドにデータソースをアタッチしてテストマネージャーで注文しようとしました。これにより、テストマネージャーで目的のテスト結果が得られますが、複数のデータ行を実行したい場合、注文が混乱するという副作用があります。たとえば、3つのデータ行が実行されます。

testmethoda
testmethoda
testmethoda

testmethodb
testmethodb
testmethodb

testmethodc
testmethodc
testmethodc

それらを実行してほしい:
testmethoda
testmethodb
testmeothdc

testmethodatestmethodbtestmethodc
など

順序付けられたテストを使用することも考えましたが、それでもMTMで単一のテストとして表示され、データを駆動する方法がないため、独自の問題が発生します。

これらの結果を得るためにVSまたはMTMに欠けている機能はありますか?たぶん、結果ファイルでテスト実行を定義できるようにする方法ですか?trxファイルを書き込んだり編集したりすると、結果がMTMに反映されますか?オプションではないTFSデータベースにも変更を加える必要があると感じています。

4

1 に答える 1

0

VSやMTMでこれを行う方法はないと思います。すべてのテストメソッドを1つに追加するオプションは適切に聞こえますが、いずれかが失敗すると、「親」テストメソッドが停止し、内部テストの1つがスローした「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 に答える