junit源码解析总结
2016-02-04 11:31
375 查看
前面的博客我们也已经整理到了,我们使用junit38,在写测试类的时候我们的测试类必须继承TestCase。这个所有测试类的父类在junit.framework包下面。
前面我们的整理都是说直接在IDE中直接运行测试类,右击然后run as junit。当然我们还可以自己写main方法来运行测试,其实都一样。
OK,现在我们来写一个例子,直接运行测试类的main方法来跑测试。代码如下:
前面的3篇博客,我已经认真的整理过了junit测试的3个步骤,这里做一个总结。
我们来自己写的测试类上的一个测试方法打一个断点,然后看下eclipse中junit方法调用的情况。
OK,上面的2张图很直接了说明了测试开始到测试方法真正被执行的所有的过程,我在这里也不做赘述了。之后的结果收集,无疑就是在每个测试类中传递一个TestResult类,通过printerWriter来打印日志而已,这里也不在赘述了。
在前面的演示junit源码过程中,我自己也修改了好多的控制台输出。最后这里写2个测试例子,来一起看下控制台的输出,整体回顾下junit的整个测试过程好了。
2个测试类代码如下:
以下是控制台输出:
OK,junit源码解析就先整理到这里吧。接下来,我会整理junit4中的一些高级特性,之后再整理下junit中用的一些设计模式。
前面我们的整理都是说直接在IDE中直接运行测试类,右击然后run as junit。当然我们还可以自己写main方法来运行测试,其实都一样。
OK,现在我们来写一个例子,直接运行测试类的main方法来跑测试。代码如下:
package org.linkinpark.commons.textui; import org.linkinpark.commons.framework.TestCase; import org.linkinpark.junit.Assert; /** * @创建作者: LinkinPark * @创建时间: 2016年2月4日 * @功能描述: 写一个测试类,用main方法来驱动测试。 */ public class LinkinTest2 extends TestCase { public void test1() { Assert.assertEquals("1", "1"); } /** * @创建时间: 2016年2月4日 * @相关参数: @param args * @功能描述: 调用TestRunner来run测试。 */ public static void main(String[] args) { TestRunner.run(LinkinTest2.class); } }
前面的3篇博客,我已经认真的整理过了junit测试的3个步骤,这里做一个总结。
我们来自己写的测试类上的一个测试方法打一个断点,然后看下eclipse中junit方法调用的情况。
OK,上面的2张图很直接了说明了测试开始到测试方法真正被执行的所有的过程,我在这里也不做赘述了。之后的结果收集,无疑就是在每个测试类中传递一个TestResult类,通过printerWriter来打印日志而已,这里也不在赘述了。
在前面的演示junit源码过程中,我自己也修改了好多的控制台输出。最后这里写2个测试例子,来一起看下控制台的输出,整体回顾下junit的整个测试过程好了。
2个测试类代码如下:
package org.linkinpark.commons.textui; import org.linkinpark.commons.framework.TestCase; import org.linkinpark.junit.Assert; public class LinkinTest1 extends TestCase { public LinkinTest1(String methodName) { super(methodName); } public void setUp() { System.out.println("这里是自己定义的setUp()"); } public void tearDown() { System.out.println("这里是自己定义的tearDown()"); } public void testLinkin4Normal() { System.out.println("======>开始执行被测试代码===="); final String str = "林肯:这里是自己的被测试的正确代码"; System.out.println(str); System.out.println("======>结束执行被测试代码===="); Assert.assertEquals(str, str); } public void testLinkin8Error() { System.out.println("======>开始执行被测试代码===="); final String str = "林肯:这里是自己的被测试的错误代码"; System.out.println(str); System.out.println("======>结束执行被测试代码===="); Assert.assertEquals("这里是我期望的错误逻辑输出", str); } }
package org.linkinpark.commons.textui; import org.linkinpark.commons.framework.TestCase; import org.linkinpark.junit.Assert; public class LinkinTest1 extends TestCase { public LinkinTest1(String methodName) { super(methodName); } public void testLinkin() { Assert.assertTrue(true); } }
package org.linkinpark.commons.textui; import org.linkinpark.commons.framework.Test; import org.linkinpark.commons.framework.TestCase; import org.linkinpark.commons.framework.TestSuite; public class LinkinTestAll extends TestCase { public static Test suite() { TestSuite suite = new TestSuite().addTestSuite(LinkinTest.class); return suite.addTest(new LinkinTest1("testLinkin")); } public static void main(String args[]) { TestRunner.run(suite()); } }
以下是控制台输出:
###########开始迭代运行整套测试,互相独立########### 第一步:框架开始打印日志==== ~~~~~~~~~~~~~~~~~~~~~~~ 第二步:框架开始运行测试==== 这里是自己定义的setUp() 框架开始执行测试,执行的方法是-->public void org.linkinpark.commons.textui.LinkinTest.testLinkin4Normal() ======>开始执行被测试代码==== 林肯:这里是自己的被测试的正确代码 ======>结束执行被测试代码==== 框架结束执行测试,执行的方法是-->public void org.linkinpark.commons.textui.LinkinTest.testLinkin4Normal() 这里是自己定义的tearDown() 第三步:框架结束运行测试==== ~~~~~~~~~~~~~~~~~~~~~~~ ###########开始迭代运行整套测试,互相独立########### 第一步:框架开始打印日志==== ~~~~~~~~~~~~~~~~~~~~~~~ 第二步:框架开始运行测试==== 这里是自己定义的setUp() 框架开始执行测试,执行的方法是-->public void org.linkinpark.commons.textui.LinkinTest.testLinkin8Error() ======>开始执行被测试代码==== 林肯:这里是自己的被测试的错误代码 ======>结束执行被测试代码==== 这里是自己定义的tearDown() 第三步:框架结束运行测试==== ~~~~~~~~~~~~~~~~~~~~~~~ KAO,有报错啦!!! ###########开始迭代运行整套测试,互相独立########### 第一步:框架开始打印日志==== ~~~~~~~~~~~~~~~~~~~~~~~ 第二步:框架开始运行测试==== ====框架执行默认的setUp==== 框架开始执行测试,执行的方法是-->public void org.linkinpark.commons.textui.LinkinTest1.testLinkin() 框架结束执行测试,执行的方法是-->public void org.linkinpark.commons.textui.LinkinTest1.testLinkin() ====框架执行默认的tearDown==== 第三步:框架结束运行测试==== ~~~~~~~~~~~~~~~~~~~~~~~ 第四步:框架开始统计时间==== 耗时:0.024秒 遗憾:!一共有1个错误: 1) testLinkin8Error(org.linkinpark.commons.textui.LinkinTest)org.linkinpark.junit.ComparisonFailure: 期望是:<[这里是我期望的错误逻辑输出]> 结果却是:<[林肯:这里是自己的被测试的错误代码]> at org.linkinpark.junit.Assert.assertEquals(Assert.java:104) at org.linkinpark.junit.Assert.assertEquals(Assert.java:135) at org.linkinpark.commons.textui.LinkinTest.testLinkin8Error(LinkinTest.java:42) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at org.linkinpark.commons.framework.TestCase.runTest(TestCase.java:117) at org.linkinpark.commons.framework.TestCase.runBare(TestCase.java:53) at org.linkinpark.commons.framework.TestResult$1.protect(TestResult.java:251) at org.linkinpark.commons.framework.TestResult.runProtected(TestResult.java:154) at org.linkinpark.commons.framework.TestResult.run(TestResult.java:254) at org.linkinpark.commons.framework.TestCase.run(TestCase.java:42) at org.linkinpark.commons.framework.TestSuite.runTest(TestSuite.java:322) at org.linkinpark.commons.framework.TestSuite.run(TestSuite.java:316) at org.linkinpark.commons.framework.TestSuite.runTest(TestSuite.java:322) at org.linkinpark.commons.framework.TestSuite.run(TestSuite.java:316) at org.linkinpark.commons.textui.TestRunner.doRun(TestRunner.java:113) at org.linkinpark.commons.textui.TestRunner.doRun(TestRunner.java:98) at org.linkinpark.commons.textui.TestRunner.run(TestRunner.java:58) at org.linkinpark.commons.textui.LinkinTestAll.main(LinkinTestAll.java:18) 第五步:框架开始统计结果==== 结果:AU,出错啦! Tests run: 3, Failures: 0, Errors: 1 第六步:框架结束整个测试====
OK,junit源码解析就先整理到这里吧。接下来,我会整理junit4中的一些高级特性,之后再整理下junit中用的一些设计模式。
相关文章推荐
- 无线无法上网, windows7 wlan autoconfig无法启动 错误: 1068 依赖服务或组无法启动
- Android中AsyncTask的简单用法(简化版)
- junit源码解析总结
- Zabbix自带模板监控MySQL
- python 静态方法和类方法
- [LeetCode]Q3. Longest Substring Without Repeating Characters
- tkinter Menu
- poj1862Stripies【哈夫曼合并木棍】
- 数据结构基础之队列
- fedora 23问题、fedoa 22 virtualbox 5.0安装
- spring代理注解<aop:aspectj-autoproxy />
- MySql数据引擎简介与选择方法
- unity3D中使用Socket进行数据通信(一)
- 详解Android中AsyncTask的使用
- android *** AlertDialog
- Tian Ji -- The Horse Racing
- (x)trqS.69
- 杭电1075——What Are You Talking About(字典树应用)
- 如何添加或删除ubuntu用户和组【转】
- lua 类实现