关于自动化单元/集成测试的 SSDT 开发过程和最佳实践的提示

Posted

技术标签:

【中文标题】关于自动化单元/集成测试的 SSDT 开发过程和最佳实践的提示【英文标题】:Tips on SSDT development process and best practices regarding automated unit / integration tests 【发布时间】:2013-05-28 21:43:43 【问题描述】:

我现在在几个论坛、博客、MSDN 等上搜索了几天,但到目前为止我找不到关于这个主题的任何指导。我将尝试以更详细的方式解释这篇文章,因为我认为 SSDT 开发的信息和文档没有得到很好的记录,并且不存在像 VS 2010 数据库项目 (http://vsdatabaseguide.codeplex.com/) 这样的最佳实践文档。

我是一名 C# 开发人员(没有 DBA),我们正处于一个绿色项目(10 到 15 名开发人员)的开发阶段的开始,我们目前正在定义我们的开发流程,包括处理数据库开发。

我们要使用的技术和工具链:

EF 5(模型优先,也许我们先将其更改为数据库,因为视图、索引等问题更容易处理) SSDT(SQL Server 数据工具) VS 2012 / TFS 2012 用于自动化单元/集成测试的 MS 测试

开发过程基于测试驱动开发,如下所示:

    每个功能都由一个开发人员在单独的功能分支上开发 设计和实施单元测试(=功能实施) 如果某项功能需要访问数据库,则开发人员必须 a) 创建/更新 EF 模型 b) 通过 EF 的“从模型生成数据库”创建 localDB 数据库 c) 通过模式比较创建/更新 SSDT 项目 d) 使用创建新数据库并根据每个测试的测试数据的测试初始化​​方法创建单元测试 将功能分支合并回集成分支 签入合并后,CI 构建将执行单元/集成测试

所以有些问题我不是 100% 确定如何解决它们(尤其是使用单元测试处理数据库),如果您能指引我正确的方向,我将不胜感激:

    如何解决自动化单元测试的数据库创建问题:

    a) 为每个执行的测试方法执行 SQL 数据库生成脚本(之前可以通过 SSDT 发布功能手动创建)?这是我更喜欢的选项,因为每个测试都有一个干净且一致的数据库状态。为每个测试创建 localdb 数据库是否存在性能问题?

    b) 还是使用 msbuild 任务“SQLPublish”或“sqlPackage.exe”?我认为这不是一个选择,因为这将是一次性的事情,我想为每个单元测试创​​建一个新的测试数据库。

    c) 还是手动创建测试数据库并将 *.mdf 文件保存到源代码管理文件夹的根目录并为每个测试创建一个副本?但我不喜欢这样,因为开发人员 A 可以覆盖该文件,该文件可能具有来自之前签入他的更改的另一个开发人员 B 的更改。这意味着开发人员

    如何解决自动化单元测试的测试数据创建问题:

    a) 执行测试特定的 SQL 脚本,为每个测试插入适当的测试数据。我认为这也意味着创建一个新数据库,如第 1 点所述。这也是我的首选。

    b) 或者使用 EF 创建测试数据似乎不是一种干净的方式,因为这取决于 EF 模型实现,实际上应该通过功能单元测试隐式测试。

    c) 或者使用手动创建的测试数据库文件。但这会使开发人员的开发过程更加复杂。这也可能被其他开发人员签入覆盖。

也许可以提一下我们对单元测试的期望。我们单元测试的目标不是像存储过程等那样测试数据库模式。我们希望使用“代码”单元测试来测试我们应用程序的部分功能,也可以将其视为集成测试。

那么你们中的任何人都有类似的开发过程吗?你们的经验是什么? 有什么建议可以改进我们的开发流程吗? 是否有任何关于 SSDT 开发的资源或最佳实践文档? 对我来说最重要的问题是,你是如何解决自动化单元测试的,包括正确的数据库处理和集成测试?

【问题讨论】:

最初的直觉 - 首先使用 DB 而不是使用纯 EF 模型。在关系数据库中,您将不太可能使用“面向对象”的表结构。从头开始完全创建数据库需要多长时间取决于您加载的数据量。对于 #1,我倾向于“A”,但请记住,如果您愿意,可以将“调试”实例从 (localdb) 更改为实际的 SQL Server。如果您愿意,您也可以每次都发布一个新数据库。 “C”是一个糟糕的选择。 #2 - 我也倾向于这里的“A”。可以查看 TSQLUnit 或类似选项。 也许应该在programmers.stackexchange.org 或dba.stackexchange.org 上询问这个问题。不过,在那里漫游的眼球较少。 我的第一反应是你应该聘请一位数据库专家。我不会让数据库专家设计我的应用程序,让应用程序开发人员设计数据库是不负责任的。并且永远不要使用 EF rto 设计数据库!!!!!!!!! 只是一个注释,而不是一个答案:我在 Visual Studio 2013 中使用 SSDT 进行单元测试。我在测试的预测试脚本中创建每个测试所需的数据。测试项目设置为在测试之前部署数据库,所以我得到一个更新的数据库,然后是必要的测试数据。我已经开始使用 MERGE 语句来确保数据符合要求。 【参考方案1】:

当您需要数据库时,它不是单元测试。对于与实体框架结合的单元测试,您应该使用伪造的 dbcontext。

【讨论】:

不正确。 SSDT 提供了一个特性,允许对数据库模块进行真正的单元测试——函数和存储过程。在发布错误答案之前,您应该了解这一点。 SSDT 单元测试功能无法初始化数据库?

以上是关于关于自动化单元/集成测试的 SSDT 开发过程和最佳实践的提示的主要内容,如果未能解决你的问题,请参考以下文章

关于验收测试的困惑

python自动化测试

Flask之单元测试

单元测试方法以及实例

Gitlab CI 持续集成的完整实践

tSQLt + SSDT 集成到 Jenkins