是否有第三方库中的接口用于JUnit @Category()

时间:2016-12-09 17:05:21

标签: java maven integration-testing maven-surefire-plugin

我的父pom包含定义maven-surefire-pluginmaven-failsafe-plugin参数的<groups><excludedGroups>配置,如下所示,使用我的接口com.adam.testutil.IntegrationTest作为JUnit 4 {{ 1}}注释,将任何测试标记为集成测试。

父pom下的所有模块(不仅仅是那些带有集成测试的模块)在其类路径上都需要@Category,以便运行surefire和failafe插件,否则它们会抛出com.adam.testutil.IntegrationTest

因此,类必须位于所有模块必须声明为依赖项的模块中。我宁愿将它声明为父pom中的依赖项 所以所有模块都自动继承它,但这会产生一个循环依赖问题,阻止mvn运行。

事实上,即使模块中没有单元或集成测试,模块仍然必须声明依赖项。

我还必须使包含ClassNotFoundException的模块成为构建顺序中的第一个模块,否则它将无法在任何新系统的首次安装中使用。我遇到了鸡与蛋的困境 - 我不能在空白存储库中运行com.adam.testutil.IntegrationTest,因为mvn install的依赖关系尚未在本地存储库中。

事实上,我并不特别想创建一个新模块来提供IntegrationTest。如果JUnit在库中包含了一个合适的IntegrationTest类,那就简单多了。

虽然我认为org.junit.IntegrationTest是一种很好的方法来注释测试以将它们标记为集成测试,但在多模块项目中它具有所有这些缺点。

我可以使用某个相关或适当命名的界面而不必拥有自己的界面吗?

在最糟糕的情况下,就JUnit,@Cateogry,maven-surefire-plugin和maven-failsafe-plugin而言,我可以使用JDK中的接口,例如: java.lang.Cloneable - 尽管任何阅读代码的人都会想知道到底发生了什么。

我曾希望JUnit会有所收获,但我找不到任何有用的东西。

我可以在我的父pom中依赖第三方库,一切都会好的。

我会接受任何建议来自第三方库的合适界面的人的答案,其中界面的名称不会立即引起任何人第一次阅读代码的问题。

@Category

import org.junit.experimental.categories.Category
import com.adam.testutil.IntegrationTest

@Category(IntegrationTest.class)
public DbAndJpaIntegrationTests {
    ...
}

2 个答案:

答案 0 :(得分:1)

你的问题似乎表明IntegrationTest接口的目的只是标记哪些测试是由surefire执行的,哪些是由failafe执行的。

在这种情况下,您可以使用命名约定。 故障保护的默认值是 described in the docs

<includes>
    <include>**/IT*.java</include>
    <include>**/*IT.java</include>
    <include>**/*ITCase.java</include>
</includes>

对于万无一失,the defaults are

<includes>
    <include>**/Test*.java</include>
    <include>**/*Test.java</include>
    <include>**/*TestCase.java</include>
</includes>

答案 1 :(得分:0)

如果 ..你的大多数模块需要.. 界面,你可以在一个单独的模块中声明你的import pandas as pd import numpy as np from sklearn.model_selection import StratifiedShuffleSplit from sklearn import neighbors from sklearn import cross_validation df = pd.DataFrame(np.random.rand(12, 5)) label=np.array([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]) df['label'] = label df1 = pd.concat(g.sample(2) for idx, g in df.groupby('label')) X = df1[[0,1,2,3,4]].values y = df1.label.values clf = neighbors.KNeighborsClassifier(n_neighbors=2) sss = StratifiedShuffleSplit(n_splits=1, test_size=0.35) scoresSSS = cross_validation.cross_val_score(clf, X, y, cv=sss.split(X, y)) print(scoresSSS) (虽然我建议不只是一个界面,但试着把与该接口相关的事情以及该模块)。让我们通过名称IntegrationTest来调用它来获取工件。

  

我更愿意将它声明为父pom中的依赖项   模块会自动继承它,但这会创建一个循环   阻止mvn运行的依赖性问题。

  • 在父integration-test中声明依赖关系不是必须的。尽管使用pom.xml这样做可以更好地使用维护的<dependencyManagement>工件版本。 Read more about it in the doc
  

事实上,即使模块中没有单元或集成测试,   该模块仍然必须声明依赖。

  • 如果是这种情况,您只需要在此模块的pom.xml中声明integration-test工件依赖项。
  

我还必须使模块包含   com.adam.testutil.IntegrationTest构建顺序中的第一个模块,   否则它将无法在任何新的首次安装中使用   系统

  • 反应器排序负责在项目中构建模块的顺序,其中依赖模块是在成功构建它们所依赖的模块之后构建的。 You get to know more about it here. 因此,您的integration-test将在依赖于它的同一项目中的任何模块之前构建。
  

事实上,我并不特别想要创建一个新模块   提供IntegrationTest。如果JUnit有这么简单的话   在库中包含了一个合适的org.junit.IntegrationTest类。

     

那里有一个方便的界面吗?我可以放一个   在我的父母pom中依赖它,一切都会好的。

  • 除非您公开并证明integration-test接口有用,否则我怀疑它可以包含在IntegrationTest lib中。对于一个方便的界面也是如此,你的界面junit试图做的是什么,值得将是最终的问题。
  • 此后,如果将其包含(接受)到任何测试范围库中是可行的,那么将lib的依赖项导入父IntegrationTest可能非常方便。
  • 在此之前,我仍然建议您使用pom.xml个人模块方法。