我的应用程序有一个业务层,它与数据库进行了大量的对话。这一层被实现为一堆用Dapper包装的Dapper调用。要初始化数据库模式,我首先使用Entity Framework 6代码,这有一个很好的副作用,即能够使用我的C# POCO作为DDL和DAO。
我在Dapper中使用的原始SQL是一些普通的旧SQL、一些用户定义的函数以及特定于SQL Server的东西的混合物,例如内置函数和全文索引。
在我的Jenkins构建中,我有一个集成测试套件,可以使用NUnit测试这一层。为了确保测试彼此隔离,数据库初始化应该在[SetUp]方法上进行。
我经历了几个实现集成测试的选项:
SQL Server的。SQLite或SQL Compact。优点:语法类似于SQL Server,设置和拆卸只是删除文件的问题。缺点:当我开始使用用户定义的函数和全文索引的时候,也没有选择.SQL Express服务器只为测试服务。优点:行为几乎保证与生产设置相匹配,包括内置函数和全文索引。缺点:设置更慢,更复杂。我采用了备选方案3,采用了以下方法:
[SetUpFixture]的[SetUp]上,初始化一个种子数据库。初始化后,创建这个数据库的备份,并将其保存为一个文件。这只会在整个测试名称空间上发生一次。[TestFixture]的[SetUp]上,恢复备份。因为每次运行测试之前都会发生这种情况,所以每个测试都与其他测试隔离。缺点是现在运行测试套件变得非常缓慢。以上第二步每次测试需时2-5秒.最重要的是,每个测试也需要一些时间来执行测试夹具本身,这比典型的单元测试要慢一些,因为它访问了真实的数据库。
在我目前的状态下,一个包含143个测试的中等大小的测试套件在我的构建机器上需要13分钟,这是一个位于Azure上的VM,它被指定为A3 (4核7 GB),运行Windows 2008 R2。
除了向机器注入更多的硬件之外,我还能加快这个过程吗?
发布于 2015-08-25 10:49:34
您可以在安装过程中使用事务作用域,并在teardown方法中将其释放:
[MyFixture]
public class MyTests
{
private string connString= "...";
private TransactionScope ts= null;
[SetUp]
public void SetUp()
{
ts = new TransactionScope(TransactionScopeOption.Required);
}
[TearDown]
public void TearDown()
{
ts.Dispose();
}
[Test]
public void MyTest()
{
// do my tests etc.
using (SqlConnection conn = new SqlConnection(connString))
{
using (SqlCommand cmd = new SqlCommand("exec MyProcecure"))
{
cmd.Connection = conn;
conn.Open();
int retval = cmd.ExecuteNonQuery();
Assert.Greater(retval, 0);
}
}
}
}编辑--即使被测试的单元有它自己的事务范围,它也能工作。
请参阅MSDN
嵌套范围内的投票 虽然嵌套作用域可以加入根作用域的环境事务,但在嵌套作用域中调用完全不影响根范围。只有当从根作用域到最后一个嵌套作用域的所有作用域都投票来提交事务时,事务才会被提交。
https://stackoverflow.com/questions/32199799
复制相似问题