【问题标题】:Rollback database after integration (Selenium) tests集成(Selenium)测试后回滚数据库
【发布时间】:2010-10-20 14:47:02
【问题描述】:

对于回滚由 Selenium 等集成测试框架生成的数据库事务的最佳实践或首选方式,是否有人有任何建议?

这是我们目前的情况:我们有一个 .net Web 项目,其中包含许多在我们的单元测试环境中运行良好的单元测试 - 每个测试都继承一个父类,该父类在 [SetUp] 中打开一个事务,并回滚[TearDown] 中的交易。每次测试后,我们的单元测试数据库都会恢复到原始状态。

但是,一旦我们进入集成环境,情况就会发生变化。我们的持续集成服务器会自动编译我们的提交并将它们推送到测试服务器,以便服务器始终运行在最新的代码上。我们还设置了一个 Selenium 实例来自动化用户与站点的交互。 selenium 测试基本上与现有的 Selenium 服务器进行通信,并告诉服务器诸如“启动浏览器并转到 http://testsite/TestPage.aspx - 在 id 为 'def' 的表单字段中输入文本 'abc' - 断言新页面包含文本 'xyz '"

每个测试都以与我们的普通单元测试类似的方式运行,但有一个重要的例外:Selenium 所做的任何更改都是在完全不同的线程/应用程序中完成的,因此我们不能(我*认为我们可以't,至少)在测试拆解中回滚它们。

我们还没有找到一个好的解决方案。现在我们正在使用 SqlCommand 执行 sql 语句来备份数据库,然后在测试结束时,我们将数据库设置为单用户,删除当前数据库并恢复旧副本 - 这不太理想,因为这有效地杀死了附加到数据库的应用程序,并要求我们再次重新初始化应用程序。

这是以前解决过的问题吗?任何建议都会很棒。

谢谢!

【问题讨论】:

    标签: .net testing selenium integration-testing


    【解决方案1】:

    我们在每次测试之前运行一个 drop/create-table 脚本。这是相当快的,并确保以前的测试没有留下任何东西。

    PS:我们正在使用 NHibernate,它会动态创建此脚本并在内存中的 Sqlite 上运行测试,它的速度非常快。但是如果我们切换到 SqlServer,它仍然很快。

    【讨论】:

    • 感谢 Stefan,这似乎是最好的解决方案 - 我们只是在每次测试后截断表格并重新加载固定装置,这并不是真正的 征税,而且它似乎运作良好。再次感谢!
    • 在 oracle 上截断非常快,因为您无法回滚此操作。在我们的情况下脚本很简单,脚本已经可用,我们不需要维护其他东西。
    • 这个脚本是否在每个测试方法或测试用例之前运行?我会假设每个测试方法....这个脚本是如何运行的?后端有服务 API 吗?
    • 它在每个测试方法之前运行。它由非常易于使用的 NHibernates SchemaExport 类运行。它根据映射文件创建表。
    【解决方案2】:

    这是一个棘手的问题,而且每个应用的解决方案通常都是独一无二的。在主要框架采用“推荐方法”之前,这将继续是一个痛苦。

    我的最佳建议是:在您的应用开始时就计划好这种用法。包括在从应用程序下方重置数据库后清理的 API(即:重置缓存)。

    【讨论】:

      【解决方案3】:

      有一个名为Amnesiamore docsrecent code)的项目是专门为这种情况设计的。它简化了using the MSDTC TransactionScope to rollback test changes 的流程。 (使用将需要在大多数应用程序中对数据访问进行适度侵入性更改,尤其是那些尚未使用 MSDTC 的应用程序。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多