Настал момент, когда при написании автоматических тестов (C# + NUnit + Selenium Webdriver) у меня возникла необходимость получать результат прохождения теста, после его выполнения. Т.е. мне надо было узнать успешно тест прошёл, с ошибкой или игнорировалось выполнение, а также если тест завершился с ошибкой, то какая ошибка.

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

В итоге потратив энное количество времени я нашёл решение, которое сейчас и разберу.

У нас имеется структура тестов:

using System;
using NUnit.Framework;
using NUnit.Framework.Interfaces;
using System.Collections.Generic;

namespace WebTest
{
    [TestFixture()]
    public class TestRegress
    {
        public static Thread potok1;

        [OneTimeSetUp] // вызывается перед началом запуска всех тестов
        public void TestFixtureSetUp()
        {}

        [OneTimeTearDown] //вызывается после завершения всех тестов
        public void TestFixtureTearDown()
        {}

        [SetUp] // вызывается перед каждым тестом
        public void SetUp()
        {}

        [TearDown] // вызывается после каждого теста
        public void TearDown()
        {}

        [Test]
        public void DEBUG()
        {}
    }
}

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

[TearDown] // вызывается после каждого теста
public void TearDown()
{
	// проверяем статус выполнения текущего теста (вызывается в [TearDown])
	if (TestContext.CurrentContext.Result.Outcome == ResultState.Ignored) // если игнорируется тест и не выполняется (для этого, если нужно, в коде теста пишется "Assert.Ignore()"), то... 
	{
		// КОД (что делать, если тест игнорировался)
	}
	if ((TestContext.CurrentContext.Result.Outcome == ResultState.Failure) || (TestContext.CurrentContext.Result.Outcome == ResultState.Error)) // тест завершён с ошибкой
	{
		string error = TestContext.CurrentContext.Result.Message + "\n" + TestContext.CurrentContext.Result.StackTrace; // получить сообщение и стектрейс
		// КОД (что делать, если тест завершён с ошибкой)
	}
	if (TestContext.CurrentContext.Result.Outcome == ResultState.Success) // тест завершён успешно
	{
		// КОД (что делать, если тест завершён успешно)
	}
}

Получив данные прохождения теста, вы можете уже делать что угодно. Следующим тестом можно проверить все три состояния (поочерёдно раскомментируем требуемую строку):

[Test]
public void DEBUG()
{
	// игнорируем данный тест
	// Assert.Ignore();
	
	// вызываем ошибку
	// Assert.True((2 + 2) == 5, "Произвольное сообщение ошибки, которое мы хотим видеть")
	
	// тест пройдёт успешно
	// Assert.True((2 + 2) == 4)
}

На текущий момент этот код работает с NUnit 3.8.1