`

JUnit3.8的初步学习

阅读更多

以下是我在看完浪曦网的风中叶老师的jUnit3.8教学后整理的学习笔记:

 

1.  建立一个工程,取名随意。

2.  建立包(com.test.junit3),并建立一个计算类(Calculator),添加其相应的方法。完成后代码如下:

public class Calculator {

	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 (0 == b) {
			throw new Exception("除数不能为0!");
		}
		return a / b;
	}
}

 

这里面的方法比较简单,不在解释。

 

3.  建立测试类。

     a.  建立测试类的时候(我指的是使用Eclipse或者MyEclipse进行开发的时候),一般将测试类放到另外一个源文件夹中。在项目上点右键,选择new-->Source Folder。名字随意,一般取名字test。

     b.  建立测试包。包名一般与需要被测试的类的包名相同,在这里,包名与Calculator类的包名相同(com.test.junit3)。

     c.   建立测试类。测试类命名一般是需要被测试的类名加上后缀“Test”,这里为CalculatorTest。

 

4.  测试类需要注意的方面。在这里,也就是CalculatorTest需要遵守的规则。

     a.  测试类必须继承TestCase类。

     b.  测试方法必须为public型的,void的,没有方法参数,且方法名必须以“test”为前缀,即以test开头(如果不以test开头,那该方法需要手动启动测试。运行测试类的时候,该方法是无法被自动进行测试的)。

 

5. 实际的测试类。

package com.test.junit3;

import junit.framework.Assert;
import junit.framework.TestCase;

public class CalculatorTest extends TestCase{

	private Calculator cal;
	
	/**
	 * 执行每一个测试方法的时候,先执行setUp();
	 */
	protected void setUp() throws Exception {
		cal=new Calculator();		
	}

	/**
	 * 执行每一个测试方法之后,执行tearDown();
	 */
	protected void tearDown() throws Exception {
		super.tearDown();
	}
	
	public void testAdd(){
		int result=cal.add(1, 2);
		//断言:assert
		Assert.assertEquals(3, result);
	}
	
	public void testMinus(){
		int result =cal.minus(1, 2);
		Assert.assertEquals(-1, result);
	}
	
	public void testMultiply(){
		int result =cal.multiply(2, 3);
		Assert.assertEquals(6, result);
	}
	
	public void testDivied(){
		int result=0;
		try {
			result = cal.divide(6, 4);
		} catch (Exception e) {
			e.printStackTrace();
			Assert.fail();
		}
		Assert.assertEquals(1, result);
	}
	
	public void testDivied2(){
		Throwable tx=null;
		try {
			cal.divide(4, 0);
			Assert.fail();
		} catch (Exception e) {
			tx=e;
		}
			
		//断言tx是否为空
		Assert.assertNotNull(tx);
		
		//断言两个对象是否相同
		Assert.assertEquals(Exception.class,tx.getClass());
		
		//断言String是否相同
		Assert.assertEquals("除数不能为0!", tx.getMessage());
	}
}

 

   a.  如果被测试的方法绝对不会有异常抛出(如:Calculator中的add(int a,int b)),那么在测试类(CalculatorTest)中可以像下面的代码一样,直接使用断言Assert类中的assertEquals(int expected, int actual)方法直接断言。该方法传入两个int参数,一个表示期望值,即按照设计应该得到的结果expected,一个表示实际值,即程序实际得到的结果actual。如果这两个结果相同,则表示被测试的类即(Calculator)中的该方法没有错误。

	public void testAdd(){
		int result=cal.add(1, 2);
		//断言:assert
		Assert.assertEquals(3, result);
	}

 

       补充:Assert中的assertEquals()方法传入的参数基本可以是所有的类型,包括String、int、char等等,具体的自己看。注意:预期值和实际值的类型必须一致。

    b.  如果被测试的方法有异常抛出(如:Calculator中的divied(int a,int b)),那么在测试类中如果直接使用断言Assert中的assertEquals(int expected, int actual)方法时,传入参数b为0的时候,如下:

	public void testDivied(){
		int result=0;
		try {
			result = cal.divide(6, 0);
		} catch (Exception e) {
			e.printStackTrace();
			Assert.fail();
		}
		Assert.assertEquals(1, result);
	}

 

       无论你的代码是否完善,是否已经正确无误了,TestBar显示仍为红条,表示该方法无法通过测试。正确的写法应该如下:

	public void testDivied2(){

		//Throwable为Exception和Error的父类.
		Throwable tx=null;
		try {
			cal.divide(4, 0);
			Assert.fail();
		} catch (Exception e) {
			tx=e;
		}
		
		//断言tx是否为空
		Assert.assertNotNull(tx);
		
		//断言两个对象是否相同
		Assert.assertEquals(Exception.class,tx.getClass());
		
		//断言异常信息是否为指定异常信息。tx.getMessage()获取异常抛出的信息
		Assert.assertEquals("除数不能为0!", tx.getMessage());
	}

 

       “Assert.fail;”表示该方法测试失败,它的目的是:假如它被执行到了,那么表示divide(int a,int b)方法没有抛出异常,也就是方法中有bug。

       “tx=e;”将异常e赋给tx,将局部变量赋给全局变量,以便进行下面操作。

       “Assert.assertNotNull(tx);”断言tx是否为空,如果tx为空,则说明divide(int a,int b)方法没有将异常抛出,方法中存在bug。

       “Assert.assertEquals(Exception.class,tx.getClass());”。tx.getClass()可以得到tx,也就是这个异常是哪个类,然后断言是否与你期望的异常类相同。如果不同,测试失败,方法抛出异常错误,方法中存在bug。其实到这里可以结束了,而“Assert.assertEquals("除数不能为0!",tx.getMessage());”是为了通过断言异常信息,更进一步判断该异常是否是你在方法中指定的异常。

       这样,通过这些断言,可以保证你的方法目前没有发现bug存在,测试的时候,该方法会通过,表现方式为TestBar为绿色通过。

 

6.  在测试的时候,再TestCase中有两个方法,一个为setUp(),表示初始化。该方法在每个测试方法执行之前将被首先执行。比如如果要执行testAdd()方法的时候,先要执行一遍setUp()方法。因此该方法一般进行一些初始化操作,比如对被测试类的实例化,如:

	protected void setUp() throws Exception {
		cal=new Calculator();	
	}
 

       另一个方法为tearDown(),该方法在每个测试方法执行之后执行,因此该方法一般处理每个测试方法结束后的资源释放操作。

       总的来说:如果测试类中有3个测试方法test1(),test2(),test3(),那么方法的执行顺序为

       setUp()->test1()->tearDown()->setUp()->test2()->tearDown()->setUp()->test3()->tearDown()

 

7.  测试的时候,一般要注意临界值的测试。如除数不能为0,索引越界等问题。

 

8.  如果在没有IDE的情况下,可以通过使用TestRunner类进行测试,如以下代码所示

	public static void main(String[] args) {
		junit.awtui.TestRunner.run(CalculatorTest.class);
	}

 

       需要注意的是:在junit.awtui、junit.swingui和junit.textui三个包下均有TestRunner类,任何一个类都可以执行测试任务。只是表现的方式不同,看你喜欢用哪个了!

 

9.  在执行多个测试类的时候,一个一个点运行,进行测试显然是非常费时的事情。junit提供了一个类TestSuite可以将多个测试类一起运行,进行测试。示例代码如下:

package com.test.junit3;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class TestAll extends TestCase {
	
	/**
	 * 该方法名称必须为suite(),不能更改
	 * 该方法中
	 * TestSuite对象不仅可以添加测试类,还可以包装suite对象
	 * @return
	 */
	public static Test suite(){
		
		TestSuite suite=new TestSuite();
		suite.addTestSuite(LargestTest.class);
		suite.addTestSuite(CalculatorTest.class);
		
		return suite;
	}
}
 

       如注释所示,该静态方法名称必须为suite(),原因可以参看junit源代码。另外该方法返回Test对象。TestSuite中有两个方法很重要,一个是addTestSuite(),可以直接添加测试类。另一个方法为addTest(),可以添加TestSuite对象,所以,上面也可以通过下面的代码实现:

package com.test.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();
		
		TestSuite suite1=new TestSuite();
		suite1.addTestSuite(LargestTest.class);
		
		TestSuite suite2=new TestSuite();
		suite2.addTestSuite(CalculatorTest.class);
		
		suite.addTest(suite1);
		suite.addTest(suite2);

		return suite;
	}
}

 

       这样我们可以方便的对多个测试类进行测试了。

 

       最后,感谢风老师的视频!

2
0
分享到:
评论

相关推荐

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

    本资源包含`junit3.8.jar`库文件、源代码及测试案例,旨在帮助开发者全面了解并熟练掌握Junit 3.8的使用方法和精髓。 首先,`junit3.8.jar`是Junit 3.8的核心库文件,包含了运行和编写单元测试所需的所有类和方法。...

    JUnit3.8(三)

    JUnit3.8是Java编程语言中广泛使用的单元测试框架的第三个主要版本,它为开发者提供了一种方便的方式来编写和执行可重复的、自动化的单元测试。这个版本在JUnit的早期版本基础上进行了改进,增强了测试的功能性和...

    Junit3.8_API_chm

    Junit3.8 API CHM Junit3.8 API CHM Junit3.8 API CHM Junit3.8 API CHM Junit3.8 API CHM

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

    【压缩包子文件的文件名称列表】:包含一个名为“3 Junit 3.8 详解续二.exe”的文件,这很可能是该教程的可执行程序或者电子书格式,用户可以通过运行这个文件来查看或学习Junit 3.8的相关知识。 现在,我们详细...

    Junit 3.8 详解(一)

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

    junit3.8 和junit4 api

    这里我们将深入探讨JUnit 3.8和JUnit 4两个版本的主要API及其差异。 **JUnit 3.8 API** JUnit 3.8是JUnit的一个早期版本,它的API设计相对简单,主要包含以下关键组件: 1. **测试类和测试方法**:在JUnit 3中,...

    JUNIT3.8學習筆記(1)

    在本篇学习笔记中,我们将探讨JUnit3.8的核心概念和主要特性: 1. **测试注解**: 在JUnit3.8中,测试方法通常通过`@Test`注解来标识。虽然这个注解在后续版本中得到了更多的扩展,但在3.8中,它只是简单地标记一...

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

    而“Test”可能是一个测试案例或者测试代码的集合,与Junit的测试框架紧密相关,用户可以通过这些例子来学习如何使用Junit进行单元测试。 现在,让我们详细讨论一下Junit 3.8这个版本及其相关知识点: Junit是一个...

    junit-3.8.1.jar资源

    JUnit是Java编程语言中最常用的单元测试框架之一,它在软件开发过程中起着至关重要的作用,帮助开发者确保代码的质量和稳定性。`junit-3.8.1.jar` 是JUnit的一个早期版本,发布于2004年,适用于Java 1.3及更高版本。...

    Junit 3.8.2

    JUnit是Java编程语言中最常用的单元测试框架之一,主要用于验证代码的正确性。版本3.8.2是我们要讨论的重点。...学习并熟练掌握这个版本的JUnit,可以帮助开发者建立坚实的基础,为后续学习更高级的测试框架铺平道路。

    JUnit3.8.1

    JUnit是Java编程语言中最常用的单元测试框架之一,主要用于软件开发过程中的测试,确保代码的正确性和稳定性。...尽管如此,对于学习测试基础或者维护旧项目时,理解JUnit 3.8.1及其工作原理仍然是很重要的。

    Junit4.4&3.8.1.rar

    本资源包含了JUnit的两个主要版本——4.4和3.8.1的源码和帮助文档,这对于学习和理解JUnit的工作原理以及历史演变非常有帮助。 JUnit 3.8.1是较早的一个版本,其核心特性包括: 1. **注解(Annotations)**:虽然...

    Junit.3.8.part3

    JAVA测试-----Junit.3.8.part3

    Junit.3.8.part1

    JAVA测试------Junit.3.8.part1

    Junit学习.rar

    这个“Junit学习.rar”压缩包显然包含了关于JUnit从3.8到4.9版本的学习资料,包括可能的操作手册、教程文档以及个人的学习笔记。以下是基于这些资源可能涵盖的一些关键知识点: 1. **JUnit基础知识**:了解JUnit的...

    Junit.3.8.part2

    JAVA测试----------Junit.3.8.part2

    junit3.8.1.rar

    理解并掌握JUnit的基本概念和使用方法对于任何Java开发者来说都是至关重要的,尤其是在维护旧项目或学习测试基础时。随着技术的发展,了解不同版本的特性有助于更好地适应不同的开发环境和需求。

    junit-3.8.jar

    JUnit是由Erich Gamma和Kent Beck创建的Java单元测试框架。 junit/junit/3.8/junit-3.8.jar

Global site tag (gtag.js) - Google Analytics