目录
一、Junit概念
Junit是java语言单元测试框架,在java程序中,一个工作单元通常是指一个方法,那么单元测试也就是对一个方法进行测试,程序员一般通过Junit来完成自己代码的一个功能测试,所以单元测试又可以叫做程序员测试,如果测试人员在熟悉方法逻辑及其实现的情况下,也可以写Junit单元测试来进行接口测试,即白盒测试。
二、 Junit测试环境搭建
2.1 一点概念
市面上比较流行的服务器: tomcat(war)、jboss(ear)、weblogic
用的比较多的项目构建工具: ant、maven:可以在线管理项目的依赖
2.2 导入Jar包的方式搭建Junit测试环境
注: maven中央仓库网址
- 创建一个普通的maven项目所需要的依赖包以及其对应的下载地址
- junit-4.11.jar
- hamcrest-core-1.3
- 之后添加项目的依赖项即可完成一个maven项目的创建(Jar文件)
2.3 创建Maven项目的方式搭建Junit测试环境
- 创建一个maven project
- 在pom.xml里面添加一个junit依赖
2.3.1 具体步骤
- 创建maven项目
- 修改pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.maven</groupId>
<artifactId>JunitTest02</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 以下是添加的代码-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
<!-- 添加代码结束-->
</project>
三、 创建一个测试用例
3.1 注意事项
- 在src/test/java下新建Package,用于编写测试用例
- 所有编写的测试类都继承自junit.framework.TestCase
- 测试类中所有的方法均需要以test开头
package com.junit.exam01;
import junit.framework.TestCase;
// 所有编写的测试类都继承自junit.framework.TestCase
public class Example01 extends TestCase{
// 测试类中所有的方法均需要以test开头
public void testExam01(){
System.out.println("this is the first case");
}
public void testExam02() {
System.out.println("This is the second case");
}
}
- 可以使用注解的方式(装饰器)来标注test方法(@Test,此时测试方法不必以test开头,也不必继承TestCase
package com.junit.exam01;
import org.junit.Test;
public class DecoExam{
// 以使用**注解**的方式来标注test方法此时测试方法不必以test开头
@Test
public void DecoExamA() {
System.out.println("This is test A");
}
@Test
public void DecoExamB() {
System.out.println("This is test B");
}
}
四、 注解详解
4.1 @Test
4.2 @Before
在所有的测试方法执行之前执行一次
package com.junit.exam01;
import org.junit.Before;
import org.junit.Test;
import junit.framework.TestCase;
// 注意一下,用继承的方式before注解不管用了
public class DecoExamBefore{
@Before
public void funcBefore() {
System.out.println("This is Before");
}
@Test
public void DecoExamA() {
System.out.println("This is test A");
}
@Test
public void DecoExamB() {
System.out.println("This is test B");
}
}
4.3 @After
在所有的测试方法执行之后执行一次
package com.junit.exam01;
import org.junit.After;
import org.junit.Test;
public class DecoExamAfter {
@After
public void funcBefore() {
System.out.println("This is After");
}
@Test
public void DecoExamA() {
System.out.println("This is test A");
}
@Test
public void DecoExamB() {
System.out.println("This is test B");
}
}
4.4 @BeforeClass和@AfterClass
用BeforeClass注解的方法在类加载的时候首先被执行一次
package com.junit.exam01;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class DecoExamClassBefore2After {
private int result = 0;
// 使用BeforeClass和AfterClass注解需要使用static关键字
@BeforeClass
public static void beforeExam() {
System.out.println("This is class before");
}
@AfterClass
public static void adterExam() {
System.out.println("This is class after");
}
@Test
public void examA() {
System.out.println("This is ExamA");
}
@Test
public void examB() {
System.out.println("This is ExamB");
}
}
五、断言
5.1 基础介绍
- assertEquals(a, b)
判断两个数据是否一致,如果一致则表示测试通过,否则表示测试不通过,抛出断言错误
- assertNotEquals(a, b)
判断两个数据是否不一致,如果不一致则表示测试通过,否则表示测试不通过,抛出断言错误
- assertNull(...)
判断某数据是否为空,如果为空,则测试通过,否则抛出断言错误
- assertNotNull(...)
判断某数据是否为空,如果不为空,则测试通过,否则抛出断言错误
- assertFalse(...)
判断某数据是否为真,如果为假,则表示测试通过,否则抛出断言错误
- assertTrue(...)
判断某数据是否为真,如果为真,则表示测试通过,否则抛出断言错误
5.2 案例
package com.junit.exam01;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
import com.junit.calc.CalcExam;
import junit.framework.Assert;
public class DemoTestCalc {
private CalcExam calc;
@Before
public void InitCalc() {
calc = new CalcExam();
}
@Test
public void add() {
calc.add(3);
int result = calc.getResult();
System.out.println("实际结果为:" + result);
Assert.assertEquals(3, result);
}
@Test
public void sub() {
calc.sub(3);
int result = calc.getResult();
System.out.println("实际结果为:" + result);
Assert.assertEquals(-3, result);
}
@Test
public void multi() {
calc.multi(3);
int result = calc.getResult();
System.out.println("实际结果为:" + result);
Assert.assertEquals(0, result);
}
@Test
public void div() {
calc.div(3);
int result = calc.getResult();
System.out.println("实际结果为:" + result);
Assert.assertEquals(0, result);
}
}
//***************************************************************************************************//
// 以下是Clac类的内容
package com.junit.calc;
public class CalcExam {
private int result = 0;
public void add(int a) {
result += a;
}
public void sub(int a) {
result -= a;
}
public void div(int a) {
if (a == 0) return;
result /= a;
}
public void multi(int a) {
result *= a;
}
public int getResult() {
return this.result;
}
}
//----------------------------------------------------------------------------------------------------//
六、 Junit打包(测试集实现)
要实现测试集的功能需要使用一个特殊的Runner,因此我们需要向@RunWith标注中传递一个参数Suite.class(即 @RunWith (Suite.class) )。同时,我们还需另一个标注@SuiteClasses用以表明这个类是一个打包测试类,基本语法为 @SuiteClasses({... , ... , ...}) ,其中的参数为需要测试的类
有了上述两个标注之后,就已经完整的表达了所有的含义,因此下面的类已经无关紧要,内容为空即可
package com.junit.exam01;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
// 固定写法,传递参数Suite.class
@RunWith(Suite.class)
// 将要测试的类写到里面
@SuiteClasses({
// 由于用到的测试类都在同一个包中也不需要额外打包
DemoTestCalc.class,
DecoExamAfter.class,
DecoExamBefore.class,
DecoExamTest.class,
DecoExamClassBefore2After.class
})
// 这个类为空即可,但是必须保留
public class DemoTestSuite {
}