首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速访问真实SQL Server数据库的集成测试

加速访问真实SQL Server数据库的集成测试
EN

Stack Overflow用户
提问于 2015-08-25 09:02:00
回答 1查看 1.2K关注 0票数 0

我的应用程序有一个业务层,它与数据库进行了大量的对话。这一层被实现为一堆用Dapper包装的Dapper调用。要初始化数据库模式,我首先使用Entity Framework 6代码,这有一个很好的副作用,即能够使用我的C# POCO作为DDL和DAO。

我在Dapper中使用的原始SQL是一些普通的旧SQL、一些用户定义的函数以及特定于SQL Server的东西的混合物,例如内置函数和全文索引。

在我的Jenkins构建中,我有一个集成测试套件,可以使用NUnit测试这一层。为了确保测试彼此隔离,数据库初始化应该在[SetUp]方法上进行。

我经历了几个实现集成测试的选项:

  1. 使用内存数据库。优点:测试设置快,运行测试逻辑快。缺点:这是一个非选项,因为我使用的SQL命令是特定于SQL Server的。
  2. 使用SQLiteSQL Compact。优点:语法类似于SQL Server,设置和拆卸只是删除文件的问题。缺点:当我开始使用用户定义的函数和全文索引的时候,也没有选择.
  3. 使用本地SQL Express服务器只为测试服务。优点:行为几乎保证与生产设置相匹配,包括内置函数和全文索引。缺点:设置更慢,更复杂。

我采用了备选方案3,采用了以下方法:

  1. [SetUpFixture][SetUp]上,初始化一个种子数据库。初始化后,创建这个数据库的备份,并将其保存为一个文件。这只会在整个测试名称空间上发生一次。
  2. 在每个[TestFixture][SetUp]上,恢复备份。因为每次运行测试之前都会发生这种情况,所以每个测试都与其他测试隔离。

缺点是现在运行测试套件变得非常缓慢。以上第二步每次测试需时2-5秒.最重要的是,每个测试也需要一些时间来执行测试夹具本身,这比典型的单元测试要慢一些,因为它访问了真实的数据库。

在我目前的状态下,一个包含143个测试的中等大小的测试套件在我的构建机器上需要13分钟,这是一个位于Azure上的VM,它被指定为A3 (4核7 GB),运行Windows 2008 R2。

除了向机器注入更多的硬件之外,我还能加快这个过程吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-25 10:49:34

您可以在安装过程中使用事务作用域,并在teardown方法中将其释放:

代码语言:javascript
复制
[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

嵌套范围内的投票 虽然嵌套作用域可以加入根作用域的环境事务,但在嵌套作用域中调用完全不影响根范围。只有当从根作用域到最后一个嵌套作用域的所有作用域都投票来提交事务时,事务才会被提交。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32199799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档