繁体   English   中英

如何组织复杂类的单元测试?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM