我正在尋找一個項目/工具,它將在測試之前將數據插入到數據庫中,並在測試運行後將其回滾。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