我首先要说的是,我对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);
}
这可能吗?
答案 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执行测试步骤运行。
<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>