我正在处理一个报告应用程序(用PHP)。这个应用程序在UI中有大量不同的过滤器,粒度等,并且基于这些过滤器等,后端构造了一个大规模的查询,从数据库中提取数百行数据。怎么可能为这样的东西编写单元测试?让我们说我用一些已知数据创建一个测试数据库。我会创建一堆测试,我将测试中的返回数据集(对于任何过滤器设置)与硬编码的sql查询进行比较吗?这是否意味着对于任何架构更改,我必须返回并更改测试中的每个SQL查询?
答案 0 :(得分:0)
单元测试不是以使用真实代码或数据的方式进行测试,而是模拟您使用的所有内容。你不会以你描述的方式测试它,也不需要测试它。您没有测试您获得的数据,只是在您处理数据后,您提供的数据是您期望的或类似数据。
例如,如果您有一个返回从数据库检索的数据的方法,则该数据库与您的测试无关。您正在测试该方法及其中的逻辑;您可以在其中调用哪些方法,期望您希望其中的方法做什么(比如返回一个值可以做断言的泛型表示)等等,并且该方法之外的所有内容都被模拟(即通用表示)。
在一个简单的例子中,如果你创建了一个作为某个东西的setter的方法,并且有一个方法用作该东西的getter,那么你将编写一个测试,说明当我使用setter时getter将返回相同的价值......热潮,两种方法都经过测试。
这就是为什么你听说TDD(测试驱动开发)的原因,它最初可能会感觉反直觉,但它迫使开发人员整理编写可测试代码所需的部分,最终导致代码更好。是的,您可以编写功能完美的代码,但它不一定是可测试的(或几乎不可能),这表明它完全过于耦合,这意味着它不是可重用的。例如,您可以创建一个注入对象类型的方法,而不是创建一个返回苹果数量的方法,因此无论您在项目的该部分使用何种类型的水果,它都可以返回计数(橙子,苹果,梨,甚至根本没有水果)。这使得该方法可重用,也意味着您不会为每种类型的水果编写方法(因此您编写的代码更少)。
无论如何,请提供代码示例和测试,以了解问题所在。