Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 单元测试-数据库和夹具_Unit Testing_Testing_Mocking - Fatal编程技术网

Unit testing 单元测试-数据库和夹具

Unit testing 单元测试-数据库和夹具,unit-testing,testing,mocking,Unit Testing,Testing,Mocking,我刚刚开始进行单元测试,由于与数据库的交互,我看不到一种简单的方法来做很多测试用例 在需要数据库访问(读写)才能断言测试的情况下,是否有标准的单元测试方法/过程 到目前为止,我能想到的最好方法是使用一个配置文件,使用不同的db连接引导我的应用程序,然后使用启动方法将live db复制到单独用于测试的db 我接近了吗?或者有更好的方法吗?您的业务逻辑不应该直接与数据库交互。相反,它应该经过一个数据访问层,您可以在单元测试的上下文中伪造和模拟该层。查看模拟框架,为您进行模拟。您的测试根本不应该依赖于

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

在需要数据库访问(读写)才能断言测试的情况下,是否有标准的单元测试方法/过程

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


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

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


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

就单元测试而言,我认为无论在实践中对您有效还是可行。单元测试为您提供一些价值并提高系统的质量以及开发和维护系统的能力,这一点很重要

我建议您可能不想将live db复制到测试db。可能无法保证您的实时数据库将包含适当的数据,这些数据将导致您的单元测试持续运行。单元测试应该测试您的代码是否正常工作,而不应该测试活动数据库是否恰好包含导致其通过的适当数据,因为当它处于活动状态时,您的用户可能会更改它的内容,从而导致您的测试失败


您的单元测试代码本身可能应该使用所需的数据填充测试数据库,以模拟您要为其编写单元测试的场景。几年前,我把一些RubyonRails代码弄得一团糟;这方面的测试框架将有一个测试类,该类使用一些虚假数据设置数据库,然后该类中的多个测试方法将被编写为针对该数据运行,而分解方法将从数据库中删除数据。因此,不同的测试类(或有时人们称之为fixture)将针对特定的数据设置运行,这意味着您可以针对同一数据设置运行多个测试,而不是为您想要运行的每个测试用例创建测试。为每个测试设置数据可能会导致您的测试运行缓慢,从而使您对等待测试运行感到厌倦,不再为它们烦恼。

严格来说,这不再是单元测试。这将是一个集成测试,集成测试有很多与之相关的成本。例如,它们要慢得多,复杂得多。OP可能应该首先尝试实现单元测试,这取决于单元之间的界限在哪里。你必须从你的程序中切掉一些孤立的功能来测试它们。可以是表达式、语句、函数、函数集、类等。基本上。。。无论你觉得什么都能让你得到最大的回报。我同意传统的观点,单元测试应该在一个过程中测试东西;类级测试似乎是面向对象语言的惯例。学术上定义的单元测试看起来确实是一件好事,但是如果编写和维护单元测试最终花费的时间比它们带来的好处要多,那么就需要进行更好的平衡。我准备放宽单元测试的定义。:)嗨,奥列斯基,谢谢。这是有道理的,尽管在我的情况下,应用程序与数据库紧密耦合。这是一个定制的电子商务购物车。有很多情况需要访问数据库,例如,向购物中添加项目需要将其存储在数据库中等,因此我不确定如何进行模拟that@user1189880在我看来,进行测试的一大好处是,它迫使您重构代码,使其更易于测试。如果你能重构你的代码,从长远来看,你会过得更好。如果出于任何原因无法重构,我会创建一个不同的数据库实例,在每个测试运行之前清除并填充数据。在这篇博文中,我展示了一个使用Go语言填充测试数据库的测试/生产数据库和装置的示例:看一看,它可能会很有用。