博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Junit3.8详解
阅读量:3978 次
发布时间:2019-05-24

本文共 2709 字,大约阅读时间需要 9 分钟。

   开篇

   Junit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。另外Junit是在极限编程和重构(refactor)中被极力推荐使用的工具,因为在实现自动的情况下可以大大的提高开发的效率。

  初体验

    我们刚刚完成了一个用于加减乘除的Calcalater类,下一步我们需要用单元测试去测试这个Calcalater类。

package com.tgb.junit3;/** * 数字计算 *  * @author quwenzhe *  */public class Calculater {	public int add(int a, int b) {		return a + b;	}	public int minus(int a, int b) {		return a - b;	}	public int multiply(int a, int b) {		return a * b;	}	public int divide(int a, int b) throws Exception {		if (b == 0) {			throw new Exception("除数不能为零!");		}		return a / b;	}

   当我们还不知道有Junit这种神器存在时,我们肯定选择用main方法去挨个测试Calculater类中的各个方法执行。这是个相当的繁琐的过程,而且不方便维护,下面我们看看Junit是如何完成单元测试的。

   在项目目录下新建Source Folder,在Source Folder下创建一个和Calculater所在包相同的包名。效果如下:

   

这么做的目的是使Calculater.java和CalculaterTest.java编译后的.class文件在bin的同一目录下,Calculater.java在使用Calculater.java时不再添加对其包的引用。

创建测试Calculater.java的单元测试类CalculaterTest.java,该类继承TestCase父类:

package com.tgb.junit3;import junit.framework.Assert;import junit.framework.TestCase;/** * 在junit3.8中测试类必须继承TestCase父类 *  * keep the bar green to keep to code clean *  * 单元测试不是证明您是对的,而是证明您没有错误 * @author quwenzhe *  */public class CalculaterTest extends TestCase {	/**	 * 在Junit3.8中,测试方法满足如下原则: 1)public 2)void 3)无方法参数 4)方法名必须以test开头	 */	public void testAdd() {		Calculater cal = new Calculater();		int result = cal.add(1, 2);		// 断言:assert		Assert.assertEquals(4, result);	}}

      关于Junit测试方法的书写规范我已经写到代码的注释中,请大家严格遵守。这样,直接运行CalculaterTest单元测试类即可完成对Calculater的单元测试。

   进阶一 断言

 在Junit中有断言这么一说,什么意思呢?断言好比咱们的预期效果,当我们执行程序时,肯定心里知道程序应该输出什么结果。我们可以提前设置好期望值,然后将期望值和程序的执行结果进行比较,根据比较结果判定返回单元测试结果。

  比如我们完成对Calculater类中divide方法的单元测试:
public void testDivide() {		Throwable tx = null;		try {			Calculater cal = new Calculater();			cal.divide(4, 0);			// 预期是不执行fali方法,一旦执行,则测试失败			Assert.fail();		} catch (Exception ex) {			tx = ex;		}		Assert.assertNotNull(tx);		Assert.assertEquals(Exception.class, tx.getClass());		Assert.assertEquals("除数不能为零!", tx.getMessage());	}
        
我们预期的执行效果是执行catch中的内容,因为4/0会报异常,所以Assert.fail()方法肯定不会执行。这思路好比:我说Assert.fail()这行代码肯定不会执行(预期效果),如果执行,则单元测试失败。

  进阶二 setUp方法和tearDown方法

  在Junit3.8中,每个test...方法执行前都会执行setUp方法,每个test...方法执行后都会执行tearDown方法,所以我们可以把调用test...方法公共的部分放到setUp方法和tearDown方法中。

  比如,如果写的是一个访问数据库的单元测试类,我们可以把打开数据库的方法放在setUp方法中,把关闭数据库的方法放在tearDown方法中。

  进阶三 运行多个test类

  如果在测试的Source Folder下面有多个单元测试类,我们想统一进行单元测试,你会怎么处理呢?别告诉我一个个的执行,那样只会自己恶心自己。在Junit中TestSuite类可以帮助我们完成此事:
package com.tgb.junit3;import junit.framework.Test;import junit.framework.TestCase;import junit.framework.TestSuite;public class TestAll extends TestCase {	public static Test suite() {		TestSuite suite = new TestSuite();		suite.addTestSuite(CalculaterTest.class);		suite.addTestSuite(LargestTest.class);		return suite;	}}
       
好了,关于Junit3.8的详解到此完成。Junit是个好东西,我们需要多想多用才能触类旁通、举一反三。
你可能感兴趣的文章
浅析linux内核中的idr机制
查看>>
i2c子系统之__i2c_first_dynamic_b…
查看>>
linux内核SPI总线驱动分析(一)
查看>>
浅析linux内核中的idr机制
查看>>
source insight使用
查看>>
linux内核SPI总线驱动分析(一)
查看>>
linux设备模型之uart驱动架构分析
查看>>
source insight使用
查看>>
git基本使用
查看>>
七、WordPress配置HTTPS与开启CDN加速
查看>>
CentOS 6.7下MySQL 5.6 yum快速安装及参数详解
查看>>
CentOS6.8二进制安装MySQL5.6
查看>>
centos 6x系统下源码安装mysql操作记录
查看>>
Centos搭建Mysql主从复制
查看>>
centos下部署redis服务环境及其配置说明
查看>>
Centos7下部署两套python版本并存环境的操作记录
查看>>
利用阿里云的源yum方式安装Mongodb
查看>>
Mysql的二进制日志binlog的模式说明
查看>>
zabbix监控交换机、防火墙等网络设备
查看>>
Redis数据"丢失"讨论及规避和解决的几点总结
查看>>