如何写Java单元测试 |
您所在的位置:网站首页 › java测试案例cursor怎么new出来 › 如何写Java单元测试 |
本文引自https://www.cnblogs.com/ysw-go/p/5447056.html 什么是单元测试 我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的。但是,我们同时应该确保每一个函数都完全正确,因为如果我们今后如果对程序进行扩展,用到了某个函数的其他功能,而这个功能有bug的话,那绝对是一件非常郁闷的事情。所以说,每编写完一个函数之后,都应该对这个函数的方方面面进行测试,这样的测试我们称之为单元测试。传统的编程方式,进行单元测试是一件很麻烦的事情,你要重新写另外一个程序,在该程序中调用你需要测试的方法,并且仔细观察运行结果,看看是否有错。这样的话太过于麻烦了,本文简要介绍一下在Eclipse中使用JUnit4进行单元测试的方法。用更加通俗的话来描述单元测试就是:写了个类,要给别人用,会不会有bug?怎么办?测试一下。用main方法测试好不好?这种方法我们经常用,就是写一个方法实现一些功能,把方法的调用方式放在main函数中。这样的测试方式一个是使得main函数太过于混乱,再者测试过程需要人的仔细观察来辨别每个函数的功能实现,哪一个函数出错了,哪一个函数没有输出之类的问题层出不穷,单元测试就是来解决这些问题的。下面我会就单元测试的每一步给出详细的图解和描述。 第一部分 我们先创建一个Java Project,名字就叫做JUnit4,然后创建两个包com.itcast.junit4和com.itcast.junit4.test,如下图所示 在com.itcast.junit4包中创建一个类叫做T(名字可以是任意的,这里是为了方便),在类中添加两个方法add和divide实现两个数的加法和除法运算 package com.itcast.junit4; public class T { 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 T().add(3, 5); System.out.println(z); } }我们传统测试的方法通常都是按上面的方式去看add函数是否可以实现我们想要的功能,把方法的调用放在main函数中。下面我们看一下单元测试到底是什么东西: 在com.itcast.junit4.test包中创建一个类,叫做TTest(单元测试命名规范:a) 类放在test包中;b) 类名用XXXTest结尾;c) 方法用testMethod命名;) 做完上面的步骤会创建一个这样的测试类 import static org.junit.Assert.*; import org.junit.Test; public class TTest { @Test public void testAdd() { fail("Not yet implemented"); } @Test public void testDivide() { fail("Not yet implemented"); } }上面的org.junit.Assert.*;就是静态导入的我们实现单元测试要用到的一些方法;【注意】这是静态引入,可以把方法直接引入,org.junit.Assert是一个类,不是一个包,当然这些方法肯定都是静态方法了。出现的代码都是Assert类中的一些方法,"@Test”表明下面这个方法是一个测试方法,我们先删除自动生成的fail()函数的代码。添加以下代码: public class TTest { @Test public void testAdd() { int z=new T().add(2, 4); //判断z==6,以往的assert assertEquals(6, z); } @Test public void testDivide() { //测试T类中的divide方法 int z=new T().divide(8, 2); System.out.println(z); } }我们现在开始进行测试:要测试的方法–>右键–>Run As–>JUnit Test Error:是程序有问题,比如我们在testAdd方法中加上这一句:int a=8/0;再次测试这个方法则会出现一个Error public void testAdd() { int z=new T().add(2, 4); //判断z==6,以往的assert assertEquals(6, z); int a=8/0; }
Failures:测试失败,比如我们在方法改成下面的形式: public void testAdd() { int z=new T().add(2, 4); //判断z==6,以往的assert assertEquals(6, z); assertTrue(zAdd External Archives,将这两个Jar加进去![]() ![]() ![]() JUnit4 Test–>右键–>Build Path–>Add External Archives,选择我们JUnit包中的junit-4.10,如下图所示: assert的使用是测试代码更加自然(诸如这样的理解:z is 8),自己可以体会一下,下面给出一些实例,大家可以自己动手试一下 示例 a)assertThat( n, allOf( greaterThan(1), lessThan(15) ) ); assertThat( n, anyOf( greaterThan(16), lessThan(8) ) ); assertThat( n, anything() ); assertThat( str, is( "bjsxt" ) ); assertThat( str, not( "bjxxt" ) ); b)assertThat( str, containsString( "bjsxt" ) ); assertThat( str, endsWith("bjsxt" ) ); assertThat( str, startsWith( "bjsxt" ) ); assertThat( n, equalTo( nExpected ) ); assertThat( str, equalToIgnoringCase( "bjsxt" ) ); assertThat( str, equalToIgnoringWhiteSpace( "bjsxt" ) ); c)assertThat( d, closeTo( 3.0, 0.3 ) ); assertThat( d, greaterThan(3.0) ); assertThat( d, lessThan (10.0) ); assertThat( d, greaterThanOrEqualTo (5.0) ); assertThat( d, lessThanOrEqualTo (16.0) ); d)assertThat( map, hasEntry( "bjsxt", "bjsxt" ) ); assertThat( iterable, hasItem ( "bjsxt" ) ); assertThat( map, hasKey ( "bjsxt" ) ); assertThat( map, hasValue ( "bjsxt" ) );第三部分 JUnit4 Annotation 几种常见的注释形式: @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)@after和@before 我们把代码改成这个样子:为方便起见先把那个divide方法删掉 public class TTest { @Before public void before() { System.out.println("befor"); } @Test public void testAdd() { int z = new T().add(2, 4); assertThat(z, is(8)); // 判断z==6,以往的assert // assertEquals(6, z); // assertTrue(z |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |