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

Мы используем NUnit для выполнения интеграционных тестов. Эти тесты занимают много времени. Часто единственный способ обнаружить сбой - это таймаут.

Я бы хотел, чтобы тесты перестали выполняться, как только обнаружен один сбой.

Есть ли способ сделать это?

Ответ 1

Это, вероятно, не идеальное решение, но оно делает то, что вам нужно. Игнорируйте оставшиеся тесты, если тест не сработал.

[TestFixture]
    public class MyTests
    {
        [Test]
        public void Test1()
        {
            Ascertain(() => Assert.AreEqual(0, 1));
        }

        [Test]
        public void Test2()
        {
            Ascertain(() => Assert.AreEqual(1, 1));
        }

        private static void Ascertain( Action condition )
        {
            try
            {
                condition.Invoke();
            }

            catch (AssertionException ex)
            {
                Thread.CurrentThread.Abort();
            }
        }
    }

Так как TestFixtureAttribute наследуется, вы можете создать базовый класс с этим атрибутом, украшенным на нем, и иметь в нем защищенный метод Ascertain и получить из него все классы TestFixture.

Единственным недостатком, вам придется реорганизовать все существующие утверждения.

Ответ 2

Используя nunit-console, вы можете добиться этого, используя параметр командной строки /stoponerror.

См. здесь для ссылки в командной строке.

Ответ 3

Я использую NUnit 3, и для меня работает следующий код.

public class SomeTests {
    private bool stop;

    [SetUp]
    public void SetUp()
    {
        if (stop)
        {
            Assert.Inconclusive("Previous test failed");
        }
    }

    [TearDown]
    public void TearDown()
    {
        if (TestContext.CurrentContext.Result.Outcome.Status == TestStatus.Failed)
        {
            stop = true;
        }
    }
}

В качестве альтернативы вы можете сделать это абстрактным классом и получить от него.