这个想法让我很感兴趣,所以我进行了一些探索。NUnit并没有原生支持这种功能,但是它提供了一个完整的可扩展性框架。我找到了这篇关于扩展NUnit的好文章 - 它是一个很好的起点。在尝试过后,我得到了以下解决方案:用自定义CleanupOnError
属性装饰的方法将在测试套件中的任何一个测试失败时被调用。
下面是测试的样子:
[TestFixture]
public class NUnitAddinTest
{
[CleanupOnError]
public static void CleanupOnError()
{
Console.WriteLine("There was an error, cleaning up...");
}
[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);
}
}
}
但是这里有个棘手的问题:插件必须放在与NUnit运行器相邻的addins
目录中。我把它放在了TestDriven.NET目录下的NUnit运行器旁边:
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
中的代码行。
希望这可以帮到你。