junit4X系列源码--Junit4 Runner以及test case执行顺序和源代码理解
2016-02-06 13:00
465 查看
原文出处:http://www.cnblogs.com/caoyuanzhanlang/p/3534846.html。感谢作者的无私分享。
前一篇文章我们总体介绍了Junit4的用法以及一些简单的测试。之前我有个疑惑,Junit4怎么把一个test case跑起来的,在test case之前和之后我们能做些什么?
Junit4执行顺序是怎样的?带着这些问题,我写了这篇文章,仅供参考,不对之处,盼留言指正,感激万分。前一篇文章:【原创】Junit4详解一:Junit总体介绍
Junit4编译器在执行TestCase的过程中利用反射机制,以便我们可以对测试的开始过程中进行一些预处理,如读取元数据信息,拦截异常,数据库操作等,由于Junit4默认的测试执行器是:BlockJUnit4ClassRunner,我们以这个执行器粗略地做一些研究。在TestCase执行过程中,主要用到以下类,BlockJUnit4ClassRunner,ParentRunner,Statement,TestRule,Description,RunNotifier,InvokeMethod.以下简单做些解释。
1. BlockJUnit4ClassRunner:Junit4的默认测试执行器,它有之前版本的runner同样的行为,也就兼容了之前的runner。但是它是基于Statement,实现更加简单,允许用户在执行工作流中某个合适的点插入用户新的操作,基于这个runner的继承和重用都是可以的,这样能更加具有灵活性。它继承ParentRunner,Junit4要求,执行器的构造函数要把测试类传进来。这个类的实现了ParentRunner的runChild(真正执行测试的方法,每个测试方法都会执行runChild),describeChild(FrameworkMethod
method)(用来获取测试类的元数据信息,以及方法和类的信息),一些验证的方法,这些验证方法在ParentRunner构造的时候就会开始验证。另外一个比较重要的方法是:
methodBlock(FrameworkMethod method)
method里面包含当前要测试的方法。
这个方法的作用验证方法能否执行,然后把当前测试类的信息(当前类,测试的方法)传给InvokeMethod,以待后续测试方法的执行,接着获取当前类的元数据信息,保存起来。
2. ParentRunner:Junit4测试执行器的基类,它提供了一个测试器所需要的大部分功能。继承它的类需要实现:
protected abstract List<T> getChildren();
protected abstract Description describeChild(T child);
protected abstract void runChild(T child, RunNotifier notifier);
3. Statement:在运行期时,执行test case前可以插入一些用户动作,它就是描述这些动作的一个类。继承这个类要实现:
View
TestClass Code
执行的结果如下:
前一篇文章我们总体介绍了Junit4的用法以及一些简单的测试。之前我有个疑惑,Junit4怎么把一个test case跑起来的,在test case之前和之后我们能做些什么?
Junit4执行顺序是怎样的?带着这些问题,我写了这篇文章,仅供参考,不对之处,盼留言指正,感激万分。前一篇文章:【原创】Junit4详解一:Junit总体介绍
Junit4 runner总体介绍
Junit4编译器在执行TestCase的过程中利用反射机制,以便我们可以对测试的开始过程中进行一些预处理,如读取元数据信息,拦截异常,数据库操作等,由于Junit4默认的测试执行器是:BlockJUnit4ClassRunner,我们以这个执行器粗略地做一些研究。在TestCase执行过程中,主要用到以下类,BlockJUnit4ClassRunner,ParentRunner,Statement,TestRule,Description,RunNotifier,InvokeMethod.以下简单做些解释。
Junit4默认重要类简述,助于理解源代码
1. BlockJUnit4ClassRunner:Junit4的默认测试执行器,它有之前版本的runner同样的行为,也就兼容了之前的runner。但是它是基于Statement,实现更加简单,允许用户在执行工作流中某个合适的点插入用户新的操作,基于这个runner的继承和重用都是可以的,这样能更加具有灵活性。它继承ParentRunner,Junit4要求,执行器的构造函数要把测试类传进来。这个类的实现了ParentRunner的runChild(真正执行测试的方法,每个测试方法都会执行runChild),describeChild(FrameworkMethodmethod)(用来获取测试类的元数据信息,以及方法和类的信息),一些验证的方法,这些验证方法在ParentRunner构造的时候就会开始验证。另外一个比较重要的方法是:
methodBlock(FrameworkMethod method)
method里面包含当前要测试的方法。
这个方法的作用验证方法能否执行,然后把当前测试类的信息(当前类,测试的方法)传给InvokeMethod,以待后续测试方法的执行,接着获取当前类的元数据信息,保存起来。
2. ParentRunner:Junit4测试执行器的基类,它提供了一个测试器所需要的大部分功能。继承它的类需要实现:
protected abstract List<T> getChildren();
protected abstract Description describeChild(T child);
protected abstract void runChild(T child, RunNotifier notifier);
3. Statement:在运行期时,执行test case前可以插入一些用户动作,它就是描述这些动作的一个类。继承这个类要实现:
View
TestClass Code
执行的结果如下:
1 @ClassRule Method 2 @Rule method--TestRuleMethodImpl execute apply() 3 @Rule Method--StatementMethodImpl execute evaluate() 4 @BeforeClass setUpClass // 预备期结束 5 // 第一个测试方法开始到结束 6 @Rule Method 7 @Rule method--TestRuleMethodImpl execute apply() 8 @Rule property--TestRuleValueImpl execute apply() 9 @Rule property--StatementValueImpl execute evaluate() 10 @Rule Method--StatementMethodImpl execute evaluate() 11 @Before setUp 12 @Test test1() begin 13 @Test test1() execute during evaluate() 14 @Test test1() finished 15 @After tearDown 16 17 // 第二个方法开始到结束,我们可以在apply() 和 evaluate()这两个方法做一些操作。 18 @Rule Method 19 @Rule method--TestRuleMethodImpl execute apply() 20 @Rule property--TestRuleValueImpl execute apply() 21 @Rule property--StatementValueImpl execute evaluate() 22 @Rule Method--StatementMethodImpl execute evaluate() 23 @Before setUp 24 @Test test2() begin 25 @Test test2() execute during evaluate() 26 @Test test2() finished 27 @After tearDown 28 29 // 第三个方法,这三个方法执行的顺序是随机的,当然Junit4提供了某些排序方式可以处理 30 @Rule Method 31 @Rule method--TestRuleMethodImpl execute apply() 32 @Rule property--TestRuleValueImpl execute apply() 33 @Rule property--StatementValueImpl execute evaluate() 34 @Rule Method--StatementMethodImpl execute evaluate() 35 @Before setUp 36 @Test test3() begin 37 @Test test3() execute during evaluate() 38 @Test test3() finished. 39 @After tearDown 40 41 @AfterClass tearDownClass
相关文章推荐
- Java之旅(二)--- ServletContext
- 获取 spring 的 bean 方法总结
- 如何在CSDN博客中的所贴的代码进行【代码块】显示
- java 中缀转后缀(逆波兰)
- [Excel VBA]快捷键如何设置?
- java 双向链表实现列表
- HV000183: Unable to load 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on th
- PHP错误汇总笔记
- Python之二维数组N*N顺时针旋转90度
- [c++基础]valarray模板详解
- 栈的简单实现——使用C++容器库(STL Stack)
- [Excel VBA]状态栏如何显示文字 ?
- Java四种线程池的使用
- C++面向对象编程:对象的内存分配与静态成员
- [Excel VBA]文件夹的选择画面如何打开?
- java之发邮件
- 1012. The Best Rank (25)
- Python3.x和Python2.x的区别,以及python2代码转python3
- Java入门:输入输出
- C++动态调用DLL