我正在寻找一个项目/工具,它将在测试之前将数据插入到数据库中,并在测试运行后将其回滚。Rails Fixtures是否有.net等价物?
我知道在轨道上是Ruby有YAML赛程,所以我希望有一个项目在那里为.NET项目。
我正在寻找一个项目/工具,它将在测试之前将数据插入到数据库中,并在测试运行后将其回滚。Rails Fixtures是否有.net等价物?
我知道在轨道上是Ruby有YAML赛程,所以我希望有一个项目在那里为.NET项目。
我使用的SQL Server Compact Edition和再生每次数据库的新副本(简单地复制初始数据库是罚款),如果在只读模式下使用的多个测试就可以共享同一个数据库文件。
有几个陷阱,并且不支持可编程性,但它很适合我需要它的基础知识。这也是惊人的快速。
我实现了Rails的样夹具一个基本的例子为.NET我的博客上。
http://www.davidmuto.com/Blog.muto/View/rails-like-fixtures-for-net
有什么好?
有几个很好的方法把数据提供给在.NET测试。一种是使用NUnit内置的功能,例如参数化测试和理论。
的TestCaseAttribute让您轻松在下面的例子中从nunit.org提供硬编码的数据,以测试为:
[TestCase(12,3, Result=4)]
[TestCase(12,2, Result=6)]
[TestCase(12,4, Result=3)]
public int DivideTest(int n, int d)
{
return(n/d);
}
的TestCaseDataAttribute让你得到更多的花哨提供数据(例如从数据库返回数据)。
经常使用的另一个技巧是靠交易。基本上,在测试之前开始一个交易,然后回滚。这甚至可以使用基类来自动化,所以你的测试根本不处理事务。例如,你可能有一个基类的测试夹具类似如下:
public class TestBase
{
private TransactionScope _transacation;
[SetUp]
public virtual void InitializeTest()
{
//NOTE: Base class TestInitialize methods are called before test Initialize methods in derived class.
// Setup a DB transcation to roll everything back after the tests.
if (_transacation != null)
throw new Exception("old transacation still exists");
// Give a long timeout on this transacation for debugging...
_transacation = new TransactionScope(TransactionScopeOption.RequiresNew, TimeSpan.FromSeconds(60));
}
[TearDown]
public virtual void CleanupTest()
{
// Roll all the changes made during the test back.
_transacation.Dispose();
_transacation = null;
}
}
由于在基类中的TestInitialize装饰方法被称为派生类前 TestInitialize方法,你甚至可以添加一些数据到你父类的TestInitialize方法中的数据库。
父类可能看起来像:
[TestFixture]
public class MyClassTests : TestBase
{
[TestFixtureSetUp]
public void InitializeUnit()
{
//Setup mocks...
}
[SetUp]
public override void InitializeTest()
{
base.InitializeTest();
// Add test data to database
}
[Test]
public void RealTest()
{
...
}
}
灯具是添加Rails的功能。与“测试夹具”这个术语不同,它表示一组共享常用设置或拆卸代码的xUnit测试。 – Gishu 2009-02-24 15:04:19
这是正确的。我发现怎么单词“固定”在.NET – 2009-02-24 15:32:22