Junit:分解集成testing和unit testing

我已经inheritance了一个Junittesting的负载,但这些testing(除了大多数不工作)是实际的unit testing和集成testing(需要外部系统,分贝等)的混合物。

所以我试图想办法将它们分离出来,这样我就可以很快地运行unit testing,然后再进行集成testing。

选项是..

  1. 将它们拆分成不同的目录。

  2. 移至Junit4(从v3开始)并注释这些类以将它们分开。

  3. 使用文件命名约定来告诉一个类是什么,即AdapterATest和AdapterAIntergrationTest。

3有问题,Eclipse可以select“在选定的项目/包或文件夹中运行所有testing”。 所以这将使运行集成testing变得非常困难。

2:运行开发人员可能开始在unit testing课程中开始编写集成testing的风险,而且会变得混乱。

1:似乎是最好的解决办法,但我的直觉说,那里一定有更好的解决办法。

所以这是我的问题,你如何分解集成testing和适当的unit testing?

我目前使用单独的目录由于组织政策(和Junit 3传统),但我正在寻找过渡到注释本人现在我在Junit 4。

我不会过分担心开发人员将集成testing放入unit testing课程中,如果需要,请在编码标准中添加一条规则。

我有兴趣知道除了注释或物理分离类之外,还有哪些其他的解决scheme。

您可以使用JUnit类别和Maven非常容易地拆分它们。

下面通过分割单元和集成testing非常简要地展示了这一点。

定义标记界面

使用类别对testing进行分组的第一步是创build标记界面。

这个界面将被用来标记所有你想作为集成testing运行的testing。

public interface IntegrationTest {} 

标记你的testing类

将类别注释添加到testing类的顶部。 它采用您的新界面的名称。

 import org.junit.experimental.categories.Category; @Category(IntegrationTest.class) public class ExampleIntegrationTest{ @Test public void longRunningServiceTest() throws Exception { } } 

configurationMavenunit testing

这个解决scheme的好处在于事物的unit testing方面没有什么变化。

我们只是添加一些configuration到maven surefire插件,使其忽略任何集成testing。

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.11</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.12</version> </dependency> </dependencies> <configuration> <includes> <include>**/*.class</include> </includes> <excludedGroups>com.test.annotation.type.IntegrationTest</excludedGroups> </configuration> </plugin> 

当你做一个mvn干净的testing,只有你的未标记的unit testing将运行。

configurationMaven集成testing

再次,这个configuration是非常简单的。

要仅运行集成testing,请使用以下命令:

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.11</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.12</version> </dependency> </dependencies> <configuration> <groups>com.test.annotation.type.IntegrationTest</groups> </configuration> </plugin> 

如果你用id IT包装这个configuration文件,你可以使用mvn clean install只运行快速testing。 要仅运行集成/慢速testing,请使用mvn clean install -P IT

但是大多数情况下,您会希望默认运行快速testing, 所有testing都使用-P IT 。 如果是这样的话,那么你必须使用一个技巧:

 <profiles> <profile> <id>IT</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <excludedGroups>java.io.Serializable</excludedGroups> <!-- An empty element doesn't overwrite, so I'm using an interface here which no one will ever use --> </configuration> </plugin> </plugins> </build> </profile> </profiles> 

正如你所看到的,我排除了用java.io.Serializable注释的testing。 这是必要的,因为configuration文件将inheritanceSurefire插件的默认configuration,所以即使您说<excludedGroups/><excludedGroups></excludedGroups> ,也会使用com.test.annotation.type.IntegrationTest值。

你也不能使用none因为它必须是类path上的一个接口(Maven会检查这个)。

笔记:

  • 只有当Maven没有自动切换到JUnit 4 runner时,才需要依赖于surefire-junit47 。 使用groupsexcludedGroups元素应该触发交​​换机。 看到这里 。
  • 上面的大部分代码都是从Maven Failsafe插件的文档中获得的。 请参阅本页上的 “使用JUnit类别”一节 。
  • 在我的testing中,我发现当使用@RunWith()注释来运行套件或基于Spring的testing时,它甚至可以工作。

我们使用Maven的Surefire插件运行unit testing和Maven的Failsafe插件来运行集成testing。 unit testing遵循**/Test*.java **/*Test.java **/*TestCase.java命名约定,集成testing – **/IT*.java **/*IT.java **/*ITCase.java 。 所以它实际上是你的第三select。

在一些项目中,我们使用TestNG并为集成/unit testing定义不同的testing组,但这可能不适合您。

我会移动到Junit4只是为了:)

你可以把它们分成不同的testing套件。 我不知道它们是如何在Junit3中组织起来的,但是在Junit4中应该很容易build立testing套件,并将所有真正的unit testing放在其中一个中,然后使用第二个套件进行集成testing。

现在在eclipse中为两个套件定义一个运行configuration,你可以很容易地运行一个套件。 这些套件也可以从一个自动化的过程启动,使您可以在每次源代码更改时运行unit testing,也可以集成testing(如果它们真的很大)每天一次或每小时一次。

使用IfProfileValue的 Spring注解可以在不需要 Maven插件或configuration的情况下实现这一点。

使用IfProfileValue注释集成testing类或方法

 import org.springframework.test.annotation.IfProfileValue; @IfProfileValue(name="test-groups", value="integration") public class ExampleIntegrationTest{ @Test public void longRunningServiceTest() throws Exception { } } 

仅使用unit testing运行:

 mvn clean test 

运行使用集成testing和unit testing:

 mvn clean test -Dtest-groups=integration 

此外,在IDE中“运行所有testing”将只运行unit testing。 添加-Dtest-groups=integration到VM参数来运行集成和unit testing。

没有一个正确的答案。 正如你所解释的,有几种方法可以做到这一点。 我已经完成了文件命名scheme,并将其分成不同的目录。

这听起来像把事情分解到不同的目录中对你来说可能会更好,对我来说这似乎更清楚一些,所以我会倾向于这样做。

我不认为我会尝试注释,因为这对我来说似乎更加细致。 你真的想把这两种types的testing混在一起吗? 我不会。