单元测试 - 数据库和固定装置

时间:2012-05-26 20:54:41

标签: unit-testing testing mocking

我刚刚开始进行单元测试,并且由于与数据库的交互,无法通过简单的方法来执行大量测试用例。

是否存在单元测试的标准方法/流程,其中需要数据库访问(读取和写入)才能断言测试?

到目前为止,我能想到的最好的方法是使用一个配置文件来使用不同的数据库连接来引导我的应用程序,然后使用启动方法将实时数据库复制到一个单独用于测试的数据库? / p>

我关门了吗?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:10)

您的业务逻辑不应直接与数据库交互。相反,它应该通过一个数据访问层,您可以在单元测试的上下文中伪造和模拟。查看模拟框架来为您进行模拟。您的测试根本不应该依赖于数据库。相反,您应该明确指定从数据访问层返回的数据,然后确保您的业务逻辑与该信息正确运行。

测试程序是否与附加的数据库一起工作更多是集成测试,而且这些测试与它们相关的成本很高。它们较慢(因此每次编译时都很难运行它们),而且更复杂(因此它们需要更多的时间和精力来维护)。如果你能够进行更简单的单元测试,我建议你先做。稍后您可以添加可能使用数据库的集成测试,但您可以通过首先添加更简单的单元测试获得最大价值。

答案 1 :(得分:3)

就单元测试而言,我认为在实践中对你有用的东西是要走的路。重要的是,单元测试可以为您提供一些价值并提高系统质量以及开发和维护系统的能力。

我建议您可能不希望将实时数据库复制到测试数据库。可能无法保证您的实时数据库将包含合适的数据,这些数据将导致您的单元测试始终如一地运行。单元测试应测试您的代码是否有效,他们不应该测试实时数据库是否包含导致它们通过的合适数据,因为实际上,您的用户可能会更改其内容以使您的测试失败

您的单元测试代码本身可能应该使用所需的数据填充您的测试数据库,该数据模拟您要为其编写单元测试的方案。几年前,我在轨道上用一些红宝石搞砸了;该测试框架将有一个测试类,它使用一些假数据设置数据库,然后编写来自该类的多个测试方法来针对该数据运行,并且拆除方法将擦除数据库中的数据。因此,不同的测试类(或者有时人们称之为固定装置)会针对某个数据设置运行,这意味着您可以针对相同的数据设置运行多个测试,而不是为您想要运行的每个测试用例创建它。为每个测试设置数据最终可能导致测试运行缓慢,这样您就会厌倦等待它们运行并停止对它们的打扰。