对nunit很失望
很多人都介绍了.net下开发的十个必备工具,其中单元测试工具就是nunit。不知道有多少人对它有实际的项目经验;我经过一段时间的使用,对它的一个缺陷很恼火,下面详细介绍一下:
在数据库相关项目的单元测试代码中,需要测试增删改的功能;然而这会使各种功能测试互相影响,破坏测试数据库,产生垃圾数据,使每次单元测试运行在一个未知的状态下,总之是一件很糟糕的事情。
针对这种情况,通常的解决方案是准备一个测试用数据库,每次单元测试结束后,还原这个数据库,这只能称为一种办法,但不漂亮。
我通过查阅资料,发现了另外的一种很clean的解决方案:“利用com+的自动事务!”
基本处理方法是这样的:
1、写一个从ServicedComponent继承的类,声明TransactionOption.Required,并在TearDown方法中回滚事务,具体代码如下
using System;
using NUnit.Framework;
using System.EnterpriseServices;
namespace TransactionTesting
{
[TestFixture]
[Transaction(TransactionOption.Required)]
public class DatabaseFixture:ServicedComponent
{
[TearDown]
public void TransactionTearDown()
{
if(ContextUtil.IsInTransaction)
{
ContextUtil.SetAbort();
}
}
}
}
using NUnit.Framework;
using System.EnterpriseServices;
namespace TransactionTesting
{
[TestFixture]
[Transaction(TransactionOption.Required)]
public class DatabaseFixture:ServicedComponent
{
[TearDown]
public void TransactionTearDown()
{
if(ContextUtil.IsInTransaction)
{
ContextUtil.SetAbort();
}
}
}
}
2、修改原有的单元测试代码,使所有的测试都从刚刚写好的类继承
看了这个方法后,我非常激动,真是nice啊!可是经过仔细测试,却发现nunit对这个方法的支持非常不好,运行时会抛出很多异常,难道反射调用com+存在天生的缺陷?(我没看nunit的代码,瞎猜的)