我对NUnit(以及一般的自动化测试)很新颖。我最近做了一些Ruby On Rails的工作,并注意到在我的测试套件中,当我创建对象(例如新用户)并在套件过程中提交它们时,它们从不提交到数据库,以便我可以运行一遍又一遍地测试,而不用担心用户已经存在。NUnit在测试后回滚
我现在试图在NUnit中完成同样的事情,但我不太清楚如何去做。我是否在Setup和Teardown块中创建一个事务?谢谢。
我对NUnit(以及一般的自动化测试)很新颖。我最近做了一些Ruby On Rails的工作,并注意到在我的测试套件中,当我创建对象(例如新用户)并在套件过程中提交它们时,它们从不提交到数据库,以便我可以运行一遍又一遍地测试,而不用担心用户已经存在。NUnit在测试后回滚
我现在试图在NUnit中完成同样的事情,但我不太清楚如何去做。我是否在Setup和Teardown块中创建一个事务?谢谢。
为什么要在单元测试期间与数据库交谈?这使得您的单元测试默认为集成测试。相反,为所有数据库通信创建包装,并在单元测试期间对其进行存根/模拟。那么你不必担心之前和之后的数据库状态。
现在,如果你不愿意重构这个级别:交易的问题是你需要一个开放的连接。因此,如果您的测试方法自行处理所有通信,那么注入一个您可以在安装时创建的事务并在拆解后回滚真的很困难。
我同意莫滕的答案,但你可能想看看关于这个问题的这个非常老的MSDN杂志文章在:Know Thy Code: Simplify Data Layer Unit Testing using Enterprise Services
也许你可以使用这个。这是丑陋的,但也许它可以为你工作:
namespace SqlServerHandling
{
[TestFixture]
public sealed class TestTransactionRollBacks
{
private string _connectionString = "Data Source = XXXDB; ; Initial Catalog = XXX; User Id = BLABLA; Password = BLABLA";
private SqlConnection _connection;
private SqlTransaction _transaction;
[SetUp]
public void SetUp()
{
_connection = new SqlConnection(_connectionString);
_transaction = _connection.BeginTransaction();
}
[TearDown]
public void TearDown()
{
_transaction.Rollback();
}
[Test]
public void Test()
{
Foo foo = new Foo(_connection);
object foo.Bar();
}
}
internal class Foo
{
private readonly SqlConnection _connection;
object someObject = new object();
public Foo(SqlConnection connection)
{
_connection = connection;
}
public object Bar()
{
//Do your Stuff
return someObject;
}
}
如果您的测试无法访问'SqlConnection','TransactionScope'可能比'SqlTransaction'更容易。请参阅http://stackoverflow.com/questions/321180/how-do-i-test-database-related-code-with-nunit – 2011-04-28 18:07:28
我使用SQLite进行单元测试,使用NHibenate。即使你不使用NHibernate,也应该可以这样做。 SQLite具有内存模式,您可以在内存中创建数据库并在其中保存数据。它速度很快,效果很好,您可以简单地扔掉并重新构建适合每个测试或夹具的模式。
您可以看到t he example from Ayende's blog以了解其完成的概况。他正在使用NHibernate,但这个概念应该与其他ORM或直DAL一起工作。
看到这个问题http://stackoverflow.com/questions/321180/how-do-i-test-database-related-code-with-ununit – 2011-04-28 18:04:29