4

VS2010 Premium のコード化された UI テストを使用しています。

実行後に失敗したテスト ケースを再実行する方法を知っていますか? 再実行後にテストに合格した場合は、結果レポートで合格する必要があります。

4

2 に答える 2

5

最適な方法ではありませんが、すべてのコードをtry/catchブロックして、例外がスローされた場合にテストを再実行することができます。

[CodedUITest]
public class CodedUITest
{
    private static int _maxTestRuns = 5;

    [TestCleanup]
    public void Cleanup()
    {
        //If the test has reached the max number of executions then it is failed.
        if (_maxTestRuns == 0)
            Assert.Fail("Test executed {0} times and it was failed", _maxTestRuns);
    }

    [TestMethod]
    public void CodedUITestMethod()
    {
        try
        {
            this.UIMap.RecordedMethod1();
        }

        catch (Exception exception)
        {
            //Call Cleanup, rerun the test and report the error.
            if (_maxTestRuns > 0)
            {
                _maxTestRuns--;
                TestContext.WriteLine(exception.Message);
                TestContext.WriteLine("Running Again...");
                this.Cleaup();
                this.CodedUITestMethod();
            }
        }
    }
}
于 2012-08-04T11:54:03.423 に答える
0

Schaliasos が提案する方法を一般化することもできます。次のような基本クラスを作成できます。

[CodedUITest]
public class _TestBase
{
    private static int _maxTestRuns;
    public Exception _currentException;

    public _TestBase()
    {
    }

    public void TryThreeTimes(Action testActions)
    {
        _maxTestRuns = 3;
        _currentException = null;
        while (_maxTestRuns > 0)
        {
            try
            {
                testActions();
            }
            catch (Exception exception)
            {
                _maxTestRuns--;
                _currentException = exception;
            }
            if (_currentException == null)
                break; // Test passed, stop retrying
        }
        if (_maxTestRuns == 0)  // If test failed three times, bubble up the exception.
        {
            throw _currentException;
        }          
    }

    /// <summary>
    ///Gets or sets the test context which provides
    ///information about and functionality for the current test run.
    ///</summary>
    public TestContext context
    {
        get
        {
            return testContextInstance;
        }
        set
        {
            testContextInstance = value;
        }
    }
    private TestContext testContextInstance;
}

そして、テストを書くとき、上記のクラスを継承して、これを行うことができます:

[CodedUITest]
public class NewTestClass : _TestBase
{
    [TestMethod]
    public void MyTestMethod1()
    {
        TryThreeTimes(new Action(() =>
            // Assertions and Records come here
            Assert.IsTrue(false);
         }));
    }

    [TestMethod]
    public void MyTestMethod2()
    {
        TryThreeTimes(new Action(() =>
            // Assertions and Records come here.
            Assert.IsTrue(true);
         }));
    }
}   

これをさらに簡単にする方法を考えていましたが、何か提案をいただければ幸いです。頻繁に実行したい多くのテストがある場合、これは少なくともかなりのコードを節約します。関数 TryThreeTimes を一般化して、引数の 1 つが再実行の回数になるようにすることは理にかなっているかもしれません。

于 2013-12-10T09:36:02.880 に答える