单元测试你的SQL采取TDD太远了吗?

Bob*_*tor 25 sql tdd unit-testing

www.sqlservercentral.com上有一篇关于单元测试SQL的文章.

在我的TDD Guy说得好,我们可以测试数据库的东西.

我的系统架构师说,我们测试的逻辑是什么?数据库中不应该有任何逻辑,你应该在数据库中做的唯一事情就是选择,更新或插入.

因此,如果您觉得需要对SQL进行单元测试,那么您是否真的非常彻底,过于务实,还是设计气味的标志?

Bil*_*win 23

在大多数生活项目中,数据库在项目里程碑之间有一定的流动性.创建,删除或更改表和列.查找表已更新.而且您可能正在测试数据库的多个实例,因此在回归测试中对数据库中的元数据和数据状态进行一些验证是很好的.

有几种情况我建议测试数据库:

  • 表和视图:验证您希望存在的表和视图.验证这些表和视图是否包含您期望的列.您还可以验证您在此里程碑中删除的表,视图或列实际上是否不存在.

  • 约束:尝试执行应该被拒绝的数据更改.约束应该阻止这些变化.如果您发现约束不起作用的情况,您可以避免以后的错误.

  • 触发器:与约束相同,触发器也可用于级联效果,或转换值等.测试这些逻辑路径.

  • 存储过程:当在应用层中更容易开发,调试和维护逻辑时,我支持在数据库中放入过多逻辑的警告.但有些情况下有令人信服的理由使用存储过程.通常,您会看到通过将复杂的逻辑放入数据库来解决性能瓶颈.所以存储过程不会完全消失,测试它们是个好主意.

  • 引导数据:查找表是即使在"空"数据库中也需要存在的数据的示例.可以有其他例子.测试数据库是否包含所需数据.

  • 查询:您的应用程序代码包含SQL查询.测试它们的正常功能和性能.特别是性能 - 因为相同的查询有一天可以很好地运行并且在第二天成为瓶颈,因为数据量发生变化,索引变得不平衡等等.

  • ORM类:与触发器类似,应用程序中的ORM类可以包含用于验证,转换或监视数据库操作的逻辑.这些应该进行测试.

这些测试可能不会被称为"单元测试".单元测试是一种特定类型的测试,其中每个测试独立于其他测试,并且您尝试单独测试小单元代码.我会说测试数据库,上面列出的方法是功能测试的一个例子.


Jef*_*igg 12

您的SQL包含逻辑.例如,布尔条件检查"WHERE"子句.您能想到SQL可能出错的任何方式吗?如果是这样,测试SQL是否有意义,以确保不存在这些错误?

(例如,一些愚蠢的程序员,像我一样,在上面的评论中可能会意外地输入"WHILE"而不是"WHERE"!...就像我做的那样.但我后来纠正了它.那么我的stackoverflow测试在哪里?!?; - )

  • “而”?你是说“哪里”吗? (2认同)

DBA*_*rew 10

我同意系统架构师,如今太多的业务逻辑正在进入数据库.

  • 在理想世界中,但是一些商务功能可以处理大量数据.然后将数据发送到客户端,在客户端上进行处理并将数据发回太多,以至于需要将此功能移动到数据库中. (11认同)

Ed *_*urn 5

区分单元测试 /规格和集成测试 /规格.

如果你的课程都有,那么你就违反了一个合理的原则:分离问题.

您应该在单元测试之间明确定义测试,以测试持久性无知的POCO/POJO单元,如实体,服务和集成测试.这些用于测试应用程序击中金属的位置.

集成测试应该测试持久性机制(RBDMS),Active Directory,Exchange,文件系统和电子邮件等的持久性,例如存储库和工作单元实现.

如果您的用例需要彻底测试使用触发器的集成点,那么测试行为而不是显式触发器.将来您可以选择不使用触发器并使用ORM或AoP拦截器.