JUnit学习及在idea上的环境配置

 xUnit是一套基于测试驱动开发的测试框架,其包含用于Python单元测试的PythonUnit和C++单元测试的CppUnit,以及Java的JUnit

简单的来说JUnit就是用于java程序进行单元排错的一个工具,在我们开发项目中,会有很多类和函数,如果全部一起写好再一起运行排错,一大堆错误可能会让我们崩溃,那么比较明智的做法就是每写完一部分程序就进行排错测试看是否有错误,JUnit的初衷就是这个。

JUnit其实是一个测试类,按照一定的标准规范写成用于排错的java类,在下面我会慢慢说它的标准。

准备工作和环境配置:

首先你需要去JUnit官网上下载JUnit4的jar包,它是通过github托管的,我下的时候不知道是不是被墙了的原因下不了,我是百度上搜了一个资源下的,下好以后把jar包放在java的jdk目录下,然后我那idea上project工程进行说明

首先打开idea创建一个java或者java web工程,写好你要写的类和里面需要测试的函数算是JUnit的准备之一

然后点左上角的file里有个ProjectStructure,进去后在Global Libraries那里通过右边的绿色的加号把JUnit的jar包添加进全局依赖,就相当于导入jar包的过程(如果进行了这一步后面测试的时候还显示找不到jar包就在ProjectStructure下的Modules下的Sources下通过加号把你放jar包的文件路径加进去)。在file下有个setting,点开选Plugins搜JUnit把JUnit和JUnit GeneratorV2.0下好(如果没找到点下面的Browse xxx可以找到),重启下JUnit就可以用了,那么环境就算是配好了

下面进行代码测试和JUnit用法介绍:

来到你准备测试的类的你需要测的函数下面,右击有Generate...选项,选一下,有个JUnit Test,选JUnit4,点一下idea就帮你创好了相应的测试类(也可以通过按键盘上的alt+insert按键调出该选项)。

先说一下JUnit的命名规范(不是必须但是更标准)

加入你准备测试的类叫Mine,放在名为serv的包下,那么测试的JUnit程序应该放在名为test.serv的包下,叫做MineTest.java,这个类要导入一系列JUnit的包和serv.Mine就不用说了吧,假如你要测试的函数叫add实现两个int型相加,那么测试程序下测试这个函数的函数应该叫testAdd,注意测试类内所有的测试方法必须使用public void修饰,不带任何参数,这个用idea创建的JUnit测试程序都会给你做好很方便,那么就可以正式给你介绍JUnit的使用了。

引入一段慕课网的学习笔记:

* 1.测试方法上必须使用@Test进行修饰
* 2.测试方法必须使用public void 进行修饰,不能待任何的参数
* 3.新建一个源代码目录
* 4.测试类的爆应该和被测试类保持一致
* 5.测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖
* 6.测试类使用Test作为类名的后缀
* 7.测试方法使用test作为方法名的前缀

所有的JUnit注释都是放在每个测试类里测试函数的上方:

@Test表示该函数加入测试,一般是配合JUnit包中的Assert静态类的方法来判断程序的正误

我举个例子:

我准备测试的Servlet.java:

package serv;
public class Servlet extends HttpServlet {
    public String Text()
    {
        return new String("test");
    }
}
然后这是JUnit生成的测试类ServletTest.java
package test.serv; 

import org.junit.Assert;
import org.junit.Test;
import org.junit.Before; 
import org.junit.After; 
import serv.Servlet;
/** 
* Servlet Tester. 
* 
* @author <Authors name> 
* @since <pre>一月 5, 2018</pre> 
* @version 1.0 
*/ 
public class ServletTest { 

@Before
public void before() throws Exception { 
} 

@After
public void after() throws Exception { 
}  

/** 
* 
* Method: Text() 
* 
*/ 
@Test
public void testText() throws Exception { 
//TODO: Test goes here...
    Assert.assertEquals("test",new Servlet().Text());
} 
} 

assertEquals函数第一个参数为你准备的程序应该运行得到的结果,第二个参数就是new一个你要测试的类,调用一下你要测试的函数

先不解释各种注释的用法,看运行结果,在@Test那应该有个小绿色的运行按钮,运行一下这个程序,可以看到绿色的进度条,表示运行成功,如果你运行的类可能抛出异常但是你已经知道,想让他不影响测试结果的正误,就@Test后面加上(expected=异常的类.class)就可以使测试通过,还有后面加(timeout=xx毫秒)可以设定测试时间,这个是防止程序进入死循环一直在检测,超过了测试时间会被认为是Errors

下面是慕课网上摘下的笔记:

* 1、Failure一般由单元测试使用的断言方法判断失败所引起的,这经表示测试点发现了问题,
* 就是说程序输出的结果和我们预期的不一样
* 2、error是由代码议程引起的,它可以产生于测试代码本身的错误,也可以是被测试代码中的一个
* 隐藏的BUG
* 3、测试用例不是用来证明你是对的,而是用来证明你没有错
比如把test改成别的字符串,当你的程序和得到的结果和你填的第一个参数不一样的时候,就会出现failure,假如你测试的是除的函数但是你没处理0的情况,测试0的时候出现的程序错误就会是error而不是failure了

然后下面是assert静态对象的一些函数:

