使用 specflow 在验收测试中清理数据库
Posted
技术标签:
【中文标题】使用 specflow 在验收测试中清理数据库【英文标题】:database clean up in acceptance tests with specflow 【发布时间】:2011-05-26 17:08:24 【问题描述】:我是 tdd 的新手。我看过 Brandon Satrom 的视频。我正在尝试实现像它们这样的测试,用于验收测试的外循环和用于单元测试的内循环。我曾认为验收测试也是针对数据库的。所以我希望在 Specflow 中找到关于数据库清理的 [BeginScenario/AfterScenario] 事件的示例。据说它用于数据库清理。但是我看到的例子都没有。
我是否误解了验收测试的概念?它不也涵盖数据库吗?我们应该像在单元测试中那样使用模拟对象吗?
【问题讨论】:
【参考方案1】:我在集成单元测试 (MSTest) 和使用 BDD 工具 SpecFlow 的验收测试中使用了真正的 MS SQL Server 数据库:我有一个存储为模板的测试数据库(MDF/LDF 文件)的转储.在测试初始化时,我将它们复制到一个临时位置,使用 sp_attach_db 存储过程将它们附加到专用 SQL Server(您可以为此使用 Express 版本),然后我运行我想要的任何测试代码并在测试清理时分离测试数据库并删除 MDF/LDF 文件。整个复制/附加/分离/删除周期非常快(至少比我之前想象的要快得多)。 如果你有兴趣,我可以在我的博客上多说几句。
【讨论】:
这似乎比清理创建的行更容易。我想试试。我会在你的博客上看到更多详细信息。 不要忘记事务范围可以最大限度地减少所需的清理工作。但这对于 staging 数据库来说仍然很好!【参考方案2】:最后我确信我必须在验收测试中使用真实的数据库。我必须先看一些例子,并从几个资源中阅读它,然后才能将其铭记于心。
现在我正在使用验收测试来测试我的用户界面和数据库的流程。 我为我的注册页面写了一个快乐的路径场景来设计页面流程。然后我为保存在数据库中的存储过程中的逻辑编写了一些测试。其他逻辑在控制器和模型类上。所以对他们来说,我使用了单元测试。现在它对我来说更有意义,直到我对 tdd 的下一个困惑:)。
至于清理过程,我使用 [BeginScenario/AfterScenario] 事件。在 BeginScenario,我使用全局变量来保留 DateTime.Now.Ticks 值并将其合并到我发送到 db 的值的 beginnigs 中。然后,当我在 AfterScenario 事件中为该场景进行清理时,我找到了以此 DateTime.Now.Ticks 值开头的记录。所以它帮助我创造了不干扰其他记录的独特价值。它现在似乎工作了。
【讨论】:
【参考方案3】:关于这件事,this的文章,很有帮助。
它描述了事务在 MSDTC 中的使用,从 BeginScenario 开始,在 AfterScenario 回滚。 (文中没有使用SpecFlow,但是是同一个概念)
我们目前在一个中型开发项目中成功使用了这种技术。
【讨论】:
对于使用事务来清理企业解决方案的自动化测试的数据库时,我会非常谨慎。如果您在代码中具有一致且经过深思熟虑的事务架构,那么您可能能够围绕此构建您的测试。如果您尝试在之后添加事务架构,您可能会遇到麻烦。例如,TransactionScope 不会升级事务级别,因此如果您包装了一个包含不同级别的(现在嵌套的)事务的测试,它将失败。您最好在新数据库上清理或执行集成测试。 好点!!!依赖于跟踪事务级别等的代码可能根本不是使用“MSDTC 在 AfterScenario 上回滚”技术的好主题。以上是关于使用 specflow 在验收测试中清理数据库的主要内容,如果未能解决你的问题,请参考以下文章