9

我刚刚开始进行单元测试,由于与数据库的交互,我看不到一个简单的方法来做很多测试用例。

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

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

我接近了吗?或者有更好的方法吗?

4

2 回答 2

14

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

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

于 2012-05-26T20:55:55.760 回答
4

就单元测试而言,我认为在实践中对你有用的都是可行的方法。单元测试给你一些价值并提高你的系统质量以及你开发和维护它的能力是很重要的。

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

您的单元测试代码本身可能应该用模拟您要为其编写单元测试的场景所需的数据填充您的测试数据库。几年前,我搞砸了一些 ruby​​ on rails 代码;测试框架将有一个测试类,它使用一些假数据设置数据库,然后将编写该类中的多个测试方法以针对该数据运行,而拆卸方法将擦除数据库中的数据。因此,不同的测试类(或者有时人们称它们为夹具)将针对特定的数据设置运行,这意味着您可以针对相同的数据设置运行多个测试,而不是为您想要运行的每个测试用例创建它。为每个测试设置数据最终可能会导致您的测试运行缓慢,以至于您厌倦了等待它们运行并停止打扰它们。

于 2012-05-26T21:10:59.907 回答