`

Java学习系列(二十五)基于Junit3.8和Junit4.x的单元测试详解

 
阅读更多

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45281449

前言

 

好久没有写来CSDN写博客了,前段时间一直在加班赶项目,所以博客一直没有更新;现在空闲时间比较多,所以后面会长期更新博客。
今天来复习一下单元测试基于Junit工具的使用。Junit3.8与Junit4.x的使用还是有些区别的,所以分开来讲,但不管怎样,单元测试的目的并不是证明你是对的,而是为了证明你没有错误,同时也为提高程序健壮性、可重用测试、降低代码后期维护等提供了很好的支持和帮助。

(一) 基于Junit3.8的实例说明

 

/**
 * 基本四则运算 -- 目标类
 * 
 * @author [*昨日重现*] lhy_ycu@163.com
 * @since version 1.0
 * @datetime 2015年4月24日 上午10:35:13
 */
public class Calculator {

	private int add(int num1, int num2) {
		return num1 + num2;
	}

	public int subtract(int num1, int num2) {
		return num1 - num2;
	}

	public int multiply(int num1, int num2) {
		return num1 * num2;
	}

	public int divide(int num1, int num2) {
		if (num2 == 0) {
			throw new ArithmeticException("除数不能为0");
		}
		return num1 / num2;
	}

}

 

 

基于Junit3.8的测试类

/**
 * 基于Junit3.8
 * 
 * 测试源代码中的目标类,测试类必须继承TestCase
 * 
 * @author [*昨日重现*] lhy_ycu@163.com
 * @since version 1.0
 * @datetime 2015年4月24日 上午10:43:22
 */
public class CalculatorTest extends TestCase {
	private Calculator cal = null;

	@Override
	protected void setUp() throws Exception {
		// TODO Auto-generated method stub
		super.setUp();
		// 每个测试方法执行前,重新new一个对象,避免测试用例之间的依赖
		cal = new Calculator();
		System.out.println("在每个测试方法执行前执行--setUp...");
	}

	/**
	 * 测试源代码的私有方法
	 */
	public void testAdd() {
		System.out.println("测试方法testAdd...");
		// Assert.assertEquals(3, cal.add(1, 2));// blue bar
		try {
			// 1、getClass;2、Class.forName(); 3、.class
			Class<Calculator> calzz = Calculator.class;
			// Class<?> calzz = Class.forName("com.leo.junit.Calculator");
			// Calculator cal = calzz.newInstance();
			Method method = calzz.getDeclaredMethod("add", new Class[] {
					Integer.TYPE, Integer.TYPE });// 后两个参数为:方法名、参数类型
			method.setAccessible(true);// 设置为可访问私有的add方法
			// 后两个参数为:目标类对象、实参对象;返回目标方法的结果
			Object obj = method.invoke(cal, new Object[] { 1, 2 });
			Assert.assertEquals(3, obj);
		} catch (Exception e) {
			// e.printStackTrace();
			Assert.fail();
		}

	}

	public void testSubstrub() {
		System.out.println("测试方法testSubstrub...");
		Assert.assertEquals(3, cal.subtract(1, 2));// red bar,failure 说明测试没有通过(失败)
	}

	public void testMultiply() {
		System.out.println("测试方法testMultiply...");
		Assert.assertEquals(2, cal.multiply(1, 2));// blue bar
	}

	public void testDivide() {
		System.out.println("测试方法testDivide...");
		Assert.assertEquals(2, cal.divide(1, 0));// red bar, error 说明测试程序本身出错
	}

	@Override
	protected void tearDown() throws Exception {
		// TODO Auto-generated method stub
		super.tearDown();
		// cal = null;// 在每个测试方法执行后主动销毁对象
		System.out.println("在每个测试方法执行后执行--tearDown...\n");
	}

	// public static void main(String[] args) {
	// junit.textui.TestRunner.run(CalculatorTest.class);// 控制台打印错误日志
	// }
}

 


注意事项:
1)Junit的原则:keep the bar green to keep the code clean。2)测试类与(源代码)目标类的包名尽量要一致,最终它们都会被编译到同一个目录下面,这样就不用导入源代码所在的包。
3) 测试类的命名规则:测试类类名 = 目标类类名前或后加Test; 注意要统一。
4) 测试类必须继承TestCase; 测试用例(方法/类)与测试用例之间一定是完全独立的,不允许出现任何的依赖关系。同时也不能依赖测试方法的执行顺序,也就是删除或注释掉某个测试方法后,其他的测试方法依然能够执行。
5) 测试源代码的私有方法可以采取两种方式:1、修改目标方法的访问修饰符(将private修改为public,一般不推荐);2、使用反射在测试类中调用目标类的私有方法。

 

(二)基于Junit4.x的实例说明

 

/**
 * 基于Junit4.X --主要基于注解Annotation
 * 
 * @author [*昨日重现*] lhy_ycu@163.com
 * @since version 1.0
 * @datetime 2015年4月25日 上午12:06:52
 */

// @Ignore 将忽略掉该类的所有测试方法
public class CalculatorTest2 {
	private Calculator cal = null;

	@BeforeClass
	public static void beforeClass() {
		System.out.println("=========在所有测试方法执行前执行--beforeClass=====\n");
	}

	/**
	 * 在测试方法执行完前执行
	 */
	@Before
	public void beforeMethod() {
		System.out.println("在每个测试方法执行前执行--beforeMethod...");
		cal = new Calculator();
	}

	// 若超时1s,将报error错误
	@Test(timeout = 1000)
	// 若期待有异常抛出:expected = Exception.class
	public void testSubstrub() // throws Exception
	{
		System.out.println("测试方法testSubstrub被执行...");
		Assert.assertEquals(-1, cal.subtract(1, 2));
		// Assert.assertEquals(-1, cal.divide(1, 0));
	}

	@Test
	@Ignore("该testMultiply测试方法由于XX原因需要被忽略掉")
	public void testMultiply() {
		System.out.println("测试方法testMultiply被执行...");
		Assert.assertEquals(2, cal.multiply(1, 2));
	}

	/**
	 * assertThat及Hamcrest的基本使用
	 */
	@Test
	public void testOther() {
		int result = cal.subtract(1, 2);
		// 关于字符串
		String s1 = "leo";
		org.junit.Assert.assertThat(result, Matchers.is(-1));
		org.junit.Assert.assertThat(s1, Matchers.not("llleo"));
		// org.junit.Assert.assertThat(s1, Matchers.equalToIgnoringCase("LeO"));
		// org.junit.Assert.assertThat(s1,
		// Matchers.equalToIgnoringWhiteSpace("  Leo "));
		// org.junit.Assert.assertThat(s1, Matchers.containsString("leo"));
		// org.junit.Assert.assertThat(s1, Matchers.startsWith("le"));
		// org.junit.Assert.assertThat(s1, Matchers.endsWith("o"));
		// org.junit.Assert.assertThat(s1, Matchers.equalTo("leo"));

		// 关于基本类型
		double d1 = 3.1;
		// 在3.0±0.2之间
		org.junit.Assert.assertThat(d1, Matchers.closeTo(3.0, 0.2));
		// 大于3.0
		org.junit.Assert.assertThat(d1, Matchers.greaterThan(3.0));
		// 小于4.0
		org.junit.Assert.assertThat(d1, Matchers.lessThan(4.0));
		// 大于或等于3.0
		org.junit.Assert.assertThat(d1, Matchers.greaterThanOrEqualTo(3.0));
		// 小于或等于4.0
		org.junit.Assert.assertThat(d1, Matchers.lessThanOrEqualTo(4.0));

		// 关于集合
		Map<String, String> map = new HashMap<String, String>();
		map.put("k1", "zhangsan");
		map.put("k2", "lisi");
		// 是否含有该k1=zhangsan的键值对
		org.junit.Assert.assertThat(map, Matchers.hasEntry("k1", "zhangsan"));
		// 是否含有键为k2的Item
		org.junit.Assert.assertThat(map, Matchers.hasKey("k2"));
		// 是否含有值为lisi的Item
		org.junit.Assert.assertThat(map, Matchers.hasValue("lisi"));
	}

	/**
	 * 在测试方法执行完后执行
	 */
	@After
	public void afterMethod() {
		// cal = null;// 在每个测试方法执行后主动销毁对象
		System.out.println("在每个测试方法执行后执行--afterMethod...\n");
	}

	@AfterClass
	public static void afterClass() {
		System.out.println("=========在所有测试方法执行后执行--afterClass=====");
	}
}

 


注意事项:
1)在一个测试类中,所有被@Test注解所修饰的public void方法都是测试用例,可以被JUnit所执行。

2) failure是指测试失败,而error是指测试程序本身出错。

 

结束语

明天开始续《Java学习系列》,包括反射、注解、内部类等等。

 

 

分享到:
评论

相关推荐

    浪曦][原创]Junit.3.8.详解续二.rar

    【标题】:“浪曦][原创]Junit.3.8....通过这个“浪曦”原创的Junit 3.8详解续二教程,开发者可以期待深入理解这个版本的特性和如何有效地利用它来编写可靠的单元测试,从而提高代码质量和可维护性。

    浪曦][原创]Junit.3.8.详解续一.rar

    Junit是一个开源的Java测试框架,由Ernst Berg和Kent Beck创建,它极大地简化了Java程序的单元测试。Junit 3.8是其早期的一个稳定版本,虽然现在已经有了更先进的Junit 5,但Junit 3.8仍然是许多开发者入门测试的...

    junit3.8jar以及源码以及测试案例详解.rar

    首先,`junit3.8.jar`是Junit 3.8的核心库文件,包含了运行和编写单元测试所需的所有类和方法。导入此库后,开发者可以在项目中创建和执行单元测试,确保代码的正确性。Junit 3.8相较于早期版本,增加了一些实用特性...

    Junit 3.8 详解(一)

    在提供的压缩包中,"Junit 3.8 详解.exe"可能是一个交互式的教程或者演示程序,它能够帮助用户直观地了解和学习JUnit 3.8的使用。通过运行这个.exe文件,你可以亲自动手实践,加深对JUnit测试的理解。 总的来说,...

    软件测试实验3--Junit单元测试.docx

    二、Junit3.8中的断言和Assert类 在Junit 3.8版本中,`Assert`类提供了多种方法来进行断言检查: 1. **Assert.assertEquals()**:比较两个对象或值是否相等。在本实验中,如`Assert.assertEquals(3, result)`,...

    Junit教程 自动化测试

    JUnit作为Java中最常用的单元测试框架之一,提供了一套完整的工具和方法来帮助开发者编写和运行测试案例。 #### 二、JUnit简介 JUnit是一种广泛使用的Java单元测试框架,最初由Kent Beck和Erich Gamma于1998年创建...

    jeecg3.8 maven版本开发测试

    《Jeecg3.8 Maven版本开发测试详解》 在软件开发领域,高效且稳定的开发环境是提升项目进度的关键。本文将围绕“Jeecg3.8 Maven版本开发测试”这一主题,深入探讨如何利用Jeecg3.8框架、Maven3.3.3构建工具以及...

    Spring中文帮助文档

    7.10.4. ThreadLocal目标源 7.11. 定义新的Advice类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.2.1. Mock对象 8.2.2. 单元测试支持类 8.3. 集成测试 8.3.1. 概览 8.3.2. 使用哪个支持框架 ...

    Spring API

    7.10.4. ThreadLocal目标源 7.11. 定义新的Advice类型 7.12. 更多资源 8. 测试 8.1. 简介 8.2. 单元测试 8.2.1. Mock对象 8.2.2. 单元测试支持类 8.3. 集成测试 8.3.1. 概览 8.3.2. 使用哪个支持框架 ...

    Maven权威指南 很精典的学习教程,比ANT更好用

    添加单元测试资源 4.12. 执行单元测试 4.12.1. 忽略测试失败 4.12.2. 跳过单元测试 4.13. 构建一个打包好的命令行应用程序 5. 一个简单的Web应用 5.1. 介绍 5.1.1. 下载本章样例 5.2. 定义这个简单的...

    jTester使用指南(带书签).pdf

    #### 五、在测试中集成 Spring **5.1 加载 Spring 容器** - **步骤**:通过 `@RunWith(SpringRunner.class)` 和 `@ContextConfiguration` 注解来启动 Spring 应用上下文。 **5.2 使用 @AutoBeanInject 让框架自动...

    圣思园Java.docx

    - **单元测试**:使用JUnit进行单元测试,涵盖JUnit 3.8与4.x版本的差异。 - **测试方法**:详解单元测试方法的执行过程。 #### UML建模 - **UML概述**:介绍统一建模语言的基础知识。 - **顺序图(Sequence ...

    利用Selenium建立自动化测试框架.docx

    ### Selenium自动化测试框架构建详解 #### 一、Selenium简介 Selenium是由ThoughtWorks公司推出的一款强大且灵活的Web应用程序测试工具。它能够模拟用户在浏览器中的操作行为,支持多种类型的测试,例如单元测试、...

    Parasoft_JTest 入门教程-通俗易懂

    ### Parasoft JTest 入门教程知识点详解 #### 第2章 安装和许可 - **2.1 Windows单机安装** - **步骤一:** 下载适用于Windows操作系统的安装包。 - **步骤二:** 双击安装包启动安装向导,按照向导提示完成安装...

    struts2用户登录

    - **测试工具:** JUnit 3.8 #### 三、前端页面设计 **1. Welcome.jsp** 这个页面作为用户登录系统的入口页面,包含了导航链接。 ```jsp &lt;title&gt;Welcome &lt;link href="&lt;s:url value="/css/tutorial.css" /&gt;" ...

    EJB3.0中文资料

    - 使用JUnit等单元测试框架编写测试用例。 - 测试EJB的行为和功能正确性。 #### 四、会话BEAN (SESSION BEAN) ##### 4.1 STATELESS SESSION BEANS(无状态BEAN)开发 - **只存在Remote接口的无状态SessionBean** ...

Global site tag (gtag.js) - Google Analytics