bh2*_*213 41 .net nunit nunit-2.5
我们有一些访问数据库的NUnit测试.当其中一个失败时,它可能使数据库处于不一致状态 - 这不是问题,因为我们为每次测试运行重建数据库 - 但它可能导致其他测试在同一次运行中失败.
是否有可能检测到其中一个测试失败并执行某种清理?
我们不想在每个测试中编写清理代码,我们现在已经这样做了.我想在Teardown中进行清理,但只有在测试失败的情况下才能进行清理,因为清理可能很昂贵.
更新:澄清 - 我希望测试很简单,不包括任何清理或错误处理逻辑.我也不想在每次测试运行时执行数据库重置 - 仅在测试失败时.这个代码应该可以在Teardown方法中执行,但是我不知道有什么方法可以获取信息,如果测试我们目前正在从失败或成功中拆除.
Update2:
[Test]
public void MyFailTest()
{
throw new InvalidOperationException();
}
[Test]
public void MySuccessTest()
{
Assert.That(true, Is.True);
}
[TearDown]
public void CleanUpOnError()
{
if (HasLastTestFailed()) CleanUpDatabase();
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找HasLastTestFailed()的实现
小智 65
从版本2.5.7开始,NUnit允许Teardown检测上次测试是否失败.新的TestContext类允许测试访问有关自身的信息,包括TestStauts.
有关更多详细信息,请参阅http://nunit.org/?p=releaseNotes&r=2.5.7
[TearDown]
public void TearDown()
{
if (TestContext.CurrentContext.Result.Status == TestStatus.Failed)
{
PerformCleanUpFromTest();
}
}
Run Code Online (Sandbox Code Playgroud)
Iga*_*nik 20
这个想法让我感兴趣,所以我做了一点挖掘.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");
}
}
Run Code Online (Sandbox Code Playgroud)
属性的简单地:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public sealed class CleanupOnErrorAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)
这是从插件执行的方式:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这里是棘手的部分:必须将插件放在addinsNUnit跑步者旁边的目录中.Mine被放置在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在适当的地方.
一些注意事项:属性类可以放在代码中的任何位置.我不想将它放在与addin本身相同的程序集中,因为它引用了两个CoreNUnit程序集,因此我将它放在不同的程序集中.CleanAddin.cs如果您决定将其放在其他位置,请记住更改中的行.
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
17521 次 |
| 最近记录: |