我听说,在开发使用数据库的应用程序时,您应该进行数据库单元测试。数据库单元测试中的最佳实践是什么?进行数据库单元测试以及如何进行“正确”时,主要问题是什么?

有帮助吗?

解决方案

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

dbunit 框架(一个测试框架允许将数据库放在知道状态并对其内容执行断言)的页面列表数据库测试 最佳实践 就我而言,这是真的。

进行数据库单元测试时,主要问题是什么

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

以及如何做“正确”?

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

  • 如果可能的话,请在内存数据库中(速度)
  • 每个开发人员使用一个模式是必须的(允许并发工作)
  • 使用“数据库迁移”工具(ROR)来管理模式更改并将模式更新为最终版本
  • 构建或使用测试线束,允许在每个测试前将数据库置于已知状态,并在执行后对数据进行断言(或在测试结束时回滚的交易中运行测试)。

其他提示

使用数据库单元测试凝视时应审查和考虑的项目列表

  • 每个测试仪都需要一个单独的数据库,以避免干扰其他测试仪/开发人员的活动
  • 要有一种简单的方法来创建要测试的数据库(这与在版本控制下具有SQL Server数据库有关)。当一些测试失败时,这是特别有用的
  • 专注于特定区域并为单个模块创建测试,而不是一次覆盖全部。详细添加测试是提高效率的好方法
  • 确保在测试失败时提供尽可能多的细节,以便更轻松的调试
  • 在所有测试中使用一个和相同的测试数据

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

看一眼 这个链接. 。它涉及一些基础知识,用于在SQL Server以及不同类型的单元测试以及何时使用它们中创建单元测试存储的ProC。我不确定您正在使用什么DBM,但显然本文适用于SQL Server。

从文章中窃取:

功能测试

数据库单元测试的第一个也是最普遍的类是功能测试。在我看来,功能测试从数据库消费者的角度测试数据库的核心功能(如果愿意的话)。测试数据库的可编程性对象是这里的主要方案。因此,测试数据库内的所有存储过程,功能和触发器都构成了我脑海中的功能测试。要测试存储过程,您将执行存储过程,并验证是否返回预期结果或发生适当的行为。但是,您不仅可以测试这些类型的对象。您可以想象要确保视图(例如,从计算的列)返回适当的计算。如您所见,该领域的可能性很大。

模式测试

数据库中最关键的方面之一是其架构,并进行测试以确保其行为预期是另一类重要的数据库单元测试。在这里,您通常需要确保一个视图以适当的顺序返回适当数据类型的预期列集。您可能需要确保您的数据库实际上包含您期望的1000张表。

安全测试

在当今时代,数据库中存储的数据的安全性至关重要。因此,另一个重要的数据库单元测试是测试数据库安全性的测试。在这里,您将要确保数据库中存在特定用户,并为他们分配适当的权限。您通常需要创建负面测试,以试图从限制表或视图中检索数据,并确保适当拒绝访问权限。

库存数据测试

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

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

数据库具有许多需要测试的功能。一些例子:

  • 数据类型/大小/字符集(尝试插入瑞典名称,或从现实世界中插入长URL或数字,看看您的列定义是否还可以)
  • 触发器
  • 对抗(外国钥匙,独特性...)
  • 视图(检查数据是否正确包含/排除/转换)
  • 存储程序
  • UDFS
  • 权限
  • ...

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

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

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

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

我使用Junit/nunit/etc以及使用Java或C#的数据库单元测试。然后,这些可以在Integration Server上运行,也许可以使用单独的模式到测试数据库。

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

良好的做法类似于常规的单位测试:

  • 将测试放在源控制下
  • 进行快速运行的测试 - 不要一次测试太多
  • 使您的测试可重现

看看DBTEST驱动的框架。它对我们有好处。从Github或他们的网站下载它。

至于JVM开发,单位测试可以从JDBC抽象中受益:一旦您知道通过DB访问筹集哪些JDBC数据,这些JDBC数据就可以“重播”。

因此,可以“复制” DB访问情况进行测试,而无需目标DB:无测试/数据隔离复杂性,轻松连续集成。

我的框架辅助物是这样有用的框架(包括“记录” DB结果的Studio GUI工具): https://github.com/chantep/acolyte

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top