JUnit的基本使用

一些关于单元测试的理念:

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

  Keep bar green and keep your code cool

  关于JUnit的两种最基本的使用步骤

  第一种方式<4.0的JUnit版本

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

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

  3、 新建一个类,比如unitTest

  4、 当前的类需要继承Test类,需要导入一下的一些包:

  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) {

this.id = id;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}


public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public void info()

{

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

}

}

package com.test.unittest;

public class Teacher {

String tname;

String tage;

public Teacher(String tname, String tage) {

super();

this.tname = tname;

this.tage = tage;

}

public String getTname() {

return tname;

}

public void setTname(String tname) {

this.tname = tname;

}

public String getTage() {

return tage;

}

public void setTage(String tage) {

this.tage = 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");

}

}

package com.Unittest;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

import com.test.unittest.Teacher;

public class TeacherTest {

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

@Before

public void setUp(){

System.out.println("Teacher Initial");

}

@Test

public void infoTest()

{

teacher.info();

}

@After

public void tearDown(){

System.out.println("Teacher Destroy");

}

}

package com.Unittest;

import org.junit.runner.RunWith;

import org.junit.runners.Suite;

import org.junit.runners.Suite.SuiteClasses;

import com.test.unittest.Student;

@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/

时间: 2024-11-10 07:35:34

JUnit的基本使用的相关文章

Eclipse学习4-在Eclipse中使用JUnit进行单元测试(下)

使用JUnit测试一个应用程序现在已经准备好测试JN_test应用程序.为了测试,还需要使用JUnit Wizard创建一个新的class来扩展JUnit测试用例.要使用此wizard,请在Package Explorer 中的JN_test上单击右键,并且选择New->Other来打开一个New对话框,如图所示: 现在展开Java结点并选择JUnit,然后再选择JUnit Test Case,单击Next按钮,如图: 通常情况下JUnit类命名要和被它测试的类同名,并在其后面添加Test.所以

Eclipse学习4-在Eclipse中使用JUnit进行单元测试(上)

使用JUnit进行测试 JUnit是与Eclipse一起提供的一个开源测试框架.在同一个Project中,可以创建与其它class无异的"基于JUnit"的class,并使用此JUnit代码去测试project中的其它class.JUnit的此种使用方式能够为每位在此应用程序上工作的人员构建一组标准的测试.如果当更改了应用程序代码以后,他们所需做的工作仅仅是点击几下按钮来验证此应用程序是否依然能够通过标准测试. JUnit被用来测试代码,并且它是由能够测试不同条件的断言方法(asser

JUnit源码分析(二)

    在上面我们已经提到了junit.extentions包中的内容TestSetup.来看看整个包的结构吧. 先简要的介绍下包中各个类的功能.ActiveTestSuite对TestSuite进行了改进,使得每个test运行在一个单独的线程里面,并且只到所有的线程都结束了才会结束整个测试.ExceptionTestCase是对TestCase进行的改进,可以方便的判断测试类是否抛出了期望的异常.而剩下的三个类,大概你看的出来是使用了装饰模式来设计的.其中TestDecorator为具体装饰类

JUnit源码分析(三)

三.微观--执行流程与代码风格 来过一遍JUnit的执行流程吧,这样你就能对JUnit有个清晰的认识,虽然作为一个使用者这完全是不必要的.从<JUnit in Action>直接拿来一张JUnit流程图. 哦,也许你看晕了,我来当下导游好了.上面已经提到了TestRunner是BaseTestRunner的子类,在三个不同的ui包中各有一个TestRunner.这里我们仅以junit.textui包中的为例. TestRunner作为入口程序是怎么被启动的呢?习惯了使用容器的我们现在也许很少考

JUnit和单元测试入门简介

JUnit和单元测试入门简介 1.几个相关的概念 白盒测试--把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的. 回归测试--软件或环境的修复或更正后的"再测试",自动测试工具对这类测试尤其有用. 单元测试--是最小粒度的测试,以测试某个功能或代码块.一般由程序员来做,因为它需要知道内部程序设计和编码的细节. JUnit --是一个开发源代码的Java测试框架,用于编写和运行可重复的测试.他是用于单元测试框架体系xUnit的一个实例(用于java语言).主要

JUnit测试程序

程序 JUnit测试程序编写规范 一. 程序命名规范 1.测试类的命名 测试类的命名规则是:被测试类的类名+Test 比如有一个类叫IrgSrhDelegate,那么它的测试类的命名就是IrgSrhDelegateTest 2.测试用例的命名 测试用例的命名规则是:test+用例方法名称 比如要测试的方法叫updateData,那么测试用例的命名就是testUpdateData (说明:"用例方法"就是指被测试的类中所包含的方法,而"测试用例"就是指测试类中所包含的

建议用JUNIT建立测试类

JUNIT Getting Started 概念:关于JUNIT的概念可以参见Thinking in Java 2的第一章里的Extreme programming 以junit3.5为例将classpath指向junit.jar HelloWorld: 在junit3.5下(或者其他地方)建立一个工作目录mypro,然后建立项目目录hello其中有文件:HelloWorld.java package mypro.hello; public class HelloWorld{    public

项目集成Maven后JUnit报ClassNotFoundException错误原因及解决方法

前提:原有项目一切运行正常,单元测试正常执行. 项目开始使用Maven管理,结果发现原有的JUnit测试无法执行,类无法找到(java.lang.ClassNotFoundException).无论如何修改Maven配置,报错依然. 分析原因: MyEclipse之所以能识别项目,是根据.project文件解析:而项目的目录结构则是在.classpath文件中定义.MyEclipse的JUnit插件也是根据以上文件来查找源代码和class文件的存放目录.项目集成Maven后,通过执行maven命

项目添加Maven支持后运行JUnit单元测试出现错误

项目添加Maven支持后,运行JUnit单元测试,出现一下错误: ERROR in ch.qos.logback.core.joran.action.AppenderAction - Could not create an Appender of type [com.travelsky.tdp.pkgStock.integration.logback.appender.mail.SMTPAppender]. ch.qos.logback.core.util.DynamicClassLoading

Hibernate映射文件打成jar,JUnit测试无法正确执行的问题分析

之前将Hibernate的实体类及其映射文件也放到项目中,由于有多个项目使用同一个数据库, Hibernate实体类和映射文件重复,不便于维护和升级.因此将其抽取出来,打成jar包,再引入回项目. 实际操作中,发现个诡异的问题:项目运行没问题,但是JUnit单元测试不能运行(方法使用了HQL语 句时),总是报org.hibernate.hql.ast.QuerySyntaxException的错误,说明没有找到映射文件,不知道 为何.具体报错信息如下: org.springframework.o