[英]How to organize unit tests for a complex class?
我有一个复杂的类(300多行),我试图从不同的“观点”进行测试。 我已经创建了三个不同的单元测试。 每个测试本身都是一个复杂的类(100多行)。 问题是 - 在项目目录树中存储它们的最佳位置是什么? 这就是我现在正在做的事情(使用Maven):
pom.xml
/src
/main
/java
/com
/Foo
ComplexClass.java
/test
/java
/com
/Foo
/ComplexClass
FirstPointOfViewTest.java
SecondPointOfViewTest.java
ThirdPointOfViewTest.java
当然,名称只是占位符,用于解释问题/问题。 您如何看待这种方法?
你的课程太复杂了,你需要三个不同的测试类来测试课程的所有方面? 可能你在一个班级中混合了太多的顾虑。 我建议使用经验证的设计模式对类进行重构,以便将具有正交关注点的类分开,然后可以单独进行测试。
您可能需要考虑的一件事是:如果您保持测试代码包结构与主代码包结构相同 - 即使使用当前正在执行的不同物理目录 - 您的测试类将位于相同的逻辑包中作为你的主要课程。 这意味着他们可以访问测试类中的默认/受保护成员,这通常很有帮助。 您必须在测试代码中删除ComplexClass包才能实现这一点。
另一件需要考虑的事情是:(我假设您正在使用JUnit进行测试)测试类是类 ,因此您可以使用继承来组织和构造它们。 如果您有3个不同的观点,可能会提取包含常用功能的基类,这将使您的测试从长远来看更容易维护,尤其是在发现更多“观点”时。
正如您所做的那样分离源代码和测试代码是一个好主意,它为您提供了更多选项来构建和维护逻辑分组,从而使维护更加简单。
我会保留你现在拥有的东西。 这种maven结构的主要优点是,不是将源代码和测试代码混合在一起,而是试图确定要从构建中排除哪些类,而只是完全忽略test
目录。 使用相同包的目的是将受保护的方法/变量暴露给您的测试类,但不暴露给公共API。
我可能建议的一件事是我在John Smart关于测试驱动开发的演讲中提到的一个问题,就是将测试类命名为他们正在测试的功能组,所以你只需要测试第一个行为的FirstPointOfView.java
com.foo
包的观点。 如果将测试类拆分为单独的类,如果它们实际测试的是不同的行为集,则此方法应该更加明显。
编辑:如果ComplexClass
是一个目录,你应该删除它,以便你的测试在同一个包中,我想我可能会错过你的示例树
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.