我是tdd的新手。我看过 Brandon Satrom 的视频。我正在尝试实现像它们这样的测试,用于验收测试的外循环和用于单元测试的内循环。我认为验收测试也是针对数据库的。所以我希望在 Specflow 中找到有关 [BeginScenario/AfterScenario] 事件的示例,用于数据库清理。据说它用于数据库清理。但是我看到的例子都没有。
我误解了验收测试的概念吗?它不也涵盖数据库吗?我们应该像在单元测试中那样使用模拟对象吗?
我是tdd的新手。我看过 Brandon Satrom 的视频。我正在尝试实现像它们这样的测试,用于验收测试的外循环和用于单元测试的内循环。我认为验收测试也是针对数据库的。所以我希望在 Specflow 中找到有关 [BeginScenario/AfterScenario] 事件的示例,用于数据库清理。据说它用于数据库清理。但是我看到的例子都没有。
我误解了验收测试的概念吗?它不也涵盖数据库吗?我们应该像在单元测试中那样使用模拟对象吗?
我在集成单元测试 (MSTest) 和验收测试中使用了真正的 MS SQL Server 数据库,并以这种方式使用 BDD 工具 SpecFlow:我有一个存储为模板的测试数据库(MDF/LDF 文件)的转储。在测试初始化时,我将它们复制到一个临时位置,使用 sp_attach_db 存储过程将它们附加到专用 SQL Server(您可以为此使用 Express 版本),然后我运行我想要的任何测试代码并在测试清理时分离测试数据库并删除 MDF/LDF 文件。整个复制/附加/分离/删除周期非常快(至少比我之前想象的要快得多)。如果你有兴趣,我可以在我的博客上多说几句。
最后我确信我必须在验收测试中使用真实的数据库。我必须先看一些例子,并从几个资源中阅读它,然后才能将其铭记于心。
现在我正在使用验收测试来测试我的用户界面和数据库的流程。我为我的注册页面写了一个快乐的路径场景来设计页面流程。然后我为保存在数据库中的存储过程中的逻辑编写了一些测试。其他逻辑在控制器和模型类上。所以对他们来说,我使用了单元测试。现在它对我来说更有意义,直到我对 tdd 的下一次困惑:)。
至于清理过程,我使用 [BeginScenario/AfterScenario] 事件。在 BeginScenario,我使用全局变量来保留 DateTime.Now.Ticks 值并将其合并到我发送到数据库的值的 beginnigs 中。然后,当我在 AfterScenario 事件中为该场景进行清理时,我会找到以此 DateTime.Now.Ticks 值开头的记录。所以它帮助我创造了不干扰其他记录的独特价值。它现在似乎工作了。
关于这件事,这篇文章,很有帮助。
它描述了事务在 MSDTC 中的使用,从 BeginScenario 开始,在 AfterScenario 回滚。(文章中没有使用SpecFlow,但其概念相同)
我们目前在一个中等规模的开发项目中成功地使用了这种技术。