Unit testing 您将如何为一个数据密集型应用程序创建单元测试,该应用程序可能会运行大量的db查询?

Unit testing 您将如何为一个数据密集型应用程序创建单元测试,该应用程序可能会运行大量的db查询?,unit-testing,phpunit,Unit Testing,Phpunit,我正在开发一个报告应用程序(PHP)。该应用程序在UI中有大量不同的过滤器、颗粒等。在这些过滤器等的基础上,后端构建一个大规模查询,从数据库中提取数百行数据 怎么可能为这样的东西编写单元测试呢 假设我用一些已知数据创建了一个测试数据库。我会创建一组测试,将返回的数据集(对于任何过滤器设置)与测试中的硬编码SQL查询进行比较吗 这是否意味着对于任何模式更改,我都必须返回并更改测试中的每个SQL查询?单元测试不是以使用真实代码或数据的方式进行测试,而是模拟您使用的所有东西。你不会用你描述的方式来测试

我正在开发一个报告应用程序(PHP)。该应用程序在UI中有大量不同的过滤器、颗粒等。在这些过滤器等的基础上,后端构建一个大规模查询,从数据库中提取数百行数据

怎么可能为这样的东西编写单元测试呢

假设我用一些已知数据创建了一个测试数据库。我会创建一组测试,将返回的数据集(对于任何过滤器设置)与测试中的硬编码SQL查询进行比较吗


这是否意味着对于任何模式更改,我都必须返回并更改测试中的每个SQL查询?

单元测试不是以使用真实代码或数据的方式进行测试,而是模拟您使用的所有东西。你不会用你描述的方式来测试它,也不需要这样做。您并不是在测试您得到的数据,只是在方法处理之后,您提供给它的数据是您期望的或类似的

例如,如果有一个方法返回从数据库检索到的数据,那么数据库与测试无关。您正在测试该方法和其中的逻辑;您可以在其中调用什么方法,对于您期望其中的那些方法做什么的期望(比如返回一个您可以对其进行断言的值的泛型表示)等等,并且该方法之外的一切都是模拟的(即泛型表示)

在一个简单的例子中,如果您创建了一个方法,它是某事物的setter,并且一个方法用作该事物的getter,那么您将编写一个测试,该测试表明当我使用setter时,getter将返回相同的值。。。。这两种方法都经过了测试

这就是为什么您会听到TDD(测试驱动开发)的原因,它一开始可能会让人感觉不那么直观,但它迫使开发人员将编写可测试代码所需的部分放在一起,从而最终生成更好的代码。是的,您可以编写功能完美的代码,但它不一定是可测试的(或者几乎不可能),这表明它完全是耦合的,这意味着它不是可重用的。例如,您可以创建一个注入对象类型的方法,而不是创建一个返回苹果数的方法,这样无论您在项目的该部分中使用的是哪种类型的水果,它都可以返回一个计数(桔子、苹果、梨,甚至不返回水果)。这使得该方法可重用,也意味着您也不会为每种类型的水果编写方法(因此编写的代码更少)

无论如何,请提供代码和测试的示例,以了解问题所在