1

我正在开发一个报告应用程序(在 PHP 中)。这个应用程序在 UI 中有大量不同的过滤器、粒度等,并且基于这些过滤器等,后端构造了一个海量查询以从数据库中提取数百行数据。

怎么可能为这样的事情编写单元测试?

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

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

4

1 回答 1

0

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

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

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

这就是为什么您听说 TDD(测试驱动开发)的原因,起初它可能会觉得反直觉,但它迫使开发人员将编写可测试代码所需的部分放在一起,最终导致代码更好。是的,您可以编写功能完美的代码,但它不一定是可测试的(或几乎不可能),这表明它完全耦合得太厉害了,这意味着它不是那么可重用的。例如,您可以创建一个注入对象类型的方法,而不是创建一个返回苹果数量的方法,这样无论您在项目的那个部分使用什么类型的水果,它都可以返回一个计数(橙子,苹果,梨,甚至根本没有水果)。这使得该方法可重用,也意味着你不会

无论如何,请提供您的代码示例和测试,以查看问题所在。

于 2012-12-22T05:54:29.607 回答