更新:2007 年 11 月
在本演练中,已经创建了一个数据库项目并将其置于版本控制之下。该数据库项目包含的架构定义与成品服务器的架构定义相匹配。在该数据库项目的开发工作开始之前,要通过设置数据库单元测试、定义数据生成计划、生成测试数据和运行这些测试来建立质量基线。测试运行将生成数据库并将其部署到您的独立开发环境中,用生成的数据填充数据库,并执行单元测试来报告结果。
本演练涉及以下任务:
如何为独立开发环境自定义生成设置
如何生成数据库并将其部署到独立开发环境中
如何为数据库项目包含的存储过程定义单元测试
如何生成测试数据以及生成和运行单元测试
如何通过将单元测试作为解决方案的一部分置于版本控制之下,从而与开发团队共享单元测试
先决条件
必须已安装 Visual Studio Team System Database Edition 并且具有对 Microsoft SQL Server 2005 的 AdventureWorks 示例数据库的访问权限。此外,还必须已经完成 演练:创建独立数据库开发环境 中的步骤。
为独立开发环境自定义生成设置
如果 AdvWorksSandbox 解决方案已在“解决方案资源管理器”中打开,则转至步骤 4。
在“文件”菜单上,指向“打开”,然后单击“项目/解决方案”。
将出现“打开项目”对话框。
单击 AdvWorksSandbox 解决方案,然后单击“打开”。(默认情况下,此解决方案位于“我的文档\Visual Studio 2005\Projects\AdvWorksSandbox”中。)
AdvWorksSandbox 解决方案将在“解决方案资源管理器”中打开。
在“解决方案资源管理器”中单击“AdvWorksSandbox”节点。
在“项目”菜单上,单击“AdvWorksSandbox 属性”。
单击“生成”选项卡。
单击“目标连接”旁边的“编辑”。
随即出现“连接属性”对话框。
在此对话框中可为本地独立开发环境自定义连接字符串。推荐的过程是每个数据库开发人员在自己的数据库副本中工作,这允许他们进行更改,而不会对团队的其余成员产生不利影响。当开发人员已对更改进行了测试并准备将其与团队共享时,他们会通过中央版本控制系统来共享更改。在 演练:创建独立数据库开发环境 中,设置了目标数据库名称,但未设置连接。
键入或单击要用于独立开发环境的服务器的名称。例如,要使用本地实例,应键入 (local)。
单击要用来连接数据库服务器的身份验证类型。
默认情况下会指定 Windows 身份验证。
单击“确定”。
目标连接会显示连接信息。
在“文件”菜单上,单击“保存选定项”,以保存对数据库项目属性的更改。
生成数据库并将其部署到独立开发环境中
在“生成”菜单上,单击“生成解决方案”。
将生成数据库项目,而且结果会显示在“输出”窗口中。
在“解决方案资源管理器”中单击“AdvWorksSandbox”节点。
在“生成”菜单上单击“部署 项目名称”。还可以右击“AdvWorksSandbox”节点,再单击“部署”。
将生成数据库项目,产生一个生成脚本,然后将该脚本部署到在数据库项目属性中指定的独立数据库开发服务器中。接下来将要为独立开发环境生成测试数据。
定义单元测试
通常,您会为所有存储过程、函数和触发器定义单元测试。在本演练中,您只定义一个单元测试作为示例。您为 ufnLeadingZeros 函数和 dbo.uspGetManagerEmployees 存储过程定义一个测试。
ufnLeadingZeros 函数接受一个整数,并返回该整数的填充了前导零的 VARCHAR(8) 字符串表示形式。若要测试此函数,可以传入一个值,并测试是否可以获得预期结果。
向 uspGetManagerEmployees 存储过程传递一个员工标识符,它会返回具有指定标识符的经理管理的所有员工(完整层次结构)。由于在给定相同的种子值时数据生成器将生成相同的测试数据,因此可以知道应返回的行数。此测试非常简单。在实际项目中,您将要创建更详细的测试,验证是否返回了符合标准的员工。
创建单元测试
在“视图”菜单上单击“架构视图”。
如果尚未显示“架构视图”,则会显示该视图。
在“架构视图”中右击“存储过程”文件夹,再单击“创建单元测试”。
随即出现“创建单元测试”对话框。
展开“当前”选择树,并选择存储过程 dbo.uspGetManagerEmployees 和函数 dbo.ufnLeadingZeros 对应的复选框。清除选择的任何其他存储过程或函数对应的复选框。
说明:
若要为项目建立实际基线,需要为数据库中的所有函数、存储过程和触发器创建单元测试。本演练重点介绍一个存储过程和一个函数来演示该过程。
在“项目”中单击“创建新的 Visual C# 测试项目…”。
在“新项目名称”中键入“AWSandboxTestProject”,然后单击“确定”。
将创建单元测试项目,并且会显示单元测试的“项目配置”对话框。
在“数据库连接”中单击 AdvWorksSandbox 的连接。
在“部署”中,选择“在运行测试前自动部署数据库项目”复选框。
在“数据库项目”中单击“AdvWorksSandbox.dbproj”。
在“数据库状态”中,选择“在运行单元测试前生成测试数据”复选框。
在“数据库状态”列表中单击“AWGenPlan.dgen”。
如果尚未选择“在生成测试数据前清除数据库”复选框,请选择它,然后单击“确定”。
将创建数据库单元测试项目并将其添加到解决方案中。此时会打开“数据库单元测试设计器”,以便您修改测试条件并创作测试。
说明:
如果必须修改测试配置,请打开“测试”菜单,然后单击“数据库测试配置”。将出现“项目配置”对话框,您可以更改配置。
接下来您将指定测试条件并编写测试。
为 ufnLeadingZeros 函数定义单元测试
在“数据库单元测试设计器”中的测试列表中单击“dbo.ufnLeadingZeros”。
验证第二个列表是否显示“Test”。
将设计器上窗格中的 Transact-SQL (T-SQL) 语句替换为以下内容:
-- db unit test for dbo.ufnLeadingZeros DECLARE @RC VARCHAR (8), @Value INT SELECT @RC = NULL, @Value = 27 SELECT @RC = [dbo].[ufnLeadingZeros]( @Value) IF @RC <> '00000027' RAISERROR(N'ufnLeadingZero: expected "00000027" but got %s.', 16, 1, @RC) SELECT RC=@RC
在“测试条件”窗格中,单击类型为“没有结论”的测试条件,并通过单击“删除测试条件”(x) 将其删除。
通过在“测试条件”窗格中的列表中单击“行数”,再单击“添加测试条件”(+) 来添加行数测试条件。
在“属性”窗口中,将“行数”属性设置为 1。
如果要强制使测试失败,请将 @Value 从 27 更改为其他值。
为 uspGetManagerEmployees 存储过程定义单元测试
在“数据库单元测试设计器”中的测试列表中,单击“dbo.uspGetManagerEmployees”。
验证第二个列表是否显示“Test”。
设计器上窗格中的 Transact-SQL (T-SQL) 语句应包含以下内容:
-- db unit test for dbo.uspManagerEmployees DECLARE @RC VARCHAR (8), @ManagerID INT SELECT @RC = NULL, @ManagerID = 1 EXEC @RC = [dbo].[uspGetManagerEmployees]( @ManagerID ) SELECT RC=@RC
在“测试条件”窗格中,单击类型为“没有结论”的测试条件,并通过单击“删除测试条件”(x) 将其删除。
通过在“测试条件”窗格中的列表中单击“行数”,再单击“添加测试条件”(+) 来添加行数测试条件。
在“属性”窗口中,将“行数”属性设置为 11。
说明:
若要确定存储过程的参数值和预期结果,可能要使用 Transact-SQL (T-SQL) 编辑器并在数据生成之后检查 [HumanResources].[Employee] 表的内容。在这种情况下,EmployeeID 为 1 的员工位于包含 11 个人的层次结构的顶部。因此,该存储过程应返回 11 行数据。只要使用相同种子值来生成测试数据,就应该在每次运行时获得相同数据。
现在,已做好运行单元测试的准备工作。
生成和运行单元测试
既然已经定义了单元测试,您就可以生成和运行这些测试了。
生成和运行单元测试
在“解决方案资源管理器”中右击解决方案节点,再单击“重新生成解决方案”。
此步骤强制重新生成数据库项目和单元测试项目,以保证所有内容都是最新的。
在“测试”菜单上,指向“窗口”,然后单击“测试视图”。
“测试视图”窗口将列出若干测试。默认情况下会创建名为 ManualTest1 和 TestMethod1 的测试。名为 dbo_uspGetManagerEmployeesTest 和 dbo_ufpLeadingZeroTest 的测试是在本演练中创建的测试。
选择 dbo_uspGetManagerEmployeesTest 和 dbo_ufpLeadingZeroTest 对应的复选框,右击这两个复选框当中的任意一个,再单击“运行选定内容”。
在“测试结果”窗口中查看结果。
数据库项目将部署到独立开发环境中,并生成测试数据,然后将运行和通过其余测试。
签入挂起的更改
既然您已经定义了用于检测更改是否破坏数据库的单元测试,便可签入测试并与团队共享解决方案了。
与团队共享解决方案
在“视图”菜单上,指向“其他窗口”,然后单击“挂起的更改”。
将出现“挂起的更改”窗口。
在“注释”中键入“定义的数据生成计划和基线单元测试”。
在“挂起的更改”窗口中,单击工具栏上的“签入”。
将数据库项目及其中包含的文件置于版本控制之下时,将出现“签入进度”对话框。“解决方案资源管理器”中的图标将更新,以表明文件已签入到版本控制中。
后续步骤
既然您已经将解决方案签入到版本控制中,每个团队成员便可以处理为其分配的任务了。每个人可在自己的独立数据库开发环境中工作,直到其更改可以共享为止。在 演练:在独立环境中执行迭代数据库开发 中,您使用重构在独立开发环境中重命名数据库对象。在签入更改之前,您生成、部署和测试这些更改,以便其他团队成员可以与更改同步。