【Java 语言生态篇】Junit 测试单元
01 概述 |
JUnit是一个由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是白盒测试。JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。[1]
JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java
语言)。它包括以下特性:
1、用于测试期望结果的断言(Assertion)
2、用于共享共同测试数据的测试工具
3、用于方便的组织和运行测试的测试套件
4、图形和文本的测试运行器
测试一般分为:单元测试、集成测试(主要看一块代码加进去后,系统会不会有问题)、验收测试和压力测试。在大点的公司开发
人员每天上班后,第一件事情就是从svn上把自己负责的代码checkout下来,然后运行单元测试,如果单元测试通过,那么说明自己的
代码没有问题,然后就在代码块上修改与添加,完成后再用junit进行测试,测试完成后如果没有问题,那么就把相应的代码块提交给
svn上。[2]
02 Junit配置 |
环境:Eclipse 中配置junit,
- 选择项目Junit4(在Package Explorer中)
- 右击鼠标
- 选择properties
- 选择Java Build Path (在左边的菜单中)
- 在右边选择标签 Libraries
- 单击按钮“Add Library”
- 选择JUnit , 单击按钮 “Next>”
- 选择JUnit library version 为: JUnit4
- 单击按钮“Finish”
- 单击按钮 “OK”
或手动 添加Junit.jar和hamcrest-core-xx.jar,hamcrest-library-xx.jar (或hamcrest-all-xx.jar)。(建议手动添加,在eclipse中通过前一种方法只引入Junit-xx.jar 和 hamcrest-core-xx.jar)
03 Junit3 和 Junit4的区别 |
- Junit3必须引入和继承TestCase
- Junit3 测试方法必须以test开头
- Junit3 测试方法前后的执行方法必须名为setUp() 和 tearDown()
- Junit4 不需要引入和继承TestCase。采用注解,在方法前加入@Test
- Junit4 测试方法不需要强制为test开头
- Junit4 测试方法前后执行方法不需要强制命名为setUp() 和 tearDown() ,只需要添加注解@Before和@After
- Junit4 中添加了异常测试
04 Junit4的几个常用注解[3] |
Junit 4 的单元测试用例执行顺序为:
@BeforeClass –> @Before –> @Test –> @After –> @AfterClass;
每一个测试方法的调用顺序为:@Before –> @Test –> @After。
--------------------------------------------------------------------
- @Before:初始化方法,在任何一个测试执行之前必须执行的代码;
- @After:释放资源,在任何测试执行之后需要进行的收尾工作。在每个测试方法执行之后执行一次,该annotation只能修饰public void 方法;
- @Test:测试方法,表明这是一个测试方法。在Junit中将会自动被执行。该annotation只能够修饰public void 方法。对于方法的声明也有如下要求:名字可以随便取,没有任何限制,但是返回值必须为void,而且不能有任何参数。如果违反这些规定,会在运行时抛出一个异常。至于方法内该写些什么,那就要看你需要测试些什么了;在这里可以测试期望异常和超时时间,如 @Test(timeout = 100):我们给测试函数设定一个执行时间,超过了这个时间(100毫秒),它们就会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时,这样你就可以发现这些Bug了。
- @Ignore:忽略的测试方法,标注的含义就是“某些方法尚未完成,暂不参与此次测试”;这样的话测试结果就会提示你有几个测试被忽略,而不是失败。一旦你完成了相应函数,只需要把@Ignore标注删去,就可以进行正常的测试。
- @BeforeClass:针对所有测试,只执行一次,且必须为public static void;
- @AfterClass:针对所有测试,将会在所有测试方法执行结束后执行一次,且必须为public static void;
05 hamcrest 和 testSuite 介绍[4] |
hamcrest就是专门为增强junit来提供的框架。Junit中,主要使用assert做一些基本的判断。但很多时候使用assert做判断,并不方便,如果要判断某几个值是否为true或false,这时使用hamcrest来判断就会方便许多。
在一个项目中,可能有很多的测试类,如果每个测试类都要点击运行,那么成百上千个类都需要测试,这会是个比较繁重的工作,这时可以使用可以使用junit的jar包中提供的Suite来解决这个问题。
06 综合实例 |
TestCalcuate类
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*; import org.junit.Before;
import org.junit.Test; public class TestCalcuate {
Calcuate cal;
@Before
public void setUp(){
cal=new Calcuate();
}
@Test
public void testAdd(){
int rel=cal.add(22, 33);
assertEquals("加法存在问题",rel, 55);
} @Test
public void testMinus(){
int rel=cal.minus(33, 11);
assertEquals("减法存在问题",rel,22);
}
@Test(expected=ArithmeticException.class)
public void testDivid(){
int rel=cal.divide(22, 0);
assertEquals("除法存在问题",rel,2);
}
@Test
public void testMul(){
int rel=cal.mul(10, 20);
assertEquals("乘法存在问题", rel,200);
}
@Test(timeout=1000)
public void testTime(){
try{
Thread.sleep(200);
}catch(Exception e){
e.printStackTrace();
}
int rel=cal.mul(10, 20);
assertEquals("乘法存在问题", rel,200);
} @Test
public void testHam(){
assertThat(50, allOf(greaterThan(49),lessThan(60)));
assertThat(60, allOf(greaterThan(40),lessThan(90)));
assertThat("like.txt", endsWith(".txt"));
}
}
TestA类
import org.junit.*;
public class TestA {
@Test
public void testA(){
System.out.println("testA");
}
}
TestB类
import org.junit.*;
public class TestB {
@Test
public void testB(){
System.out.println("testB");
}
}
TestSuite类
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class)
@SuiteClasses({TestA.class,TestB.class,TestCalcuate.class})
public class TestSuite {
@Test
public void testSuite(){
System.out.println("testSuite");
}
}
07 其它问题 |
1、测试原则:[4]
- 建议创建一个专门的source folder--->test来编写测试类代码。上面例子就新建一个test的资源包。
- 测试类的包应该保持和需要测试的类一致。上面的例子中Calcuate类在src/cn/whp/util包中,相应的测试类就在test/cn/whp/util中。
- 测试单元中的每个测试方法都必须可以独立执行,不相互依赖,没有顺序。
2、用junit在进行单元测试的时候,使用assertThat方法,发现hamcrest的greaterThan等方法无法识别【说是没有定义】,而且无法静态引用到Matchers类【import static org.hamcrest.Matchers.*;】 [5]
原因:因为junit默认只会依赖hamcrest-core-1.3包,而实际上hamcrest还有一个hamcrest-library.jar用来放置很多工具
参考文献 |
[1] 百度百科 Junit
[2] 悔海 http://huihai.iteye.com/blog/1986568
[3] 小倩的博客 http://blog.sina.com.cn/s/blog_8354dda80101ee8v.html
[4] 悔海 http://huihai.iteye.com/blog/1994270
[5] http://www.fwqtg.net/junit-使用hamcrest的matcher找不到的问题(比如greaterthan).html
【Java 语言生态篇】Junit 测试单元的更多相关文章
- java中如何使用Junit测试
java中如何使用Junit测试 一.总结 一句话总结:a.单元测试的测试代码在test文件夹下,和源码不在同一个文件夹下 b.测试的类方法都以test开头,后面接要测试的类或者方法的名字 1.JUn ...
- 自动配置的Springboot内junit测试单元不能运行
解决测试单元不能运行 问题:测试单元的 @Test 前面没有运行图标 解决 IDEA内:File - Setting - Plugins:搜到JUnitGenerator2.0,安装,重启IDEA 光 ...
- JAVA语言程序设计课后习题----第二单元解析(仅供参考)
1 注意不同类型转换 import java.util.Scanner; public class Ch02 { public static void main(String[] args) { Sc ...
- JAVA语言程序设计课后习题----第一单元解析(仅供参考)
1 本题是水题,基本的输出语句 public class test { public static void main(String[] args) { // 相邻的两个 "" 要 ...
- Tars | 第3篇 Tars中期汇报测试文档(Java语言实现Subset路由规则)
目录 前言 1. 任务介绍 2. 测试模拟方案 2.0 *前置工作 2.1 添加路由规则 2.2 添加存活节点 2.3 [输出]遍历输出当前存活节点 2.4 [核心]对存活节点按subset规则过滤 ...
- Java Junit测试框架
Java Junit测试框架 1.相关概念 Ø JUnit:是一个开发源代码的Java测试框架,用于编写和运行可重复的测试.它是用于单元测试框架体系xUnit的一个实例(用于java语言).主要 ...
- Java进阶(五)Junit测试
我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的.但是,我们同时应该确保每一个函数 ...
- 0031 Java学习笔记-梁勇著《Java语言程序设计-基础篇 第十版》英语单词
第01章 计算机.程序和Java概述 CPU(Central Processing Unit) * 中央处理器 Control Unit * 控制单元 arithmetic/logic unit /ə ...
- java中使用junit测试
最初写代码只要功能走通就不管了,然后如果出了什么问题再去修改,这是因为没做测试的工作.测试其实很简单. 1.准备 当前使用idea编写代码,用maven构建工程,使用maven的test功能来进行批量 ...
随机推荐
- 获取安装后Apache、MySQL、Nginx、PHP编译时参数
# cat /usr/local/apache2/build/config.nice //获取Apache编译时的参数 #!/bin/sh # #Created by configure & ...
- zookeeper客户端 和服务器连接时版本问题
在使用kafka 和zookeeper 实现实时分析程序时,由于zookeeper部署版本和分析程序导入jar包的版本不一致,导致了当实时分析程序从远程服务器连接kafka集群的zookeeper时报 ...
- RMQ(区间求最值)
1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A.回答若干询问RMQ(A,i,j)(i,j<=n).返回数列A ...
- Win7无法启动,缺少系统文件ecache.sys怎么办
网上下载ecache.sys这个文件放到System32目录下即可 http://www.wenjian.net/file/ecache.sys.html
- OSX:设置用户默认浏览器
近期我们遇到的情况是,须要统一设置用户的默认浏览器为Google Chrome.而系统默认的是Safari. 这个设置是系统Launch Services基于用户管理的. 意思就是说,即便是改动了系统 ...
- 网络电台(WIZ550io)
网络电台是用WIZ550io(内嵌MAC地址)和ATMEGA1284(Flash 128K,EEPROM4K)制作的.用户可注冊多达80个无线电广播. 无线电广播的注冊可在内嵌网页中进行. 网络电台的 ...
- 【Excle数据透透视表】如何删除数据透视表
选中区域A4:C17,在键盘上按DELETE键删除,结果提示: 那么如何删除呢? 解决方案 选中整个数透视表,再删除 具体操作: 选中整个数据透视表→DELETE 注意:删除之后,源数据不会受到影响
- fastJson 转换日期格式
第一种方法: JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd"; String str = JSON.toJSONString(user,Seria ...
- UML的基本图(三)
An artifact diagram shows the physical constituents of a system on the computer. Artifacts includ ...
- Jconsole 工具介绍和使用方法
http://chain.blog.163.com/blog/static/14084852320117934024410/ JConsole是一个基于JMX的GUI工具,JDK自带小工具 h ...