Junit的使用和源码分析
Junit是一个编写可重复测试的Java测试框架,代码编写非常有技巧性,值得反复阅读。
跟着官方文档学习Junit
官方文档往往是学习最好的资料。
简单测试例子
1 | public class FirstTest { |
这只是简单的例子,实际上的单元测试要比这个复杂的多,在实际应用上单元测试十分有必要,编写后台代码时能够尽快检验代码的正确性。
Assertions 断言
Junit提供了所有基本数据类型,Object类和数组的断言,参数是 预期值后面是实际值,可选项,第一个参数可以是断言失败时输出的内容,与其他断言稍有不同的是,AssertThat的参数是 失败输出的内容,实际值和一个Matcher
Object。
1 | public class AssertTests { |
异常测试
下面分为两种方式来完成对异常的测试
期待的异常
如何检测程序是否如期的抛出异常,junit可以使用注解的参数来实现。
1 | (expected = IndexOutOfBoundsException.class) |
深入的异常
上述方法对于简单的情况很有用,但它有其局限性。例如,您无法在异常中测试消息的值,也无法在抛出异常后测试域对象的状态
- try/catch 语句
1 |
|
- rule 规则
1 |
|
Matchers and assertThat [ 匹配器和assertThat ]
新加入了assertThat
断言机制 assertThat([value], [matcher statement]);
1 | assertThat(x, is(3)); |
assertThat
更具有可读性和可输入性,并且有组合性,就像 is(not(4))
任何Machers都可以组合起来使用
以前的assertEquals等也是可以用的,assertThat
在使用Matchers的时候需要使用 import static org.hamcrest.CoreMatchers.*;
来引用。里面的方法非常多。。
junit源码跟读
使用junit流程
使用继承自TestCase类
下面通过运行junit的自带的test,源程序为:
1 | /** |
来看main方法,使用 junit.textui.TestRunner.run(suite());
使用TestRunner运行test。首先先来看suite方法,有两种方法
- 静态的,需要手动在testSuite中添加test。
- 动态的,静态需要实现TestCase的runTest方法。而动态的只需要返回 TestSuite(SimpleTest.class);,下面来看这个TestSuite类
testSuite实际上就是运行test的集合,使用vector来存储test,其中这里使用到的TestSuite构造方法是:
1 | public TestSuite(final Class<?> theClass) { |
最后提到的 fTests.size() == 0
这里会发生warning 然后fail。这个fTests 已经再前面声明
了,声明方法是:private Vector<Test> fTests = new Vector<Test>(10);
在对每个声明的方法循环的时候,使用到 addTestMethod
方法,来对每个方法进行处理。
1 | private void addTestMethod(Method m, List<String> names, Class<?> theClass) { |
使用createTest来针对test方法创建一个Test类
1 | static public Test createTest(Class<?> theClass, String name) { |
经过以上的步骤获得了这个类中及其父类中的所有方法的Test。
使用testRunner.run运行test
1 | public static void main(String[] args) { |
运行Test的核心方法 返回TestResult返回结果。
1 | /** |
在resultPriter中使用继承TestListener中的startTest方法。
1 | public void startTest(Test test) { |
如果测试失败,则最终将被runProtected中的try/catch捕捉到后输出错误信息。
1 | public void runProtected(final Test test, Protectable p) { |
经过以上的步骤执行完一个test。