您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源單元測(cè)試工具 > junit
自定義注解過(guò)濾JUnit測(cè)試類
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/10/28 15:59:00 ] 推薦標(biāo)簽:

  JUnit是常用單元測(cè)試工具,如果希望跳過(guò)某個(gè)測(cè)試類,一般在類上面添加@Ignore注解。實(shí)際情況下,經(jīng)常遇到某些測(cè)試類在符合某些條件時(shí)需要運(yùn)行、不符合時(shí)又不需要運(yùn)行的情況,頻繁加減@Ignore注解的話相當(dāng)繁瑣。有沒(méi)有辦法,能根據(jù)自己的配置文件,靈活決定是否運(yùn)行某些測(cè)試類呢?
  首先來(lái)分析一下JUnit源碼(以4.10版本為例)。在org.junit.runner包下,有個(gè)JUnitCore.class,其中的main方法是JUnit入口函數(shù)。經(jīng)過(guò)runMainAndExit->runMain->run的多次調(diào)用,發(fā)現(xiàn)在run之中通過(guò)Request.classes方法構(gòu)建了AllDefaultPossibilitiesBuilder對(duì)象,該對(duì)象用于選擇RunnerBuilder,繼而選擇Runner執(zhí)行測(cè)試用例。源碼如下:
public static Request classes(Computer computer, Class<?>... classes) {
try {
AllDefaultPossibilitiesBuilder builder= new AllDefaultPossibilitiesBuilder(true);
Runner suite= computer.getSuite(builder, classes);
return runner(suite);
} catch (InitializationError e) {
throw new RuntimeException(
"Bug in saff's brain: Suite constructor, called as above, should always complete");
}
}
  在AllDefaultPossibilitiesBuilder中有個(gè)runnerForClass方法,是該方法選擇了RunnerBuilder,并通過(guò)調(diào)用RunnerBuilder的runnerForClass方法,終決定了
Runner:
@Override
public Runner runnerForClass(Class<?> testClass) throws Throwable {
List<RunnerBuilder> builders= Arrays.asList(
ignoredBuilder(),
annotatedBuilder(),
suiteMethodBuilder(),
junit3Builder(),
junit4Builder());
for (RunnerBuilder each : builders) {
Runner runner= each.safeRunnerForClass(testClass);
if (runner != null)
return runner;
}
return null;
}
  從上述代碼可以看出,正常情況下會(huì)選擇JUnit4Builder,其源碼如下:
public class JUnit4Builder extends RunnerBuilder {
@Override
public Runner runnerForClass(Class<?> testClass) throws Throwable {
return new BlockJUnit4ClassRunner(testClass);
}
}
  而一旦對(duì)類添加了@Ignore注解,則會(huì)選擇IgnoredBuilder,其源碼如下:
public class IgnoredBuilder extends RunnerBuilder {
@Override
public Runner runnerForClass(Class<?> testClass) {
if (testClass.getAnnotation(Ignore.class) != null)
return new IgnoredClassRunner(testClass);
return null;
}
}
  看到這里,我們大體可以認(rèn)為,BlockJUnit4ClassRunner(testClass)會(huì)正常運(yùn)行測(cè)試類,而IgnoredClassRunner(testClass)則會(huì)跳過(guò)運(yùn)行測(cè)試類。因此,對(duì)于開始提出的問(wèn)題,可以用如下方法解決:構(gòu)建自己的Builder類,在其中的runnerForClass中根據(jù)配置決定是否運(yùn)行測(cè)試類。

上一頁(yè)123下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd