关于JUnit
目录
一、单元测试
二、在LAB中的常用方法
一、单元测试
什么是单元测试呢?单元测试就是针对最小的功能单元编写测试代码。Java程序最小的功能单元是方法,因此,对Java程序进行单元测试就是针对单个Java方法的测试。
单元测试有什么好处呢?在学习单元测试前,我们可以先了解一下测试优先的编程。
所谓测试优先的编程,是指先编写接口,紧接着编写测试。编写完测试后,我们才开始真正编写实现代码。在编写实现代码的过程中,一边写,一边测,什么时候测试全部通过了,那就表示编写的实现完成了:

这就是TDD(Test-driven development)
那么我们为什么要单独编写测试代码,而不是像学c语言的时候一样,在main()中输出,观察结果是否是自己想要的呢?因为这有以下的缺点:
1. 只有一个main()函数,不能把测试代码分离
2. 没有输出测试结果和期望结果,只能和自己记在本本上的数据进行比对
3. 很难编写一组通用的代码
Java给出了用于测试的框架,也就是JUnit。
JUnit是一个开源的Java语言的单元测试框架,专门针对Java设计,使用最广泛。JUnit是事实上的单元测试的标准框架,任何Java开发者都应当学习并使用JUnit编写单元测试。
使用JUnit编写单元测试的好处在于,我们可以非常简单地组织测试代码,并随时运行它们,JUnit就会给出成功的测试和失败的测试,还可以生成测试报告,不仅包含测试的成功率,还可以统计测试的代码覆盖率,即被测试的代码本身有多少经过了测试。对于高质量的代码来说,测试覆盖率应该在80%以上。
二、在LAB中的常用方法
上一个博客已经给出如何使用JUnit功能,这次来说说需要掌握哪些知识可以应对LAB。
一个测试方法的代码大概应该是这样的
import static org.iunit.Assert.*;
import org.junit.Test;
public class FactorialTest {
@Test
public void factTest() {
assertEquals(1, Factorial.fact(1));
assertEquals(2, Factorial.fact(2));
assertEquals(6, Factorial.fact(3));
assertEquals(3628800, Factorial.fact(10));
assertEquals(2432902008176640000L, Factorial.fact(20));
}
}
命名一般都是对应方法和类名后面加Test,必须是public void,测试方法前要加注解@Test,表明这是测试方法。
assertEquals(expected, actual)
是最常见的方法,用来比较返回值和期望值是否相同。还有其他方法,比如
assertEqual(a,b,[msg='测试失败时打印的信息']) // 断言a和b是否相等,相等则测试用例通过。 assertNotEqual(a,b,[msg='测试失败时打印的信息']) //断言a和b是否相等,不相等则测试用例通过。 assertTrue(x,[msg='测试失败时打印的信息']) //断言x是否True,是True则测试用例通过。 assertFalse(x,[msg='测试失败时打印的信息']) //断言x是否False,是False则测试用例通过。 assertIs(a,b,[msg='测试失败时打印的信息']) //断言a是否是b,是则测试用例通过。 assertNotIs(a,b,[msg='测试失败时打印的信息']) //断言a是否是b,不是则测试用例通过。 assertIsNone(x,[msg='测试失败时打印的信息']) //断言x是否None,是None则测试用例通过。 assertIsNotNone(x,[msg='测试失败时打印的信息']) //断言x是否None,不是None则测试用例通过。 assertIn(a,b,[msg='测试失败时打印的信息']) //断言a是否在b中,在b中则测试用例通过。 assertNotIn(a,b,[msg='测试失败时打印的信息']) //断言a是否在b中,不在b中则测试用例通过。 assertIsInstance(a,b,[msg='测试失败时打印的信息']) //断言a是是b的一个实例,是则测试用例通过。 assertNotIsInstance(a,b,[msg='测试失败时打印的信息']) //断言a是是b的一个实例,不是则测试用例通过。
这些方法都在
org.junit.Assert;
这个包里
使用浮点数时,由于浮点数无法精确地进行比较,因此,我们需要调用
assertEquals(double expected, double actual, double delta)
这个重载方法,指定一个误差值:
assertEquals(0.1, Math.abs(1 - 9 / 10.0), 0.0000001);
关于JUnit的更多相关文章
- 记一个mvn奇怪错误: Archive for required library: 'D:/mvn/repos/junit/junit/3.8.1/junit-3.8.1.jar' in project 'xxx' cannot be read or is not a valid ZIP file
我的maven 项目有一个红色感叹号, 而且Problems 存在 errors : Description Resource Path Location Type Archive for requi ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- AndroidStudio — Error:Failed to resolve: junit:junit:4.12错误解决
原博客:http://blog.csdn.net/u013443865/article/details/50243193 最近使用AndroidStudio出现以下问题: 解决:打开app下的buil ...
- 「译」JUnit 5 系列:环境搭建
原文地址:http://blog.codefx.org/libraries/junit-5-setup/ 原文日期:15, Feb, 2016 译文首发:Linesh 的博客:环境搭建 我的 Gith ...
- [深入JUnit] 测试运行的入口
阅读前提 了解JUnit 对JUnit的内部实现有兴趣 不妨看看[深入JUnit] @Before, @After, @Test的秘密] 代码版本: junit 4.12代码搜索工具: http:// ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- 「译」JUnit 5 系列:架构体系
原文地址:http://blog.codefx.org/design/architecture/junit-5-architecture/ 原文日期:29, Mar, 2016 译文首发:Linesh ...
- 「译」JUnit 5 系列:基础入门
原文地址:http://blog.codefx.org/libraries/junit-5-basics/ 原文日期:25, Feb, 2016 译文首发:Linesh 的博客:JUnit 5 系列: ...
- 新手入门JUnit单元测试
首先将JUnit插件安装到Eclipse或myeclipse里面,编写完一个模块或者实体类的时候,直接右击,new一个JUnit项目,选择你想测试的实体类(模块),然后会自动生成一个类,这个类,我们将 ...
- [Android]使用自定义JUnit Rules、annotations和Resources进行单元测试(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5795091.html 使用自定义JUnit Rules.ann ...
随机推荐
- linux扩展与缩减lv大小
在线扩展lv 给vg添加新的pv并扩展lv大小 将新加磁盘生成pv pvcreate /dev/sdd 将pv加入vg vgextend vg_name /dev/sdd 先扩展lv物理边界,大小增加 ...
- 虚拟机中debian11修改控制台(console)分辨率|linux控制台分辨率|linux console resolution
实体机一般安装好驱动分辨率就没啥问题,而且个人pc也没有只用控制台的需求.但是虚拟机中不安装桌面的时候,默认的控制台分辨率常不能满足需求. 这个需求貌似也比较少,而且几乎搜到的文章大部分都是旧的,不能 ...
- 用有限差分估计(Finite Difference Estimate)解决地理坐标与平面像素坐标转换过程的误差造成风场粒子向量失真问题
下载NCEP的气象场grib2数据,风场是二维的向量,包含u和v两个分量.这个用经纬度投影到像素坐标会产生误差,直接绘制效果不太对:( 通过插值计算得到风场粒子的预测数据wind = interp ...
- 日常开发记录-Object函数的内置方法Object.entries
方法1: const data = { id: 1, name: "张三", age: 22 } let params = "" /* Object.entri ...
- KMS服务器 激活win 和 office
环境:Debian 9.5 (Google Cloud) 切换到root用户:sudo su wget --no-check-certificate https://github.com/teddys ...
- codeforces 1391E Pairs of Pairs dfs树的性质
https://codeforces.com/problemset/problem/1391/E 题意:给一个无向图,找出以下任意一种输出答案 1,长度>=n/2(上界)的简单路径(没有同一个点 ...
- 查看Windows操作系统编码方式
chcp 编码表: 代码页 国家(地区)或语言 437 美国 708 阿拉伯文(ASMO 708)720 阿拉伯文(DOS)850 多语言(拉丁文 I) 852 中欧(DOS) - 斯拉夫语(拉丁文 ...
- 一例OSS问题排查
某品牌OSS存储,使用IP+PORT可以正常访问.使用NG代理后,不论是IP还是域名访问都不支持SDK访问,但是使用S3客户端可以正常访问. 通过抓包对比发现,S3客户端如下 SDK访问抓包如下 判断 ...
- 羊了怎么居家办公?免费不限速的远控软件RayLink一解燃眉之急!!
近期疫情放开,各地症状不断的小阳人数量猛增(R君盼望大家早日转阴!!).不论是"羊"后居家,还是天选打工人被迫居家,远程控制公司电脑实现居家办公,成了大部分人的默契选择. 想远程控 ...
- JVMCFRE003 bad major version问题
项目启动异常日志 [21-11-18 23:46:58:166 CST] 00000020 DispatcherSer I org.springframework.web.servlet.Framew ...