一组应用了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
}
}
以上。

这篇博客探讨了如何在Junit框架中实现更细粒度的动态控制,即在已有的Category功能基础上,利用Rule特性根据运行时参数决定是否执行特定的test。当ap_2g和ap_5g相等且test方法名包含5GHz时,Rule将阻止该test的执行。通过将此Rule应用到测试类,可以灵活地控制测试用例的执行情况。
766

被折叠的 条评论
为什么被折叠?



