java单元测试

1.什么是单元测试

  我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的。但是,我们同时应该确保每一个函数都完全正确,因为如果我们今后如果对程序进行扩展,用到了某个函数的其他功能,而这个功能有bug的话,那绝对是一件非常郁闷的事情。所以说,每编写完一个函数之后,都应该对这个函数的方方面面进行测试,这样的测试我们称之为单元测试。传统的编程方式,进行单元测试是一件很麻烦的事情,你要重新写另外一个程序,在该程序中调用你需要测试的方法,并且仔细观察运行结果,看看是否有错。这样的话太过于麻烦了,本文简要介绍一下在Eclipse中使用JUnit4进行单元测试的方法。用更加通俗的话来描述单元测试就是:写了个类,要给别人用,会不会有bug?怎么办?测试一下。main方法测试好不好?这种方法我们经常用,就是写一个方法实现一些功能,把方法的调用方式放在main函数中。这样的测试方式一个是使得main函数太过于混乱,再者测试过程需要人的仔细观察来辨别每个函数的功能实现,哪一个函数出错了,哪一个函数没有输出之类的问题层出不穷,单元测试就是来解决这些问题的。


2.新建一个java project作为例子,如下图:


3.在com.cha.junit4包中创建一个类叫做C(名字可以是任意的,这里是为了方便),在类中添加两个方法add和divide实现两个数的加法和除法运算

package com.cha.junit4;

public class C {
	public int add(int x,int y){
        return x+y;
    }
    public int divide(int x,int y){
        return x/y;
    }
    public static void main(String[] args) {
        int z=new C().add(3, 5);
        System.out.println(z);
    }
}
4.开始进行单元测试,在com.cha.junit4.test包中创建一个类,叫做CTest(单元测试命名规范: a) 类放在 test 包中; b) 类名用 XXXTest 结尾; c) 方法用 testMethod 命名;)

1)在com.cha.junit4.test包中new->other->j(查询),选择JUnit Test Case(如果new选项中有JUnit Test Case,就直接选择)


2)然后选择New Junit 4 test,那个Junit 3已经过时了。下面的一行Class under test,单击右侧的Browser,在弹出的输入框中输入我们想要测试的类名C,选中单击next出现了一个界面要我们选择需要测试的方法,我们这里选择add方法和divide;




5.生成的测试类代码如下,接下来将进行测试:

package com.cha.junit4.test;

import static org.junit.Assert.*;

import org.junit.Test;

public class CTest {

	@Test
	public final void testAdd() {
		fail("Not yet implemented"); // TODO
	}

	@Test
	public final void testDivide() {
		fail("Not yet implemented"); // TODO
	}

}
1)上面的org.junit.Assert.*;就是静态导入的我们实现单元测试要用到的一些方法;【注意】这是静态引入,可以把方法直接引入,org.junit.Assert是一个类,不是一个包,当然这些方法肯定都是静态方法了。

2)出现的代码都是Assert类中的一些方法,"@Test”表明下面这个方法是一个测试方法,我们先删除自动生成的fail()函数的代码。添加以下代码:

public class CTest {

	@Test
    public void testAdd() {
        int z=new C().add(2, 4);
        //判断z==6,以往的assert
        assertEquals(6, z);
    }

    @Test
    public void testDivide() {
        //测试C类中的divide方法
        int z=new C().divide(8, 2);
        System.out.println(z);
    }

}

6.要测试的方法-->右键-->Run As-->JUnit Test

7.测试结果如下:


1)绿条显示两个方法的功能没有错误,有这样的调试准则:keep the bar green,to keep the code clean,绿色代表测试成功,其中Error:程序出错 Failures:测试失败

2)Error:是程序有问题,比如我们在testDivide方法中加上这一句:int a=8/0;再次测试这个方法则会出现一个Error

@Test
    public void testDivide() {
        //测试C类中的divide方法
        int z=new C().divide(8, 2);
        int a=8/0;
        System.out.println(z);
    }


3)Failures:测试失败,比如我们在方法改成下面的形式:

@Test
    public void testDivide() {
        //测试C类中的divide方法
        int z=new C().divide(8, 2);
        //int a=8/0;
        assertTrue(z>10);
        System.out.println(z);
    }

9.查看一下JUnit API可以看到org.junit.Assert类有很多类似于assertEquals(6, z);assertTrue(z<3);之类的方法的使用


10.JUnit4几种注释形式:

@Test: 测试方法
a) (expected=XXException.class)

b) (timeout=xxx)

@Ignore: 被忽略的测试方法
@Before: 每一个测试方法之前运行
@After: 每一个测试方法之后运行
@BeforeClass: 所有测试开始之前运行
@AfterClass: 所有测试结束之后运行

1)@Test,前面已经说明了,@Test注解表明下面的方法是一个测试方法,a),  b)两种形式,比如@Test(expected=java.lang.ArithmeticException.class,timeout=100)a是在测试出现异常的情况下告知我们出现的异常信息,类似与try-catch中的e.printstacktrace() 方法,比较简单。b中的timeout=100,运行时间限制在100ms以内(通常在测试代码运行效率时这样设置)

2)@ignore: 被忽略的测试方法(就是测试的时候跳过ignor标记的模块或方法) 
有时候某些方法还不具备测试的条件,暂时还不能测试或者某些方法已经不需要再做测试了,这就可以进行忽略的操作了。 
有时方法的测试条件还没满足,整个项目还差一个模块,则可以采用该方法假定测试条件成立。

3)说明@Before在每一个测试方法(@Test方法)之前运行  @After:在每一个测试方法之后运行。它们两个的应用场合: 有些方法需要执行的时候需要一些先决条件,比如打开某文件、获取资源,搭建环境,执行完之后需要关闭文件、释放资源、卸载环境这就需要before和after操作

4)@BeforeClass 所有测试开始之前运行;@AfterClass: 所有测试结束之后运行【一定要注意】这两个方法都是静态方法,想想也应该明白类一加载就执行这两个方法,此时还没有创建任何对象,能执行的肯定就是静态方法了。

11.代码实例如下:

public class CTest {

	@BeforeClass
    public static void beforeClass(){
        System.out.println("before class..");
    }
    @Before
    public void before() {
        System.out.println("befor");
    }

    @Test
    public void testAdd() {
        int z = new C().add(2, 4);
        //判断z==6,以往的assert
        assertEquals(6, z);
        assertTrue(z<3);
        // int a=8/0;
    }

    @After
    public void after() {
        System.out.println("after");
    }
    @AfterClass
    public static void afterClass(){
        System.out.println("after class..");
    }

}
1)结果示:


12.转载博文地址:https://www.cnblogs.com/ysw-go/p/5447056.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值