时间:2010-05-04 12:29:42

标签: sql-server database sql-server-2005 unit-testing sql-server-2008

如何对T-SQL进行单元测试?您使用哪些库/工具?

单元测试涵盖了多少百分比的代码,如何衡量? 您如何确定首先进行单元测试的模块?

您认为您在单位测试线束上投入的时间和精力是否得到了回报?

如果您不使用单元测试,可以解释原因吗?

5 个答案:

答案 0 :(得分:20)

如何对T-SQL进行单元测试?您使用哪些库/工具?

请查看此TSQLUnit和此tSQLt

我已尝试在许多语言中使用一些不同的框架来测试T-SQL,例如junit或nunit。我走这条路的原因是为了利用这些其他语言的丰富测试环境。例如,如果您使用nunit,它有一个很好的命令行和gui查看器来查看测试的状态,因为您使用.net来编写测试,它很容易挂钩到sql server。 JUnit与许多商业和开源IDE环境(如NetBeans和IDEA)进行了很好的集成,并使T-SQL测试更像Java代码测试,这非常丰富。否定的是你不仅要编写T-SQL,还要编写java或.net来测试你的T-SQL。

我还使用了Ruby with Rake(它就像make或ant),并对sqlcmd进行了系统调用,以执行sql脚本,这些脚本在转换包含的测试中。脚本将值和字符串返回给ruby以通过或未通过测试。我最喜欢这种方法,因为它非常精简,容易让其他人接受。上面提到的其他路由要求开发人员使用.net或java,如果你有所有DBA类型可能很难克服,使用sql脚本方法的ruby更容易从我的经验中销售。 DBA类型往往是开放的,并且能够轻松地获取类似语言的脚本,并且Ruby具有较低的学习曲线,并且脚本相对于.net或java类易于运行。

单元测试涵盖了多少百分比的代码,如何衡量?

可能只有20%只是因为大多数数据库系统历史上都没有为它们创建测试,所以我正在创建复制过程中积极添加测试并添加测试,因为新的缺陷和增强功能出现了。

您认为您在单位测试工具上投入的时间和精力是否得到了回报?

数据库是大多数企业的基础。在我看来,它总是得到回报。如果您的企业容忍客户的垃圾和高故障率,那么没有任何测试可能不值得,因为它不是免费的。

如果您不使用单元测试,可以解释原因吗?

我很乐意看到是否有人想出一个不荒谬的答案。有点像你为什么不把你的孩子放在汽车座椅上开车道路......“他们花了太多钱”......“花太多时间把孩子放进去”......“没有它,他是安全的“......”有什么可能出错的理由“......”没有足够的时间“所有这些都是bs。

是的,我知道可能有点极端,但是如果你有一个系统并且它带来了公司价值,它应该联合测试,以帮助在问题成为生产问题之前解决。单元测试不是灵丹妙药,但它是我们必须尽力做到的一个工具。

总而言之,大多数人都会在结构化测试方面为数据库提供免费通行证。我不知道为什么会这样,但我已经在公司后见过它了。我很乐意看到这种变化。

答案 1 :(得分:5)

答案 2 :(得分:2)

与常规代码一样,T-SQL中的某些内容必须以不同于其他内容的方式进行测试。如果您编写代码生成大量静态内容(如触发器或视图),通常测试负载会更轻。

我们的特定系统几乎完全用T-SQL编码。

如何对T-SQL进行单元测试?您使用哪些库/工具?

我们已经知道我们比较的好结果。在我们的月度分析运行中,我们逐月比较并运行以了解代码和数据更改的影响。我们的主要工具是存储过程,它将比较两个表/视图/子集并识别差异(使用阈值选项)。

单元测试涵盖了多少百分比的代码,如何衡量?

我们根据历史行为验证大多数流程中生成的数据。在根据业务需求进行代码更改时,将执行影响分析,比较两次运行的输出。我们还非常依赖异常报告来提前确定数据是否符合预期/配置(模式中的约束)。

您认为您在单位测试工具上投入的时间和精力是否得到了回报?

如果您不使用单元测试,可以解释原因吗?

我们的单元测试是在我们的每个“过程”级别。每个进程通常对应一个存储过程 - 这就是我们测试的单元。比较最终输出将与系统测试相对应。

答案 3 :(得分:1)

我们最近从T-SQL单元切换到Visual Studio 2010单元测试框架。最大的抱怨是我们需要在测试中管理自己的事务范围,以便为下一个测试留下数据库“干净”。这是T-SQL单元在开始时提供的东西。

我们的目标是为我们的存储过程提供100%的覆盖率。它使我们能够根据需要更改基础表结构和关系,而无需与开发完全锁定(我们拥有独立的数据和开发团队)。我们还没有开始测量测试覆盖率。我们正在使用这种技术堆栈开发我们的第一个生产部署。对我们来说,应用程序和数据之间的接口是存储过程。首先,我们构建足够的存储过程以满足应用程序团队的需求,然后一旦签名变得足够稳定以实现持续集成,那么我们将构建单元测试。我们想要做TDD,但我们有一个截止日期,这使得这不是一个实用的选择。

我们没有测量测试工具的投资回报率,但经验告诉我们,生产数据库的更改成本非常高。

答案 4 :(得分:1)

如何对T-SQL进行单元测试?您使用哪些库/工具?

tSQLt 100%

单元测试覆盖了代码的百分之几,您如何衡量?您如何确定首先要对哪些模块进行单元测试?

某些项目100%,多数更少:)

我编写了一个由redgate赞助的T-SQL代码覆盖工具,该工具包含在他们的sql测试产品中:

https://github.com/GoEddie/SQLCover

您认为在单元测试工具上投入的时间和精力是否有回报?

是100%,每次我进行测试时,它都能帮助我们更快地行动。每次没有测试,都会使我们放慢速度。

如果您不使用单元测试,可以解释为什么不这样做吗?

我发现人们无法对他们的代码进行单元测试是无法解释的:)