junit源码解析总结
前面的博客我们也已经整理到了,我们使用junit38,在写测试类的时候我们的测试类必须继承TestCase。这个所有测试类的父类在junit.framework包下面。
前面我们的整理都是说直接在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中用的一些设计模式。
junit源码解析总结的更多相关文章
- junit源码解析--核心类
JUnit 的概念及用途 JUnit 是由 Erich Gamma 和 Kent Beck 编写的一个开源的单元测试框架.它属于白盒测试,只要将待测类继承 TestCase 类,就可以利用 JUnit ...
- junit源码解析--初始化阶段
OK,我们接着上篇整理.上篇博客中已经列出的junit的几个核心的类,这里我们开始整理junit完整的生命周期. JUnit 的完整生命周期分为 3 个阶段:初始化阶段.运行阶段和结果捕捉阶段. 这篇 ...
- junit源码解析--捕获测试结果
OK,前面的博客我们整理了junit运行完了所有的测试用例,那么OK了,现在开始该收集测试结果了. 在这最后一步中,junit主要是玩一个类,TestResult.这里类中封装了几个参数,在初始化这个 ...
- junit源码解析--测试驱动运行阶段
前面的博客里面我们已经整理了junit的初始化阶段,接下来就是junit的测试驱动运行阶段,也就是运行所有的testXXX方法.OK,现在我们开始吧. 前面初始化junit之后,开始执行doRun方法 ...
- JUnit源码分析 - 扩展 - 自定义RunListener
RunListener简述 JUnit4中的RunListener类用来监听测试执行的各个阶段,由RunNotifier通知测试去运行.RunListener与RunNotifier之间的协作应用的是 ...
- Mybatis 系列8-结合源码解析select、resultMap的用法
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- Mybatis源码解析,一步一步从浅入深(一):创建准备工程
Spring SpringMVC Mybatis(简称ssm)是一个很流行的java web框架,而Mybatis作为ORM 持久层框架,因其灵活简单,深受青睐.而且现在的招聘职位中都要求应试者熟悉M ...
- Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码
在文章:Mybatis源码解析,一步一步从浅入深(一):创建准备工程,中我们为了解析mybatis源码创建了一个mybatis的简单工程(源码已上传github,链接在文章末尾),并实现了一个查询功能 ...
- Collections.unmodifiableMap,Collections.unmodifiableList,Collections.unmodifiableSet作用及源码解析
在文章:Mybatis源码解析,一步一步从浅入深(五):mapper节点的解析中mybatis的源码中用到了Collections.unmodifiableList方法,其实还有unmodifiabl ...
随机推荐
- Mac下jenkins用户权限配置错误,导致登录时提示:没有Overall/read权限
由于初次接触jenkins,于是在搭建好jenkins以后,想要对用户进行管理,于是乎开始在系统管理->configure Global Security里设置用户的权限. 在启用安全-> ...
- console报错类型
常见 console报错 Error 错误 EvalError 全局错误 RangeError 引用(范围)错误 ReferenceError 参数(参考)错误 SyntaxError 语法错误 ty ...
- Python 浅析线程(threading模块)和进程(process)
线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 进程与线程 什么 ...
- 8、ABPZero系列教程之拼多多卖家工具 添加手机注册登录功能
现在网站基本都用手机注册,很少用邮箱注册,本篇内容比较多,代码我会尽量加备注,有些操作需要连续添加几个文件才不报错,如果VS显示错误,请继续后续步骤. 前面已经有一篇文章讲到集成短信发送模块:http ...
- 002_JS基础_JavaScript基础语法01
2.1 注释 单行注释: 在某一行使用"//"(两条斜线)可以把斜线之后的内容进行注释:多行注释: 使用"/* 这是要注释的内容 */"可以进行多行注释: /* ...
- Java编程思想读书笔记(二)【一切都是对象】
begin 2018年1月9日17:06:47 第二章 一切都是对象 Java语言假设我们只进行面向对象的程序设计. 2.1 用引用操纵对象 每种编程语言都有自己的操纵内存元素的方式 操纵内存元素的方 ...
- oracle如何导出和导入数据库表
oracle如何导出和导入数据库表 oracle如何将项目中的表导出后在导入自己的数据库中,这是一个完整的操作,对于数据库备份或在本地查看数据验证数据进场用到,一般情况下我都用dos黑窗口进行操作,简 ...
- 微信【跳一跳】 opencv视觉识别 + 物理外挂
视频连接:http://v.youku.com/v_show/id_XMzMyNDQxNTA0OA==.html?spm=a2h3j.8428770.3416059.1 初入门C++ 与 opencv ...
- (a == 1 && a == 2 && a == 3),何时为true?
今天浏览一些技术网站,看到这个题目.虽然觉着代码这么写的可能性低之又低,但是却也考验对js了解的程度. 在 JavaScript 中 (a ==1 && a== 2 && ...
- docfx(二)
1. 初始化一个docfx项目 1.创建一个文件夹D:\docfx_walkthrough 2.运行cmd 到该文件下执行命令D:\docfx_walkthrough 3.输入命令 docfx ini ...