5

以下の同様の形式で定義された複数のテストを含むバッチ ファイルがあります。

vstest.console.exe Test.dll /Settings:"test.runsettings" /Tests:"t1,t2,t3,t4,t5"

テストは t1 から t5 まで順番に実行されます。ただし、いずれかのテストが失敗した場合は vstest を停止したいと考えています。これは vstest.console.exe を使用して可能ですか?

ところで、私のtest.runsettingsの内容は

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
  <MSTest>
    <ForcedLegacyMode>true</ForcedLegacyMode> 
      <KeepExecutorAliveAfterLegacyRun>true</KeepExecutorAliveAfterLegacyRun> 
  </MSTest>
</RunSettings>

runsettingsのドキュメントを確認しましたが、この場合のフラグ/属性はないようです。

4

3 に答える 3

2

例のように、実行するテストの数が少ない場合は、vstest.console.exe の複数の実行に分割して、バッチで ERRORLEVEL を確認できます。ERRORLEVEL が 0 でない場合は、テストが失敗したことを意味し、バッチを終了できます。

vstest.console.exe Test.dll /Settings:"test.runsettings" /Tests:"t1"
IF ERRORLEVEL 1 GOTO exit
vstest.console.exe Test.dll /Settings:"test.runsettings" /Tests:"t2"
IF ERRORLEVEL 1 GOTO exit
...

:exit
于 2016-04-06T12:46:24.487 に答える
1

それがオプションである場合は、クリーンアップ、初期化メソッド、およびTestContextプロパティを使用してテストの基本クラスを導入できます。

クリーンアップメソッドでは、テストが失敗したかどうかを確認し、トリガーAssert.FailするTestInitializeことで、その後他のテストが通過することを許可しません。

[TestClass]
public class BaseTest
{
    private static bool _failAllTests;
    public TestContext TestContext { get; set; }

    [TestInitialize]
    public void InitializeMethod()
    {
        if (_failAllTests)
        {
            Assert.Fail("Fail all tests");
        }
    }

    [TestCleanup]
    public void CleanUpMethod()
    {
        if (TestContext.CurrentTestOutcome == UnitTestOutcome.Failed)
        {
            _failAllTests = true;
        }
    }
}
[TestClass]
public class UnitTest1 : BaseTest
{
    [TestMethod]
    public void TestMethod1()
    {
        Assert.Fail("TestMethod1 failed!");
    }
    [TestMethod]
    public void TestMethod2()
    {
        Assert.IsTrue(true, "TestMethod2 passed!");
    }
}
于 2016-04-06T12:49:57.770 に答える
0

lukbl の回答に加えて、アセンブリ全体で同じことを行うことができるため、複数のテスト クラスがある場合は、vstest.console.exe の実行時にテストをグローバルに管理できます (呼び出している場合)。たとえば、複数回)。

vstest.console (または mstest) の使用方法に応じて注意が必要です。複数のテスト エージェント間で負荷分散を行っている場合、各テスト エージェントは独自の vstest.console.exe を実行するため、独自のアセンブリ レベルの値を持つことになるため、セッション管理は実行中のテストのグループによって制限されます。同じエージェント。このアプローチにより、次のコマンドで実行する一連のテスト全体を管理できるとしましょう: vstest.console.exe /filter: tests.dll

つまり、session_failed 変数のスコープ (クラス全体またはアセンブリ全体) に関係なく、同じクラスから別の vstest.console.exe 呼び出しで別のテストを実行すると、変数値またはコントロールが失われます。

そうは言っても、マルチクラス テスト シナリオの簡単なアプローチは次のとおりです。

[TestClass]
public static class TestSettings
{
    public static bool SessionTestsFailed = false;

    [AssemblyInitialize]
    public static void runsBeforeAnyTest(TestContext t)
    {
        TestSettings.SessionTestsFailed = false;
    }
}

[TestClass]
public class Tests1
{
    public TestContext TestContext { get; set; }

    [TestInitialize()]
    public void MyTestInitialize()
    {
        if (TestSettings.SessionTestsFailed)
            Assert.Fail("Session failed, test aborted");
    }

    [TestCleanup]
    public void MyTestFinalize()
    {
        if (TestContext.CurrentTestOutcome != UnitTestOutcome.Passed)
            TestSettings.SessionTestsFailed = true;
    }

    [TestMethod]
    public void test11()
    {
        Console.WriteLine("test11 ran");
        Assert.Fail("fail the test");
    }

    [TestMethod]
    public void test12()
    {
        Console.WriteLine("test12 ran");
        Assert.Fail("fail the test");
    }
}

[TestClass]
public class Tests2
{
    public TestContext TestContext { get; set; }

    [TestInitialize()]
    public void MyTestInitialize()
    {
        if (TestSettings.SessionTestsFailed)
            Assert.Fail("Session failed, test aborted");
    }

    [TestCleanup]
    public void MyTestFinalize()
    {
        if (TestContext.CurrentTestOutcome != UnitTestOutcome.Passed)
            TestSettings.SessionTestsFailed = true;
    }

    [TestMethod]
    public void test21()
    {
        Console.WriteLine("test21 ran");
        Assert.Fail("fail the test");
    }

    [TestMethod]
    public void test22()
    {
        Console.WriteLine("test22 ran");
        Assert.Fail("fail the test");
    }

そして、すべてのテスト初期化メソッドを一度に更新する簡単な方法があります。署名が同じ場合、regexp マッチングを使用して、Visual Studio ですべてを置き換えます。

(\s*)public void MyTestInitialize\(\)(\s*)(\r*\n)(\s*){(\r*\n)

交換:

$1public void MyTestInitialize()$3$4{$1\tif (TestSettings.SessionTestsFailed) Assert.Fail("Session failed, test aborted");

TestFinalize() についても同様です。

于 2017-02-14T04:40:49.010 に答える