Junit:分解集成testing和unit testing
我已经inheritance了一个Junittesting的负载,但这些testing(除了大多数不工作)是实际的unit testing和集成testing(需要外部系统,分贝等)的混合物。
所以我试图想办法将它们分离出来,这样我就可以很快地运行unit testing,然后再进行集成testing。
选项是..
-
将它们拆分成不同的目录。
-
移至Junit4(从v3开始)并注释这些类以将它们分开。
-
使用文件命名约定来告诉一个类是什么,即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
。 使用groups
或excludedGroups
元素应该触发交换机。 看到这里 。 - 上面的大部分代码都是从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混在一起吗? 我不会。