Эта идея заинтересовала меня, поэтому я немного покопался. NUnit не имеет этой возможности из коробки, но есть целая инфраструктура расширяемости, поставляемая с NUnit. Я нашел эту замечательную статью о расширении NUnit - это была хорошая отправная точка. Поэкспериментировав с этим, я нашел следующее решение: метод, украшенный пользовательским атрибутом CleanupOnError
, будет вызван, если один из тестов в приборе не пройден.
Вот как выглядит тест:
[TestFixture]
public class NUnitAddinTest
{
[CleanupOnError]
public static void CleanupOnError()
{
Console.WriteLine("There was an error, cleaning up...");
// perform cleanup logic
}
[Test]
public void Test1_this_test_passes()
{
Console.WriteLine("Hello from Test1");
}
[Test]
public void Test2_this_test_fails()
{
throw new Exception("Test2 failed");
}
[Test]
public void Test3_this_test_passes()
{
Console.WriteLine("Hello from Test3");
}
}
где атрибут просто:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public sealed class CleanupOnErrorAttribute : Attribute
{
}
А вот как это выполняется из надстройки:
public void RunFinished(TestResult result)
{
if (result.IsFailure)
{
if (_CurrentFixture != null)
{
MethodInfo[] methods = Reflect.GetMethodsWithAttribute(_CurrentFixture.FixtureType,
CleanupAttributeFullName, false);
if (methods == null || methods.Length == 0)
{
return;
}
Reflect.InvokeMethod(methods[0], _CurrentFixture);
}
}
}
Но вот сложная часть: надстройка должна быть помещена в каталог addins
рядом с бегуном NUnit. Мой был помещен рядом с бегуном NUnit в каталоге TestDriven.NET:
C:\Program Files\TestDriven.NET 2.0\NUnit\addins
(я создал каталог addins
, его там не было)
РЕДАКТИРОВАТЬ Другое дело, что метод очистки должен быть static
!
Я взломал простой плагин, вы можете скачать исходный код с my SkyDrive . Вам нужно будет добавить ссылки на nunit.framework.dll
, nunit.core.dll
и nunit.core.interfaces.dll
в соответствующих местах.
Несколько замечаний: класс атрибута может быть размещен в любом месте вашего кода. Я не хотел помещать его в ту же сборку, что и само дополнение, потому что он ссылается на две сборки Core
NUnit, поэтому я поместил его в другую сборку. Просто не забудьте изменить строку в CleanAddin.cs
, если вы решите поместить ее в другое место.
Надеюсь, это поможет.