一组应用了junit的测试,需要增加一个动态判断,来决定是否跑test。我知道这组测试其实已经应用了junit的Category功能,来做测试组的初期分类,在跑这一整套测试的时候,执行环节会针对不同的被测产品给出一个custom参数,测试代码跑起来后会根据这个custom的值,来选择排除某些category和包括哪些category。
现在这个策略不够用了,因为之前标记好的category,同一个分类下还是有动态选择执行的需求,于是这次用到了junit中rule特性。
见下面代码就实现了一个rule。
package com.ibm.robot.web.util;
import com.ibm.robot.web.util.WebPropertiesLoader;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
public class NotRun5gCase implements TestRule {
@Override
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
String methodName = description.getMethodName();
loader = new WebPropertiesLoader();
String ap_2g = loader.getString("WIFI.ap.2G", "unknow");
String ap_5g = loader.getString("WIFI.ap.5G", "unknow");
if (!(ap_2G.equals(ap_5G) && methodName.contains("5GHz"))) {
base.evaluate();
}
}
};
}
}
从代码中可见,这条rule规定当ap_2g的值与ap_5g相等,同时test的方法名中包含5GHz的话,则不执行这个test。
把这条rule应用到具体的test中即可。
public class WiFiTest{
@Rule
public TestRule notRun5gCase = new NotRun5gCase ();
@Before
public void setUp() throws Exception {
System.out.println("setup actions");
}
@After
public void tearDown() throws Exception {
System.out.println("tearDown actions");
}
@Test
public void testWiFi2GHz() {
//to test wi-fi 2g
}
@Test
public void testWiFi5GHz() {
//to test wi-fi 5g
}
}
以上。