org.junit.Assert.*
assertEquals:用于判断实际值和期望值是否相同,assertEquals(预期值,实际值);
assertSame:判断实际值和期望值是否为同一个对象
assertArrayEquals(expecteds, actuals)	查看两个数组是否相等。
assertEquals(expected, actual)	查看两个对象是否相等。类似于字符串比较使用的equals()方法
assertNotEquals(first, second)	查看两个对象是否不相等。
assertNull(object)	查看对象是否为空。
assertNotNull(object)	查看对象是否不为空。
assertSame(expected, actual)	查看两个对象的引用是否相等。类似于使用“==”比较两个对象
assertNotSame(unexpected, actual)	查看两个对象的引用是否不相等。类似于使用“!=”比较两个对象
assertTrue(condition)	查看运行结果是否为true。
assertFalse(condition)	查看运行结果是否为false。
assertThat(actual, matcher)	查看实际值是否满足指定的条件
fail()	让测试失败
还想了解更详细的可以看API来学习:http://tool.oschina.net/apidocs/apidoc?api=junit-4.10
解释一些常用的注释:
JUnit运行流程
1. @BeforeClass修饰的方法会在所有方法被调用前执行,而且该方法是静态的,所以当测试类被加载后接着就会运行它,而且在内存中它只会存在一份实例,它比较适合加载配置文件
2. @AfterClass所修饰的方法通常用来对资源的清理,如关闭数据库的连接
3. @Before和@After会在每个测试方法的前后各执行一次

运行顺序:
@BeforeClass-> (@Before->@Test->@After) ...->@AfterClass
如果不是很明白可以在@Before之类的标签修饰的函数里面输出些内容来看看他们的顺序
* @Test: 将一个 普通的方法修饰成为一个测试方法
* @BeforeClass: 他会在所有的方法运行前被执行,static修饰
* @AfterClass 他会在所有方法运行结束后被执行,static修饰
* @Before:会在每一个测试方法被运行前执行一次
* @After 会在每个测试方法被运行后执行一次
* @Ignore 所修饰的测试方法会被测试运行器忽略
* @RunWith: 可以修改测试运行器 org.junit.runner.Runner
 
但是如果项目类很多的时候一个个点run是不是很麻烦呢,JUnit有批量运行的方法
也是在你要测试的java类中点击右键,选Go to -->Test同理创建一个JUnit的类随便取一个名字,然后导入各种你要测试的测试类要保证该类中没有其他方法,其中要用到@RunWith注释

JUnit测试套件的使用
测试套件就是组织测试类一起运行
1.写一个作为测试套件的入口类,这个类里不包含其他的方法!!!
2.更改测试运行器Suite.class.
3.将要测试的类作为数组传入到Suite.SuiteClasses({})

@RunWith(Suite.class)  //将测试类改为测试套件类
@Suite.SuiteClasses({TaskTest1.class,TaskTest2.class,TaskTest3.class}) //用数组的形式将测试的类添加到测试套件中
public classSuiteTest{
  //要用public修饰,套件测试类要为空。不能有方法。
}

所谓的测试套件就是指一个经过注解改造的测试方法,变为了测试套件的入口,这个类中不包含其他方法
将要测试得类作为数组传入到Suit.SuitClasses()
运行该类就可以获得批量断言测试的结果了

如果有很多数据要测试,JUnit中有参数化设置,可以用于测试多组数据

步骤:

1.更改默认的测试运行器为RunWith(Parameterized.class)
2.声明变量来存放预期值和结果值
3.声明一个返回值为Collection的公共静态方法,并使用@parameters进行修饰
4.为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
举个例子:
除了我上面那个Servlet.java,我又写了一个Cal类的add函数来做测试:
Cal.java:
package serv;

public class Cal {
    public int add(int x,int y)
    {
        return x+y;
    }
}
生成的CalTest.java:
package test.serv; 
import serv.*;
import org.junit.Assert;
import org.junit.Test;
import org.junit.Before; 
import org.junit.After; 

/** 
* Cal Tester. 
* 
* @author <Authors name> 
* @since <pre>一月 5, 2018</pre> 
* @version 1.0 
*/ 
public class CalTest { 

@Before
public void before() throws Exception { 
} 

@After
public void after() throws Exception { 
} 

/** 
* 
* Method: add(int x, int y) 
* 
*/ 
@Test
public void testAdd() throws Exception { 
//TODO: Test goes here...
    Assert.assertEquals(5,new Cal().add(2,3));
} 
} 
那么套件测试的测试类Test.java这样写:

package test.serv;

import static org.junit.Assert.*;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import serv.Servlet;
@RunWith(Suite.class)
@Suite.SuiteClasses({ServletTest.class,CalTest.class})
public class Test {

}
运行Test.java就可以一起运行ServletTest.java和CalTest.java的JUnit的测试了
当测试数据很多的时候,JUnit提供了参数化设置:

步骤:

1.更改默认的测试运行器为RunWith(Parameterized.class)
2.声明变量来存放预期值和结果值
3.声明一个返回值为Collection的公共静态方法,并使用@parameters进行修饰
4.为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值

我就举刚刚Cal里add方法的作为参数化设置的例子

这是创的一个JUnit类,ParametersTest.java:

package test.serv;
import org.junit.Assert;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import serv.Cal;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collection;

@RunWith(Parameterized.class)
public class ParametersTest {
    int expected=0;
    int input1=0;
    int input2=0;
    @Parameters
    public static Collection<Object[]> t()
    {
        return Arrays.asList(new Object[][]{
                {3,2,1},{7,3,4}
        });
    }
    public ParametersTest(int expected,int input1,int input2)
    {
        this.expected=expected;
        this.input1=input1;
        this.input2=input2;
    }
    @Test
    public void testAdd()
    {
        Assert.assertEquals(expected,new Cal().add(input1,input2));
    }
}
相关文章
相关标签/搜索