亚洲好骚综合-亚洲黄色录像-亚洲黄色网址-亚洲黄色网址大全-99久久99久久-99久久99久久精品国产

您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 > junit
Junit使用及其原理分析
作者:alighters 發(fā)布時(shí)間:[ 2016/9/13 10:53:28 ] 推薦標(biāo)簽:單元測(cè)試 Junit

  其會(huì)調(diào)到一個(gè) run(Runner runner) 的方法,而 Runner 是一個(gè)抽象類,其實(shí)現(xiàn)針對(duì)不同的平臺(tái)又有好多個(gè)。這里主要提及兩個(gè),一個(gè)是 Junit4ClassRunner,它是 4.4 版本及之前的采用的,之后被廢棄掉了,而采用了繼承實(shí)現(xiàn)抽象類 ParentRunner 的 BlockJUnit4ClassRunner 類,它在 4.5 之后被采用。這里主要查看后者,先看 ParentRunner 對(duì)其接口 Runner 中方法 run 的實(shí)現(xiàn):
@Override
public void run(final RunNotifier notifier) {
EachTestNotifier testNotifier = new EachTestNotifier(notifier,
getDescription());
try {
Statement statement = classBlock(notifier);
statement.evaluate();
} catch (AssumptionViolatedException e) {
testNotifier.addFailedAssumption(e);
} catch (StoppedByUserException e) {
throw e;
} catch (Throwable e) {
testNotifier.addFailure(e);
}
}
  其中,主要通過(guò) classBlock 方法生成的 Statement 的 evaluate來(lái)進(jìn)行調(diào)用,先看它是怎么生成的:
  protected Statement classBlock(final RunNotifier notifier) {
  Statement statement = childrenInvoker(notifier);
  if (!areAllChildrenIgnored()) {
  statement = withBeforeClasses(statement);
  statement = withAfterClasses(statement);
  statement = withClassRules(statement);
  }
  return statement;
  }
  這里主要的方法 childrenInvoker 會(huì)調(diào)用一個(gè)抽象的方法 protected abstract void runChild(T child, RunNotifier notifier);,它則是由子類來(lái)實(shí)現(xiàn)。另外看到的是,當(dāng)測(cè)試類中的測(cè)試方法都沒(méi)有被忽略的時(shí)候,則會(huì)使用 with對(duì)應(yīng)的三個(gè)方法來(lái)添加其獲取注解 BeforeClass,AfterClass,ClassRule對(duì)應(yīng)的信息,并添加至其調(diào)用的 statement中。
  接下來(lái)查看 BlockJUnit4ClassRunner 的 runChild的實(shí)現(xiàn):
  @Override
  protected void runChild(final FrameworkMethod method, RunNotifier notifier) {
  Description description = describeChild(method);
  if (isIgnored(method)) {
  notifier.fireTestIgnored(description);
  } else {
  runLeaf(methodBlock(method), description, notifier);
  }
  }
  其中,若是添加了 @ignore的注解,則不會(huì)得到調(diào)用?纯 methodBlock方法都干了什么:
protected Statement methodBlock(FrameworkMethod method) {
Object test;
try {
test = new ReflectiveCallable() {
@Override
protected Object runReflectiveCall() throws Throwable {
return createTest();
}
}.run();
} catch (Throwable e) {
return new Fail(e);
}
Statement statement = methodInvoker(method, test);
statement = possiblyExpectingExceptions(method, test, statement);
statement = withPotentialTimeout(method, test, statement);
statement = withBefores(method, test, statement);
statement = withAfters(method, test, statement);
statement = withRules(method, test, statement);
return statement;
}
  在這個(gè) statement 的獲取中,通過(guò)使用組合的方式,會(huì)這個(gè) statement 添加 Before,After 及其它 Rule 的鏈?zhǔn)秸{(diào)用,后生成一個(gè) statement 來(lái)返回。
  總結(jié)
  可以看出 Junit 是一個(gè)簡(jiǎn)單而又強(qiáng)大的庫(kù),不然不會(huì)經(jīng)久不衰。其簡(jiǎn)單的實(shí)現(xiàn)但又強(qiáng)大的功能已經(jīng)基本滿足我們絕大多數(shù)的需求。但在這里還有一個(gè)疑問(wèn)是不知道 Junit 是如何繼承到 Android Studio 的 IDE 中,并是如何直接調(diào)用我們的測(cè)試方法或者測(cè)試類的?

上一頁(yè)12下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd
主站蜘蛛池模板: 老司机午夜性大片 | 在线看片一区 | 天天操操操操 | 日韩精品在线看 | 欧美播放 | 小明在看看永久免费平台 | 毛片网站视频 | 午夜婷婷网 | 精品在线观看国产 | 日韩中文欧美 | 亚洲成人在线网 | 狠狠插网站 | 黄色成人毛片 | 老司机免费看 | 26uuu欧美视频在线观看 | 成年视频免费 | aaa一级黄色片 | 国产日韩欧美亚洲精品95 | 成人一级毛片 | 欧美日韩另类国产 | 一级毛片在线视频 | 国产成人精品免费视频动漫 | 一个人看的www免费观看视频 | 韩国在线观看免费观看影院 | 成人不卡视频 | 亚洲an日韩专区在线 | 国产精品久久成人影院 | 日韩一区二区三区免费 | 国产啪视频免费视频观看视频 | 涩视频成人永久免费观看网站 | 久久亚洲不卡一区二区 | 黄色免费看片网站 | 青青草国产青春综合久久 | 欧美日韩中文字幕免费不卡 | 欧美一级黄色片在线观看 | 日日摸夜夜添欧美一区 | 精品一区二区三区在线观看视频 | 午夜高清免费观看视频 | 成人影视在线观看 | 99精品欧美一区二区三区 | 欧美亚洲另类一区中文字幕 |