【IT168 技术文档】很多年来,开发人员一直在享受测试驱动开发(TDD,Test-Driven Development)所带来的便利。无论使用什么语言,现在都能轻松找到合适的工具——NUnit、JUnit以及为Perl、Python、Ruby、Delphi或其他语言所设计的各种各样xUnits框架。但是到了实现数据库逻辑的时候,我们的选择余地就少了许多。于是当他们真的希望做单元测试的时候,许多人只好选择自行开发单元测试的解决方案。
不过随着Visual Studio 2005的发布,SQL Server开发人员在这个问题上的境遇已经改变了。作为Visual Studio Team System的一部分,其为数据库专家所设计的版本(官方命名为“Visual Studio 2005 Team Edition for Database Professionals”)已经发布了,它为以下几个问题提供了答案:
真正的数据库表现形式储存在什么地方。
如何让开发人员修改数据库架构,并且将这些更新以标准化的形式发送给DBA以供审批。
如何修改数据库架构(例如重命名一个数据列),并且让整个数据库都能了解这次改变所带来的影响。
如何对存储过程进行单元测试,包括如何为这些测试生成数据。
虽然前三点非常重要——它们已经为团队解决了许多问题——但是第四点经常被忽视。因为单元测试和数据生成已经成为DBPro的头等公民,开发人员能够将存储过程与他们的测试驱动开发周期集成在一起。这给团队提供了强大的能力和自信来确定自己的系统运行良好,同时也能更深入地了解系统在数据库架构改变之后所受到的影响。
在我们探究使用DBPro进行测试驱动开发的方法之前,让我们先了解一下开发人员是如何在单元测试框架的帮助下创建业务逻辑的。假设我们有个需求是计算一个订单的折扣,折扣方式如下所示:
0到99.99美元 => 没有折扣
100到299.99美元 => 2%的折扣
300到999.99美元 => 4%的折扣
1000美元以上 => 7%的折扣
使用Visual Studio.NET,我们可以先创建一个测试项目并且编写业务逻辑的测试代码。我们编写的第一个测试可能是这样的:
而我们可以这样实现CalculateDiscountFor方法:
然后我们就可以修改测试代码和方法实现,直到完全满足以上的折扣策略。然而,这意味着如果我们要改变折扣策略,就需要重新编译代码,至少也需要修改配置文件。
如果这段逻辑存储在一个数据表里,那么我们可以将订单的价格传入一个存储过程,然后在表中查询折扣数量。不过,当我们着手创建表格和存储过程时,很快就会遇到一些问题。这个表格的结构是怎么样的?我们该如何表示一个范围的最低值和最高值?如何处理边界情况?
这正是DBPro的单元测试功能试图回答的问题。让我们来看一下如何使用测试驱动的方式,在SQL Server中创建表格和存储过程并实现这个功能。如果您想随着以下的步骤一起进行试验,那么您需要安装Visual Studio 2005/2008 with Team Edition for Database Professionals (DBPro),以及Team Edition for Testers/Developers。您能够在http://msdn2.microsoft.com/en-us/teamsystem/default.aspx下载到180天试用版本。