测试课可以成为“上帝对象”吗?

时间:2009-06-21 14:48:17

标签: language-agnostic testing refactoring tdd orm

我正在开发一个开源Python ORM的后端。该库包含一组450个测试用例,每个后端都集成到一个巨大的测试类中。

对我而言,对于一个班级来说听起来很多,但我从未参与过一个 450个测试用例的项目(我相信这个库有大约2000个不包括测试的测试用例)每个后端的案例)。我是否正确认为这有点高端(考虑到上面没有任何神奇的数字,你应该打破一些东西),或者对于测试类来说,进行如此多的测试并不是一件大事?

即使这不是太多的测试用例,如何重构一个过大的测试类呢?我对重构的大部分知识都是为了确保对要重构的代码进行测试。我从来没有必要处理需要重构的测试本身的情况。

编辑:以前,我曾说过这些都是单元测试,但这并不完全正确。这些更恰当地称为集成测试。

5 个答案:

答案 0 :(得分:4)

一个类中的450个测试听起来很多,但它有多糟糕取决于它们的组织方式。如果他们都真正独立于彼此和测试类的成员,那可能不是什么大问题 - 除了必须很难找到特定的测试。

另一方面,如果测试类的成员仅由某些测试使用并被其他测试忽略,那么它就是一个名为模糊测试的测试嗅觉包含 的根本原因一般夹具不相关的信息(请注意行话 - 我会回到这里)。

有几种方法可以将测试组织到类中。最常见的模式是每个类的测试用例类每个功能的测试用例类每个Fixture的测试用例类

如何构建测试不仅在编写测试时很重要,而且在出于可维护性原因之后也很重要。仅仅因为这个原因,我倾向于说重构你的测试是值得的。在TDD中,测试代码库(几乎)与实际代码库一样重要,应该受到同样的尊重。

有一本关于这个主题的书,叫做xUnit Test Patterns: Refactoring Test Code,我不能推荐。它包含一个完整的模式语言,用于处理单元测试和TDD,我在这里使用的所有模式名称都源自它。

答案 1 :(得分:2)

我会考虑它们是否有效,而不是计算数字。也就是说,在进行单行修改时,会破坏多少次测试?如果你浪费时间修理十几个borked测试,那么就有问题;测试不应该一遍又一遍地重复,如果是,他们需要重构。

我可能不打算从上到下重构一个测试库,而是让它从测试驱动开发的测试 - 写入 - 重构器中有机地流动。编写测试,实现增强功能,如果> 1测试失败,则重构测试

答案 2 :(得分:2)

拆分测试类,以便每个类专注于指定一种行为。作为一个例子,我写了a TDD tutorial,其中大约有一种测试类用于一种行为(在俄罗斯方块游戏中:下降块,旋转件等)。

重构测试对于重构代码同样重要,因为测试应该作为文档提供良好的价值,记录系统应该做什么的意图。测试是系统的规范。

如同his answer中提到的Todd Gardner一样,如果由于更改一种方法而导致许多测试失败,那么许多测试都会测试相同的行为以及每个测试测试模糊的行。这导致,当测试失败时,很难知道究竟是什么被破坏了,因为许多看似无关的测试都是同时失败的。此外,当需要更改系统的行为时,您还需要更新测试。但是,如果测试的责任不明确,就很难知道测试应该如何更改,或者测试是否已经过时并且应该被删除。您甚至可能需要更改大量测试,即使行为的变化很小。

一个班级的450次测试听起来非常多。测试测试的是什么,他们的名字是什么?它们是以系统行为为中心(一件好事),还是它们与实现之间存在1:1的关系?它们测试了很多不相关的东西,然后把责任分成很多测试类就好了。

答案 3 :(得分:2)

一组Framework单元测试在启动和设置功能中会有很多重叠。在这种情况下,改变一些方法很容易打破每个测试。特别是和ORM。

也就是说,测试应按功能分组。查询类型X,联合,联接,DDL /模式检索,获取缓存,语句创建等...

答案 4 :(得分:0)

是的,但是一个“神对象”的测试类对我来说听起来不是问题。