2013-04-08 3 views
13

Мы запускаем ночные сборки, которые в конце запускают весь наш UnitTest, используя фреймворк MsTest.Как остановить выполнение тестов MsTest при первом сбое?

Мы должны иметь 100% пропускную способность, поэтому, если один из них не работает, нет смысла запускать другие; поэтому мы хотим остановить выполнение первого неудавшегося теста.

В любом случае мы сможем достичь этого?

+0

Я, имеющего одна и та же проблема: – Zambonilli

ответ

0

Вы действительно уверены, что хотите отбросить результаты теста?

Скажите, что у кого-то плохой день, и вводит в код несколько ошибок A, B и C. Вы можете узнать об A в понедельник, поэтому вы это исправите, и вы не знаете о проблеме B до вторника, а затем вы не исправите C до среды. Но поскольку вам не хватало тестового покрытия в течение половины недели, ошибки, введенные в понедельник, не были обнаружены до тех пор, пока они не были представлены, и это дороже и занимает больше времени, чтобы исправить их.

Если вам не нужно много времени проводить тесты после сбоя, разве это не полезно?


Это говорит о том, что взломать исправление в ваших тестовых библиотеках не так уж сложно. Был ли вся возможная codepaths неудачи теста установить статические переменную StopAssert.Failed = true; (возможно, обернув звонки Assert и ловить AssertFailedExceptions. Затем просто добавить [TestInitialize()] метод для каждого тестового класса, чтобы остановить каждый тест после сбоя!

public class StopAssert 
{ 
    public static bool Failed { get; private set; } 

    public static void AreEqual<T>(T expected, T actual) 
    { 
     try 
     { 
      Assert.AreEqual(expected, actual); 
     } 
     catch 
     { 
      Failed = true; 
      throw; 
     } 
    } 

    // ...skipping lots of methods. I don't think inheritance can make this easy, but reflection might? 

    public static void IsFalse(bool condition) 
    { 
     try 
     { 
      Assert.IsFalse(condition); 
     } 
     catch 
     { 
      Failed = true; 
      throw; 
     } 
    } 
} 


[TestClass] 
public class UnitTest1 
{ 
    [TestInitialize()] 
    public void Initialize() 
    { 
     StopAssert.IsFalse(StopAssert.Failed); 
    } 

    [TestMethod] 
    public void TestMethodPasses() 
    { 
     StopAssert.AreEqual(2, 1 + 1); 
    } 

    [TestMethod] 
    public void TestMethodFails() 
    { 
     StopAssert.AreEqual(0, 1 + 1); 
    } 

    [TestMethod] 
    public void TestMethodPasses2() 
    { 
     StopAssert.AreEqual(2, 1 + 1); 
    } 
} 

[TestClass] 
public class UnitTest2 
{ 
    [TestInitialize()] 
    public void Initialize() 
    { 
     StopAssert.IsFalse(StopAssert.Failed); 
    } 

    [TestMethod] 
    public void TestMethodPasses() 
    { 
     StopAssert.AreEqual(2, 1 + 1); 
    } 

    [TestMethod] 
    public void TestMethodFails() 
    { 
     StopAssert.AreEqual(0, 1 + 1); 
    } 

    [TestMethod] 
    public void TestMethodPasses2() 
    { 
     StopAssert.AreEqual(2, 1 + 1); 
    } 
} 
+0

У кого-нибудь есть способ сделать это с настройками конфигурации? У нас есть много кода, который нужно будет изменить :( – Steve

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