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

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

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

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

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

4b9b3361

Ответ 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;
        }
    }
}

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