2016-04-06 2 views
3

У меня есть пакетный файл, содержащий несколько тестов, определенных в аналогичной форме ниже.Как остановить тест, если один тест не удался с помощью vstest.console.exe?

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

Испытания проводятся в порядке от t1 до t5. Тем не менее, я хочу остановить vstest, если какой-либо из тестов не удастся. Возможно ли это с помощью vstest.console.exe?

Btw, содержание моего test.runsettings является

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

Я проверил Documentation for runsettings, кажется, нет флага/атрибута для этого случая.

+1

Я спросил об этом на msdn для серверов сборки TFS. Нет. Не знаю о встесте, тo. – Will

+1

Вы напомнили мне MSDN. Я отправил тот же вопрос в msdn, надеюсь, у них будут ответы, тогда я могу опубликовать здесь все, что должно быть принято официальным лицом.Я думаю, что флаг, который реализует это, должен быть доступен. Но это нигде в документации. – Bangonkali

+0

Не могу поверить, что это невозможно – thepirat000

ответ

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!"); 
    } 
} 
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, если оно будет работать, тогда я попробую это сделать. Я планирую реализовать оба, чтобы увидеть, что быстрее. Также реализация ErrorLevel для каждой библиотеки DLL или набора тестовых наборов будет отличной идеей. – Bangonkali

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"); 
    } 

А вот простой способ обновить все ваши испытания инициализации методы сразу, если их подпись то же самое, с помощью сопоставления регулярных выражений , визуальная студия заменить все: найти:

(\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().

 Смежные вопросы

  • Нет связанных вопросов^_^