50

我听说在开发使用数据库的应用程序时,您应该进行数据库单元测试。

数据库单元测试的最佳实践是什么?进行数据库单元测试时主要关注什么以及如何“正确”地进行测试?

4

8 回答 8

41

数据库单元测试的最佳实践是什么?

DbUnit框架(一个允许将数据库置于已知状态并对其内容执行断言的测试框架)有一个页面列出了数据库测试最佳实践,根据我的经验,这些实践是正确的。

进行数据库单元测试时的主要关注点是什么

  • 创建最新的架构,管理架构更改
  • 设置数据(参考数据、测试数据)和维护测试数据
  • 保持测试独立
  • 允许开发人员同时工作
  • 速度(涉及数据库的测试通常较慢,并且会使您的整个构建花费更多时间)

以及如何“正确”地做到这一点?

正如所暗示的,遵循已知的良好实践并使用专用工具/框架:

  • 如果可能,首选内存数据库(为了速度)
  • 每个开发人员必须使用一个模式(以允许并发工作)
  • 使用“数据库迁移”工具(à la RoR)来管理架构更改并将架构更新到最终版本
  • 构建或使用测试工具,允许在每次测试之前将数据库置于已知状态,并在执行之后对数据执行断言(或在测试结束时回滚的事务中运行测试)。
于 2010-09-22T18:17:16.523 回答
14

开始进行数据库单元测试时应审查和考虑的项目列表

  • 每个测试人员都需要一个单独的数据库,以避免干扰其他测试人员/开发人员的活动
  • 有一种简单的方法来创建要测试的数据库(这与将 SQL Server 数据库置于版本控制之下有关)。如果某些测试失败,这在尝试找出问题所在时特别有用
  • 专注于特定领域并为单个模块创建测试,而不是一次覆盖所有。细粒度地添加测试是提高效率的好方法
  • 确保在测试失败时提供尽可能多的详细信息,以便于调试
  • 对所有测试使用相同的测试数据

如果使用 tSQLt 框架实现测试,则在处理来自多个 SQL Server 实例的大量数据库时,单元测试过程可能会很复杂。为了直接从 SQL Server Management Studio 维护、执行和管理单元测试,可以使用ApexSQL 单元测试作为解决方案

于 2017-08-18T15:56:44.723 回答
11

看看这个链接。它介绍了在 SQL Server 中创建单元测试存储过程的一些基础知识,以及不同类型的单元测试以及何时应该使用它们。我不确定您使用的是什么 DBMS,但显然这篇文章是针对 SQL Server 的。

从文章中窃取:

功能测试

第一个也是最流行的数据库单元测试类是特性测试。在我看来,功能测试是从数据库使用者的角度测试数据库的核心功能——或者 API,如果你愿意的话。测试数据库的可编程性对象是这里的主线场景。因此,在我看来,测试数据库中的所有存储过程、函数和触发器构成了功能测试。要测试存储过程,您将执行存储过程并验证是否返回了预期的结果或发生了适当的行为。但是,您可以测试的不仅仅是这些类型的对象。例如,您可以想象要确保视图从计算列返回适当的计算。如你看到的,

模式测试

数据库最关键的方面之一是它的模式,并且测试以确保它按预期运行是另一类重要的数据库单元测试。在这里,您通常希望确保视图以适当的顺序返回适当数据类型的预期列集。您可能希望确保您的数据库确实包含您期望的 1,000 个表。

安全测试

在当今时代,存储在数据库中的数据的安全性至关重要。因此,另一类重要的数据库单元测试是测试数据库安全性的那些。在这里,您需要确保特定用户存在于您的数据库中,并且为他们分配了适当的权限。您经常需要创建否定测试,尝试从受限制的表或视图中检索数据,并确保适当地拒绝访问。

股票数据测试

许多数据库包含股票数据或种子数据。此数据很少更改,通常用作应用程序或最终用户的查找数据。邮政编码及其相关的城市和州是此类数据的绝佳示例。因此,创建测试以确保您的股票数据确实存在于您的数据库中是很有用的。

于 2010-09-22T17:52:29.730 回答
5

我很高兴您询问了单元测试,而不是一般测试。

数据库有许多需要测试的特性。一些例子:

  • 数据类型/大小/字符集(尝试插入瑞典名称,或来自现实世界的长 url 或数字,并查看您的列定义是否正常)
  • 触发器
  • 约束(外键、唯一性...)
  • 视图(检查数据是否正确包含/排除/转换)
  • 存储过程
  • UDF
  • 权限
  • ...

