使用注释在Java上设置测试参数

时间:2013-07-11 00:51:34

标签: java annotations junit4

我首先要说的是,我对Java真正不了解的一个问题是注释。

我来自python背景,所以我倾向于将注释视为可能做任何事情的方法的修饰符(如python上的装饰器)。

现在,我有一个问题,就语法而言,如果可以使用注释解决它会看起来很好,但我不知道是否可以完成。

基本上,我有不同版本的API:v1,v2,v3,v4。我对每个版本都进行了JUnit4测试。

ApiV1Test.java

@Test
public void featureX() {
  Connection conn = new ApiConnection("v1");
  response = conn.request("x", "foo")';
  assertEquals("bar", response);
}

@Test
public void featureY() {
  Connection conn = new ApiConnection("v1");
  response = conn.request("y", "foo_y")';
  assertEquals("bar_y", response);
}

ApiV2Test.java

@Test
public void featureX() {
  Connection conn = new ApiConnection("v2");
  response = conn.request("x", "foo")';
  assertEquals("bar", response);
}

@Test
public void featureZ() {
  Connection conn = new ApiConnection("v2");
  response = conn.request("z", "foo_y")';
  assertEquals("bar_z", response);
}

事实上,不同版本具有不同的功能; v1可能具有X和Y特征,v2可能具有X和Z特征。依此类推,每个特征都可以在Apis的某个子集中使用。

因此,这会导致大量代码重复。我想只有一个具有所有不同功能的文件,并且有一个机制可以说“为这些版本运行此测试”,例如:

@Test
@Versions("v1", "v2")
public void featureX(String version) {
  Connection conn = new ApiConnection(version);
  response = conn.request("x", "foo")';
  assertEquals("bar", response);
}

@Test
@Versions("v1")
public void featureY(String version) {
  Connection conn = new ApiConnection(version);
  response = conn.request("y", "foo_y")';
  assertEquals("bar_y", response);
}


@Test
@Versions("v2")
public void featureZ(String version) {
  Connection conn = new ApiConnection(version);
  response = conn.request("z", "foo_z")';
  assertEquals("bar_z", response);
}

这可能吗?

1 个答案:

答案 0 :(得分:0)

从JUnit 4开始,你可以做到这一点。查看Categories

// In Version1.java.
public interface Version1 { /* category marker */ }

// In Version2.java.
public interface Version2 { /* category marker */ }

// Part of ApiV1Test.java
@Test
@Category({Version1.class, Version2.class})
public void featureX( String version) {
    Connection conn = new ApiConnection(version);
    response = conn.request("x", "foo")';
    assertEquals("bar", response);
}

// Part of ApiV2Test.java
@Test
@Category(Version2.class)
public void featureZ(String version) {
    Connection conn = new ApiConnection(version);
    response = conn.request("z", "foo_z")';
    assertEquals("bar_z", response);
}

//Part of V1TestSuite.java, chosen through an Ant target or Maven execution.
@RunWith(Categories.class)
@IncludeCategory(Version1.class)
@SuiteClasses(ApiV1Test.class, ApiV2Test.class)  // *
public class V1TestSuite {}

您可以根据需要将测试方法拆分为少数或多个类。只需编辑标有星号的行。然后,手动运行V1TestSuite,或使用适当的方法让它由Ant目标或Maven执行测试步骤运行。

的Ant

<target name="text-version1" depends="compile-tests">
    <junit printsummary="yes" haltonfailure="yes">
        <classpath>
            <pathelement location="${build.tests}"/>
            <pathelement path="${java.class.path}"/>
        </classpath>

        <formatter type="plain"/>

        <test name="my.test.V1TestSuite"/>
    </junit>
</target>