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。