Подтвердить что ты не робот

Как остановить выполнение тестов MsTest при первом сбое?

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

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

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

Спасибо!

4b9b3361

Ответ 1

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

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

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


Тем не менее, взломать исправление в ваших тестовых библиотеках не так уж сложно. У всех возможных кодов ошибок теста статическая переменная StopAssert.Failed = true; (возможно, путем обнуления вызовов на Assert и catching 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);
    }
}