Java 我应该把JUnit测试放在哪里?

Java 我应该把JUnit测试放在哪里?,java,unit-testing,junit,Java,Unit Testing,Junit,我有两个关于组织单元测试的问题 我是否必须将测试放在与测试类相同的包中,或者我可以在不同的包中组织测试 例如,如果我有有效性和其他测试,将它们分为不同的包是否正确,即使它们属于同一类 模拟类和存根类呢?我应该将它们从只包含测试的包中分离出来,还是将它们放在一起 测试类应该在不同的包中,当您打包发布时,将它们与生产代码分开比较容易。我通常在这些包中保留大量的测试绒毛,各种各样的模拟、配置和场景。。但是当你构建时,它没有得到它。在某些情况下,即使在不同的项目中也最好保留测试内容。视情况而定。我们

我有两个关于组织单元测试的问题

  • 我是否必须将测试放在与测试类相同的包中,或者我可以在不同的包中组织测试

    例如,如果我有有效性其他测试,将它们分为不同的包是否正确,即使它们属于同一类

  • 模拟类和存根类呢?我应该将它们从只包含测试的包中分离出来,还是将它们放在一起


  • 测试类应该在不同的包中,当您打包发布时,将它们与生产代码分开比较容易。我通常在这些包中保留大量的测试绒毛,各种各样的模拟、配置和场景。。但是当你构建时,它没有得到它。在某些情况下,即使在不同的项目中也最好保留测试内容。视情况而定。

    我们执行JUnit测试用例的方法是将它们放在同一个包中,但放在不同的根目录中。因为我们使用Maven,所以我们只使用标准位置,使结构类似于以下内容

    src/main/java/com/foo/Bar.java
    src/test/java/com/foo/BarTest.java
    
    显然,该结构还有更多内容,但这让我们能够独立于主线代码构建测试,但仍然可以访问受保护的类等。对于不同类型的测试,这是非常主观的。当我们开始我们的测试工作时(不幸的是,这是在开发之后开始的),我试图让事情保持相当孤立。不幸的是,当我们到达500多个测试用例点时,它很快变成了一场噩梦。此后,我尝试进行更多的整合。这导致需要维护的代码量减少。正如我所说,这是非常主观的


    就仅测试代码而言,我们将其保存在一个单独的
    com.foo.test
    包中,该包只驻留在
    src/test/java
    树中。

    将其保存在同一个包中允许您对仅通过测试访问的代码使用包私有可见性

    关于使用单独的根目录,这是一个很好的实践。它对我们也有好处,因为我们使用IDEA,IDEA认识到生产代码不能引用测试代码

    就保持它们的独立性而言,在单元级别上,每个生产类都有一个测试类,而且只有一个测试类,这是一种巨大的力量。当然,有些类是作为重构的一部分在生产中创建的,根本没有测试类,这很好,但是当您想知道什么测试测试某个类时,有一个约定说ClassNameTest是ClassName的测试非常有用


    TestNG比JUnit对这个范例更友好。

    我也倾向于将我的测试放在同一个包中,但放在不同的根目录下。这允许我在测试包中的其他内容时测试包私有类或访问打包私有类。它们保存在单独的目录树中,以允许将它们从部署结果中排除(特别是确保测试代码不会意外进入生产代码)。然而,最重要的是什么适合你的情况

    就每个生产类有多少个测试类而言,我看到的理论是,每个夹具(即每个设置结构)编写一个测试类。在许多情况下,每个生产类都与一个测试类相同(或足够接近),但我有时为一个给定的生产类编写了更多的测试类(尤其是相等测试往往是分开的),偶尔为一组(相关的)生产类编写一个测试类(比如,用于测试策略模式)


    大多数情况下,我不太担心理论,但根据需要重新编写测试,以将重复保持在绝对最小。

    这里类似的事情,除了我们使用“src/com/foo/…”和“test/com/foo/…”。就我个人而言,我觉得Bob的答案更好。老实说,我使用src/main/java和src/test/java的唯一原因就是不必对Maven进行任何额外的配置。