2016-04-06 62 views
3

私は以下のような類似の形式で定義された複数のテストを含むバッチファイルを持っています。vstest.console.exeを使用して1つのテストが失敗した場合、テストを停止する方法は?

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

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

ところで、私のtest.runsettingsの内容は、私がDocumentation for runsettingsをチェックして

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

あり、この場合にはフラグ/属性が存在しないようです。

+1

TFSビルドサーバーの場合、msdnでこれについて尋ねました。立ち入り禁止。 vstest、thoについて知りません。 – Will

+1

あなたはMSDNを思い出しました。私はmsdnに同じ質問を掲示しました。うまくいけば、彼らは答えを得て、公式の問題が何であれ、ここに投稿することができます。私は、これを実装するフラグが利用可能であるべきだと思います。しかし、それはドキュメントのどこにもありません。 – Bangonkali

+0

これは不可能だとは思わない – thepirat000

答えて

1

、それはあなたのためのオプションである場合は、メソッドとTestContextプロパティを初期化、クリーンアップとテストのための基本クラスを導入する可能性。

クリーンアップメソッドでは、テストが失敗したかどうかを確認し、をTestInitializeにトリガーすることで、その後に他のテストをパスすることを許可しません。 lukblの答えに加えて

[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!"); 
    } 
} 
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 
+0

これは素晴らしい提案です! @lukblの提案がうまくいくなら、私はこれを試してみます。どちらが速いのかを確認するために両方を実装する予定です。 また、DLLまたはテストスイートごとにErrorLevelを実装することは良い考えです。 – Bangonkali

0

あなたが複数のテストクラスを持っている場合、あなたはテストでグローバルな経営を持っていますので、あなたは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"); 
    } 

そして、ここでは、すべてのテストを更新するための簡単な方法です彼らの署名が正規表現のマッチングを使用して、同じであれば、一度にメソッドを初期化します置き換え

(\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"); 
を 検索:、Visual Studioは、すべてを置き換えますTestFinalize()の場合は

などとなります。

関連する問題