BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

使用tSQLt进行SQL Server单元测试

| 作者 Jenni Konrad 关注 0 他的粉丝 ,译者 侯伯薇 关注 0 他的粉丝 发布于 2012年2月14日. 估计阅读时间: 7 分钟 | AICon 关注机器学习、计算机视觉、NLP、自动驾驶等20+AI热点技术和最新落地成功案例。

tSQLt是一种用于在SQL Server中进行单元测试的免费开源框架。开发者可以编写tSQLt测试案例,从而基于生产数据创建虚拟的表和视图,然后将期望值与实际的测试结果进行比较。测试是用T-SQL编写的,因此可以直接在SQL Server Management Studio中创建。

使用tSQLt,开发者就能够拥有测试案例本身创建的数据,而不需要基于生产数据库的副本或者需要单独维护的测试数据库来测试。所有测试都在事务中执行,这有助于减少清理的工作。tSQLt测试可以逻辑分组到名为test classes的数据库schema中。

安装这个框架很简单;下载了tsQLt之后,用户首先需要在数据库上启用CLR。

EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;

执行tSQLt文件夹中的Example.sql脚本会创建演示数据库。(想要把tSQLt安装到另一个数据库中,你需要运行ALTER DATABASE,并加上SET TRUSTWORTHY ON声明)。

下一步是设置test class,其中会包含多个测试案例。这也只是创建新的schema:

EXEC tSQLt.NewTestClass 'AcceleratorTests';
GO

这些工作完成之后,就可以创建测试案例了;以下是一个示例。所有测试案例的名称都需要以“test”开头,并遵循SQL Server存储过程的命名规则。这个示例创建了一个测试表,然后插入数据,并调用了函数GetStatusMessage。tSQLt函数AssertEquals会根据期望值检查实际的结果,如果匹配的话,测试就通过了。

CREATE PROCEDURE [AcceleratorTests].[test status message includes the number of particles]
AS
BEGIN
  --Assemble: Fake the Particle table to make sure it is empty and that constraints will not be a problem
  EXEC tSQLt.FakeTable 'Accelerator.Particle';
  --          Put 3 test particles into the table
  INSERT INTO Accelerator.Particle (Id) VALUES (1);
  INSERT INTO Accelerator.Particle (Id) VALUES (2);
  INSERT INTO Accelerator.Particle (Id) VALUES (3);
  --Act: Call the GetStatusMessageFunction
  DECLARE @StatusMessage NVARCHAR(MAX);
  SELECT @StatusMessage = Accelerator.GetStatusMessage();

  --Assert: Make sure the status message is correct
  EXEC tSQLt.AssertEqualsString 'The Accelerator is prepared with 3 particles.', @StatusMessage;
END;

当执行这个测试案例的时候,结果会以文本形式显示(或者可以选择以XML格式输出):

+----------------------+
|Test Execution Summary|
+----------------------+

|No|Test Case Name                                                          |Result 
+--+------------------------------------------------------------------------+-------+
|1|[AcceleratorTests].[test status message includes the number of particles]|Success|
-------------------------------------------------------------------------------
Msg 50000, Level 16, State 10, Line 1
Test Case Summary: 1 test case(s) executed, 1 succeeded, 0 failed, 0 errored.
-------------------------------------------------------------------------------

一旦在测试类中创建了大量测试案例,我们就可以使用EXEC tSQLt.RunAll来批量运行。想要获得更多开始使用tSQLt的信息,你可以访问tSQLt教程

如果你想要把SQL单元测试作为持续构建过程的一部分,那么可以把tSQLt与Cruise Control集成。正如之前在InfoQ中曾经报道过的,有一个针对tSQLt的可视化界面叫做SQL Test。tSQLt与SQL Server 2005 SP2及更高版本兼容。

查看英文原文:SQL Server Unit Testing with tSQLt

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT