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