这个想法引起了我的兴趣,所以我做了一点挖掘。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 运行器旁边的目录中。我的放在 TestDriven.NET 目录中的 NUnit runner 旁边:
C:\Program Files\TestDriven.NET 2.0\NUnit\addins
(我创建了addins
目录,它不存在)
编辑另一件事是清理方法需要static
!
我拼凑了一个简单的插件,你可以从我的 SkyDrive下载源代码。您必须在适当的位置添加对nunit.framework.dll
和nunit.core.dll
的引用。nunit.core.interfaces.dll
一些注意事项:属性类可以放在代码中的任何位置。我不想把它和插件本身放在同一个程序集中,因为它引用了两个Core
NUnit 程序集,所以我把它放在不同的程序集中。CleanAddin.cs
如果您决定将其放在其他任何地方,请记住更改 中的行。
希望有帮助。