了解最新技术文章
单元测试是一种自动化测试,通常由软件开发人员编写,它隔离代码的细粒度组件并对其进行独立测试。
考虑一个简单的例子。假设我们编写了一个方法 Add(int x, int y),用于将两个整数相加。
此方法的单元测试意味着调用 Add(2, 2) 并随后验证结果是否为 4。然后我们可以编写另一个 Add(2, -2) 单元测试并验证结果是否为零。
了解有关不同单元测试技术的更多信息。
单元测试是自动化的。单元测试框架执行验证并返回通过/失败判定。
单元测试是细粒度的。Add() 函数只是整个应用程序中的一个小齿轮,但我们单独测试它。
单元测试隔离他们的目标。我们不需要设置一堆应用程序设置、文件或全局变量来测试 Add()。
单元测试是确定性的。Add(2, 2) 每次运行时都会返回 4,可预测且重复。
单元测试是独立的。它们不依赖于任何其他单元测试的先前执行,也不具有任何顺序排序的概念。
单元测试需要遵循某些准则并且需要可维护。以下是良好的、可维护的单元测试的五个要素。
您的数据库是整个应用程序的关键部分。它不应该是测试盲点。
如果应用程序代码打开文件或连接到数据库,则违反了粒度、隔离和确定性原则。所以你模拟这些东西并从你的单元测试套件中省略它们。
那么,你如何测试它们呢?嗯,这就是集成测试的目的。您要特别注意应用程序代码的每个角落,然后将所有与数据库相关的测试问题放在集成测试的总标题下。
但你的数据库不重要吗?它们不是您的技术工作产品的一部分吗?难道他们不应该进行单元测试吗?
虽然对数据库进行单元测试可能不像单元测试应用程序代码那样常见或熟悉,但它是完全可以实现的!让我们看看如何。
您正在对数据库中各种表、视图、触发器、存储过程等的创建脚本进行源代码控制。从概念上讲,这使您能够采用空白数据库实例并单独创建这些因素的最小子集。从那里,您可以测试各种增量行为。
编写一个脚本,在开始单元测试之前清除数据库,然后使用预定义的数据集填充数据库并运行测试。您也可以在每次测试之前执行此操作;它会很慢,但不太容易出错。
确保数据库在每次测试运行之前处于已知状态,并在运行后使用断言逻辑验证状态。
您还可以查找由于意外删除或重命名对象而可能发生的丢失引用之类的问题,例如视图等模块仍在引用的列。
最后,确保测试执行后数据库恢复到原始状态。
这里有一些您可以采纳的好主意。
现在,数据库在某些关键方面与应用程序代码有着本质上的不同。您必须采取一些步骤,例如更加重视将数据库置于已知状态并确保每个开发人员都有数据库服务器的副本。但飞跃并不像你想象的那么大。
正如您不会编写自己的应用程序单元测试框架,因为已经存在大量这样的框架,数据库单元测试框架也是如此,即使它们并不那么出名。
这里有一些工具可供检查以启动您的研究。
数据库单元
DbUnit 在测试之间将数据库置于已知状态。DbUnit 是一个 JUnit 扩展,对于数据库驱动的项目很有用。您可以导入和导出数据库数据,并验证数据是否与指定的集合匹配。SQL服务器
SQL Server 支持数据库单元测试作为其功能套件的一部分。您可以创建一个测试项目并直接添加 SQL Server 单元测试,然后就可以进行处理。
SQL测试
SQL Test 是另一个在事务中运行数据库单元测试的工具。它稍后会回滚所有更改,因此您不需要任何清理代码。它使用开源 tSQLt 框架。 数据拟合
使用 DbFit,您可以执行测试驱动的数据库开发。您可以为数据库代码编写可读且可管理的单元测试。数据库测试驱动
DBTD 是一种用于数据库测试驱动开发的工具,它不仅可以帮助您创建易于管理的数据库单元测试,还可以为您提供代码覆盖率。它还与构建服务器集成以实现持续集成功能。
您也可以实现数据库中应用程序代码中单元测试的所有先决条件。
单元测试是自动化的。您可以像应用代码执行一样轻松地编写一组数据库操作脚本。
单元测试是细粒度的。您可以测试各个触发器、视图、存储过程等的行为。
单元测试隔离他们的目标。您可以仅处理数据库中所需的部分,而无需重新创建所有组件并填充所有数据。
单元测试是确定性的。如果您将架构和数据设置为测试的一部分,您将获得确定性的结果。
单元测试是独立的。当您将任何所需的设置和拆卸作为测试的一部分进行管理时,测试不需要有任何关系。
数据库单元测试不仅是可能的,而且是值得的。不要让您的数据库成为测试盲点。利用您现有的框架和工具立即开始数据库单元测试。而且,如果您想了解有关单元测试的更多信息,请查看帖子“单元测试的七宗罪”。