这不仅在您更改数据库中的某些内容时很有用,而且在您升级 dbms 或更改设置中的某些内容时也很有用。

通常,集成测试已完成。这意味着创建了一个使用 PHP 或 Java 等编程语言的测试套件,并且测试会发出一些查询。但是,如果某些事情失败了,或者有一些例外,就很难理解这个问题,原因有两个:

  • 问题可能出在您的 PHP 代码中,或者在 PHP 配置中,或者在网络中,或者...
  • 如果 SQL 语句嵌入到另一种编程语言中,则它们更难阅读和修改。

因此,在我看来,对于复杂的数据库,您需要使用用 SQL 编写的单元测试框架(使用存储过程和表)。您必须仔细选择它,因为这种工具没有被广泛使用(因此没有被广泛测试)。例如,如果您使用 MySQL,我知道这些工具:

于 2013-05-22T11:21:36.377 回答
3

我使用 junit/nunit/etc 并使用 java 或 c# 编写数据库单元测试。然后这些可以在集成服务器上运行,可能使用测试数据库的单独模式。

最新的 oracle sql 开发人员带有一个内置的单元测试框架。我看过这个但不会使用它。它使用 GUI 来创建和运行测试并将所有测试存储在数据库中,因此将测试用例置于版本控制之下并不容易。可能还有其他测试框架,我想它们可能特定于您的数据库。

良好实践类似于常规单元测试:

  • 将测试置于源代码控制之下
  • 让测试运行得很快——不要一次测试太多
  • 使您的测试可重现
于 2010-09-22T17:56:44.943 回答
2

看看 DBTestDriven 框架。它对我们很有用。从 GitHub 或他们的网站下载。

于 2014-11-07T21:56:27.240 回答
1

至于 JVM 开发,单元测试可以从 JDBC 抽象中受益:只要您知道哪些 JDBC 数据是由 DB 访问引发的,这些 JDBC 数据就可以“重放”。

因此,可以“复制”数据库访问案例以进行测试,而无需目标数据库:没有测试/数据隔离复杂性,易于持续集成。

我的框架 Acolyte 以这种方式是一个有用的框架(包括用于“记录”数据库结果的工作室 GUI 工具):https ://github.com/cchantep/acolyte

于 2014-01-06T09:26:23.113 回答
1

单元测试的应用可以让你确保一旦你写了一些东西,它就可以被验证,然后当它需要改变的时候,你可以验证所有之前通过的测试都会继续通过。无论您是公司中唯一的数据库人员,还是公司中有 1000 人。无论您有一个数据库还是 1000 个数据库。

这将使您确信您的更改将更加准确,并且不太可能破坏依赖您的代码的其他内容。毕竟,这将不可避免地帮助你在晚上睡觉,更多地享受你的假期,并对你的发展更有信心。

QA 工程师控制数据库测试中的视图和触发器,他们可以创建数据库的空白实例以使用最少的构建块开始。

以下是测试人员如何对数据库执行单元测试:

  • 该过程的第一步是创建一个空白数据库实例。您可以开始修改项目并添加新项目,直到它拥有测试所需的一切;
  • 如果我们可以自动化测试过程,以确保在每次测试运行之前数据库处于已知状态并在每次测试之后验证其当前状态,那将是最好的;
  • 您还可以查找由于意外删除或重命名对象而导致的丢失引用等问题,这通常是数据库更新失败的结果;
  • 应进行测试以确保在完成测试后恢复数据库。

现在数据库与应用程序代码有很大不同——它们需要更高的精度。必须定期对其进行测试,以避免破坏数据完整性等。

在执行单元数据库测试时我们应该记住:

  1. 单元测试可以自动化,您可以像执行代码一样轻松编写一组数据库操作;
  2. 单元测试非常适合测试单个触发器、视图和存储过程。您可以测试每个人的行为,以确保它按您希望的方式工作;
  3. 单元测试是创建数据库测试操作的可执行表示的绝佳方式,这样您就可以在推出新代码之前快速测试和验证它;
  4. 单元测试可以产生一致的结果。如果每个输入都被映射为测试的一部分,那么如果一切都按计划进行,您将清楚地了解可以预期的输出;
  5. 单元测试应该相互独立。您将不得不管理一些 setup 和 teardown,但测试不应与其他单元测试有任何关系。

在对 SQL 数据库执行单元测试时,有许多测试管理和测试自动化工具会很有帮助。我使用<a href="https://docs.microsoft.com/en-us/azure/data-factory/introduction" rel="nofollow noreferrer">数据工厂、aqua ALMMockup DataDTM Data Test发电机

于 2021-09-14T11:09:33.800 回答