如何进行数据库单元测试?

时间:2010-09-22 17:43:26

标签: database unit-testing database-testing

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

7 个答案:

答案 0 :(得分:36)

  

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

DbUnit框架(允许将数据库置于已知状态并对其内容执行断言的测试框架)有一个页面列出数据库测试best practices,根据我的经验,这是真的

  

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

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

如何做到“正确”?

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

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

答案 1 :(得分:12)

在开始使用数据库单元测试时应该检查和考虑的项目列表

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

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

答案 2 :(得分:10)

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

文章被盗:

  

功能测试

     

第一个也许是最普遍的   数据库单元测试类是一个   功能测试。在我看来,功能   测试核心功能或API,   如果你愿意 - 你的数据库来自   数据库消费者的观点。   测试数据库的可编程性   对象是这里的主线方案。   所以,测试所有存储过程,   你的内部的功能和触发器   数据库构成功能测试   我脑海。要测试存储过程,   你会执行存储过程   并验证是否是预期的   结果被退回或   发生了适当的行为   但是,您可以测试的不仅仅是   这些类型的对象。您可以   想象想要确保一个视图,   例如,返回适当的   从计算列计算。如   你可以看到,这可能性   境界很大。

     

架构测试

     

一个最关键的方面   数据库是它的架构,并进行测试   确保它的行为符合预期   另一个重要的数据库类   单元测试。在这里,你经常会想要   确保视图返回   预期的一组列   适当的数据类型   适当的顺序。你可能想要   确保您的数据库在   事实上,包含1000个表   你期待。

     

安全测试

     

在今天这个时代,安全   存储在数据库中的数据   数据库至关重要。因此,另一个   重要的数据库单元测试类   是那些测试数据库的人   安全。在这里,你会想要   确保存在特定用户   你的数据库和它们   分配了适当的权限。   你经常想创造负面的   尝试检索数据的测试   来自受限制的表格或视图   确保访问权限   适当否认。

     

股票数据测试

     

许多数据库包含库存数据,或   种子数据。这个数据有所变化   不常用,经常用作   查找应用程序或结束的数据   用户。邮政编码及其相关信息   城市和州是很好的例子   这类数据。因此它是   有用的创建测试,以确保   事实上,您的库存数据确实存在   在你的数据库中。

答案 3 :(得分:4)

我很高兴你问过单元测试,而不是一般的测试。

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

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

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

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

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

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

答案 4 :(得分:3)

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

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

良好做法与常规单元测试类似:

  • 将测试置于源代码管理下
  • 使测试运行得快 - 不要测试 一次太多
  • 进行测试 再现的

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

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

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

相关问题