Language agnostic 一个测试类能成为“一个”吗;上帝客体;?

Language agnostic 一个测试类能成为“一个”吗;上帝客体;?,language-agnostic,testing,refactoring,tdd,orm,Language Agnostic,Testing,Refactoring,Tdd,Orm,我正在为一个开源Python ORM开发后端。该库为每个后端包含一组450个测试用例,所有测试用例都集中到一个巨大的测试类中 对我来说,对于一个类来说,这听起来似乎太多了,但我从未参与过一个有450个测试用例的项目(我相信这个库有大约2000个测试用例,不包括每个后端的测试用例)。我觉得这有点高端(考虑到实际上没有任何神奇的数字可以让你分解某些东西),或者对于一个测试类来说,有这么多的测试并没有那么重要,这是对的吗 即使没有太多的测试用例,如何重构一个过大的测试类呢?我关于重构的大部分知识都是关

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

对我来说,对于一个类来说,这听起来似乎太多了,但我从未参与过一个有450个测试用例的项目(我相信这个库有大约2000个测试用例,不包括每个后端的测试用例)。我觉得这有点高端(考虑到实际上没有任何神奇的数字可以让你分解某些东西),或者对于一个测试类来说,有这么多的测试并没有那么重要,这是对的吗

即使没有太多的测试用例,如何重构一个过大的测试类呢?我关于重构的大部分知识都是关于确保对正在重构的代码进行测试。我从来没有遇到过需要重构测试本身的情况


编辑:之前,我说过这些是单元测试,但事实并非如此。这些都被更恰当地称为积分测试。

< P>而不是数数,我会考虑它们是否有效。也就是说,在进行单行修改时,有多少测试中断?如果你是在浪费时间修复十几个错误的测试,那么就有问题了;测试不应该一遍又一遍地重复同样的事情,如果是的话,它们需要重构


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

拆分测试类,以便每个类专注于指定一种行为。作为一个例子,我写过一个测试类,测试一种行为(在俄罗斯方块游戏中:落块、旋转碎片等)

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

就像Todd Gardner在中提到的那样,如果许多测试因为改变了一种方法而失败,那么许多测试都在测试相同的行为,并且每个测试的线条都很模糊。这导致,当测试失败时,很难知道到底是什么被破坏了,因为许多看似无关的测试同时失败。此外,当需要更改系统的行为时,还需要更新测试。但是,如果测试的责任不明确,就很难知道测试应该如何更改,或者测试何时过时,应该取消。您甚至可能需要更改很多测试,即使行为上的更改很小


一堂课450个测试听起来很像。这些测试测试什么,它们的名字是什么?它们是以系统的行为为中心(一件好事),还是它们与实现之间存在1:1的关系?如果他们测试了许多不相关的东西,那么将责任划分为多个测试类将是一件好事。

是的,但是一个“上帝对象”的测试类对我来说并不是一个问题。

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

另一方面,如果测试类的成员只被一些测试使用,而被其他测试忽略,那么它就是一种被称为模糊测试的测试气味,它包含一些根本原因,比如一般的固定装置和不相关的信息(请注意术语-我会回到这里)

有几种方法可以将测试组织到类中。最常见的模式是每个类的Testcase类、每个特性的Testcase类和每个装置的Testcase类

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


有一整本书都是关于这个主题的,叫做《我推荐得不够》。它包含处理单元测试和TDD的完整模式语言,我在这里使用的所有模式名称都源于它。

一组框架单元测试将在启动和设置功能中有大量重叠。在这种情况下,更改一些方法很容易破坏每个测试。特别是和ORM


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

您是否可以更详细地解释一下原因?我的意思是,一个非测试类,一个上帝对象,当然是一个问题。测试类会有什么不同?如果你在做集成测试,他们必须知道整个系统是如何工作的。除此之外,我敢打赌,大多数方法根本不会相互交流。”……一定很难找到一个特定的测试。”答对了。这正是我面临的问题。