天天看点

JUnit的基本使用

  单元测试并不能证明你的代码是正确的,只能证明你的代码是没有错误的。

  keep bar green and keep your code cool

  第一种方式<4.0的junit版本

  1、 在已经编写好的项目中新建一个package用于单元测试。

  2、 要在buildpath中加入junit对应的包。

  3、 新建一个类,比如unittest

  import static org.junit.assert.*;

  import junit.framework.testcase;

  import org.junit.test;

  5、 编写自己的测试函数,可以编写多个,感觉上每个函数都相当于一个main方法,要注意的是需要用来执行的函数都要以test开头。

  6、 在对应的测试类上点击run as 之后点击junit test 就可以执行对应的test开头的方法了。

  第二种方式>=4.0的junit版本

  1、 这种方式是基于注解来进行的,先要加上对应的包import org.junit.test,其他的就不用加了。

  2、 类名不需要继承testcase,测试方法也不需要以test开头。

  3、 只需要在方法的前面加上@test的注解,之后 run as—>junit test这样就会自动对加了注解的方法进行测试。

  使用注解的方式还是比较推荐的,最好在利用注解的时候方法名也能与之前的保持一致,这样就能与4.0版本之前的junit兼容了。

  这种方式的大致原理还是利用反射,先获得class类实例,之后利用getmethods方法得到这个类的所有的方法,之后遍历这个方法,判断每个方法是否加上了@test注解,如果加上了注解,就执行。大多数框架内部都是依靠反射来进行的。实际情况中还是比较推荐使用注解的,还有一些常用的注解,比如:@before @after这两个分别表示方法(@test之后的)执行之前要执行的部分,以及方法执行之后要执行的部分,注意这里每个被@test标注过的方法在执行之前与执行之后都要执行@before以及@after标注过的方法,因此被这两个注解标记过的方法可能会执行多次。

  对于@beforeclass以及@afterclass顾名思义就表示在整个测试类执行之前与执行之后要执行的方法,被这两个注解标记过的方法在整个类的测试过程中只是执行一次。

  还有一个常用到的方法是assert.assertequals方法,表示预期的结果是否与实际出现的结果是否一致,可以有三个参数,第一个参数表示不一致时候的报错信息,第二个参数表示期望的结果,第三个参数表示实际的结果。

  还有一部分是关于组合模式的使用,比如写了好多的测试类,atest btest ....总不能一个一个点,能一起让这些测试类都运行起来就是最好不过了,这时候要使用到两个注解:@runwith(suite.class)以及@suiteclasses({ xxtest.class,xxtest.class })

  当然junit的整个过程中还涉及到了许多经典的设计模式,这个再进一步进行分析。

  下面是一个实际的例子,展示一下常见的几个注解的使用:

//一个简单的student类以及一个teacher类 输出其基本信息

package com.test.unittest;

public class student {

int id;

int age;

string name;

public student(int id, int age, string name) {

super();

this.id = id;

this.age = age;

this.name = name;

}

public int getid() {

return id;

public void setid(int id) {

public int getage() {

return age;

public void setage(int age) {

public string getname() {

return name;

public void setname(string name) {

public void info()

{

system.out.println("the stu info:"+this.age+" "+this.id+" "+this.name);

public class teacher {

string tname;

string tage;

public teacher(string tname, string tage) {

this.tname = tname;

this.tage = tage;

public string gettname() {

return tname;

public void settname(string tname) {

public string gettage() {

return tage;

public void settage(string tage) {

public void info(){

system.out.println("the teacher info:"+this.tage+" " +this.tname);

  后面这部分就是对两个类进行的单元测试以及一个组合方式的使用

package com.unittest;

import org.junit.after;

import org.junit.before;

import org.junit.test;

import com.test.unittest.student;

public class studenttest {

student stu=new student(1,23,"令狐冲");

@before

public void setup(){

system.out.println("student initial");

@test

public void infotest()

stu.info();

@after

public void teardown(){

system.out.println("student destroy");

import com.test.unittest.teacher;

public class teachertest {

teacher teacher=new teacher("风清扬","90");

system.out.println("teacher initial");

teacher.info();

system.out.println("teacher destroy");

import org.junit.runner.runwith;

import org.junit.runners.suite;

import org.junit.runners.suite.suiteclasses;

@runwith(suite.class)

@suiteclasses({studenttest.class,teachertest.class})

public class alltest {

/*输出的结果如下:

student initial

the stu info:23 1 令狐冲

student destroy

teacher initial

the teacher info:90 风清扬

teacher destroy

*/

  补充说明:

  写作业的时候把测试类一个一个手敲进去,真是太out了,还是用eclipse中自带的生成junit test的类比较好一点,直接在测试的那个package下面,创建一个新的junit test class 选定版本以及选定class under test 这个表示你希望生成哪一个类的测试类,这样生成的测试类中命名也比较规范,比如相同的方法名不同参数的方法,连参数类型都写上去了,比以前直接用a b c d...1 2 3 4....来区别同名的方法正规多了....

最新内容请见作者的github页:http://qaseven.github.io/

继续阅读