测试包的命名约定


11

实际上,我们正在像对测试包一样命名测试包。因此,我们最终得到以下结构:

src/main/java
    com.hello.world
        helloWorld.java
src/test/java
    com.hello.world
        helloWorldTest.java

我一直觉得这不是很聪明,因为如果仅提供包名称,则无法区分“测试”和“待测试”。另一方面,我还没有真正找到一个在某种程度上很重要的案例。这两个软件包(对于测试用例和源类)具有相同的命名约定是一种好习惯吗?如果没有,哪种方法更好?


1
不知道这是否是一种很好的做法,但这是一种流行的做法。另一个选项(将“ Test”放入程序包名称,方法名称等中)会给“ Smurf命名”带来些许过多。就像您说的那样,很难想到如果仅提供包名称就无法“区分“测试”和“待测试”的情况”将是一个问题。
大卫·阿诺

@DavidArno感谢您的输入:)那么如何避免蓝精灵命名呢?我的意思是,我们最终会以com.hello.world.test.helloWorld.java结尾,不是吗?
OddDev

在“蓝精灵”的问题更是当你有一个方法XXXTest()com.hello.world.test.helloWorldTest.java。一般建议将“ Test”仅在路径中出现一次,因此(a)在包名称中使用test(并将测试文件命名为与被测文件相同)或(b)将包名称命名为相同,然后在文件/类名称中添加“测试”。
David Arno

@DavidArno啊,感谢您的澄清!我对你的第一句话有误。我知道了
OddDev

嗯,我要说的是,如果现在还不清楚,得到了我的第一个评论错了:)
大卫·阿诺

Answers:


11

这是个好习惯。

有时,您还想为程序包专用的类和方法编写单元测试。您将无法从放置在另一个包中的单元测试类中调用它们。

对于在同一名称空间中拥有单元测试类,应该没有任何困惑,因为在编译或运行生产代码时,它们不应位于类路径中。

这是一个带有公共接口,公共工厂类和两个程序包私有实现类的小模块的示例:

src/main/java:
    com.hello.transmogrifier
        public interface Transmogrifier
        public class TransmogrifierFactory
        class MapTransmogrifier implements Transmogrifier
        class ListTransmogrifier implements Transmogrifier

scr/test/java:
    com.hello.transmogrifier
        public class TransmogrifierFactoryTest
        public class MapTransmogrifierTest
        public class ListTransmogrifierTest

隐藏Transmogrifier接口的实现可能是有效的设计选择。选择实现可能是工厂级的责任。

由于实现是私有程序包,因此如果要直接测试它们,则需要将单元测试类放在同一程序包中。如果在其他软件包中包含单元测试类,则只能从测试中直接访问公共接口和工厂类。


1
“通常,您还希望为包私有的类和方法编写单元测试。” 没有!这确实是不好的做法。包私有类型是实现细节,切勿直接对其进行测试。仅测试公共API。
大卫·阿诺

1
@DavidArno我不同意。但是,为了避免进行特定的讨论,我将“通常”替换为“有时”。

1
您可能会不同意所有的要求,但是测试一段代码的内部工作原理会导致内部工作代码与测试之间的紧密耦合,并导致脆弱的测试,即使在简单的重构过程中,这些测试也容易中断。这是非常不好的做法。
David Arno

如果我想确保所有Transmogrifier实现都能正常工作,无论工厂做什么,那么我将编写用于测试每个实现的单元测试。请注意,即使这些类是程序包专用的,实现也具有共享的公共API。除非我更改公共API,否则这些测试不应中断。实际上,我可能会为Transmogrifier编写一个通用测试,然后针对每个实现运行它。虽然可以使用工厂获得每个实现,但最好在测试Transmogrifiers时不要具有这种依赖性。

后来有一天,你看看MapTransmogrifier,并ListTransmogrifier和决定他们可以做成一个类,让你创建ListMapTransmogrifier,修改工厂使用,并删除两班。该代码现在无法编译,因此您必须同时修改两个测试中的每个测试MapTransmogrifierTestListTransmogrifierTest进行编译。测试失败。是因为更改测试还是创建了ListMapTransmogrifier?调试器出来找出问题...或者当测试使用工厂时,您进行重构,并且仍然可以编译...
David Arno
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.