导入jar文件
junit-4.12.jar
//junit-4.11之后需要自己导入该包
hamcrest-core-1.3.jar
一、套件测试(打包测试)
测试套件意味着捆绑几个单元测试用例并且一起执行他们。在 JUnit 中,@RunWith 和 @Suite 注释用来运行套件测试。
当一个类被注解为@RunWith时, JUnit 将调用注解中的Suite,以便运行测试类,而不使用内置的 JUnit 运行方法。
示例:
我们有两个用于测试的类:Test_Assert和Test_test,现在我们想要这两个类在一起一块运行,而不是单独一个一个的测试。
Test_Assert
package test.java.TestJunit;
import org.junit.Test;
import static org.junit.Assert.*;
public class Test_Assert {
@Test
public void stuAssert(){
String str1 = "testStr";
String str2 = new String("testStr");
//断言两个对象不相等
assertNotSame("str1和str2不相等",str1,str2);
}
}
Test_Test
package test.java.TestJunit;
import main.java.StuJunit.Calculator;
import org.junit.*;
public class Test_Test {
Calculator calculator = new Calculator();
@Test
public void test1(){
System.out.println(calculator.addtion(2,4));
}
}
进行套件测试的类:
当我们运行该类时,就相当于同时运行上面两个测试类。
package test.java.TestJunit;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({Test_Test.class,Test_Assert.class})
public class Test_RunWith {
}
@RunWith 翻译成中文就是 测试运行器,JUnit所有的测试方法都是由测试运行器负责执行。
JUnit为单元测试提供了一个默认的测试运行器BlockJUnit4ClassRunner,但是没有限制必须使用默认的运行器。
常用的有参数运行器:
常用的有参数运行器 | 描述 |
@RunWith(Suit.Class) | |
@SuitClasses(MyTest.Class,MyTest2.Class) | 这个是打包测试功能,多个class 可以一起执行测试,不需要一个一个执行,这样节省时间,提高效率 |
@RunWith(Parameteried.Class) | 模拟不同的参数方法进行测试,如果为每个类型参数创建一个方法,那是很耗时,傻瓜式的。 |
@RunWith(SpringJUnit4ClassRunner.class) | 这个是用springmvc的容器 |
@RunWith(Parameterized.class) |
二、参数化测试
Junit 4 引入了一个新的功能参数化测试。参数化测试允许开发人员使用不同的值反复运行同一个测试。
创建参数化测试的步骤。
- 用 @RunWith(Parameterized.class) 来注释 test 类。
- 创建一个由 @Parameters 注释的公共的静态方法,它返回一个对象的集合(数组)来作为测试数据集合。
- 创建一个公共的构造函数,它接受和一行测试数据相等同的东西。
- 为每一列测试数据创建一个实例变量。
- 用实例变量作为测试数据的来源来创建你的测试用例。
示例:
待测试的类:
package main.java.StuJunit;
public class Calculator {
public int addtion(int a,int b){
return a+b;
}
}
测试类:
package test.java.TestJunit;
import main.java.StuJunit.Calculator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.Arrays;
import java.util.Collection;
@RunWith(Parameterized.class)
public class Test_Param {
private int op_a;
private int op_b;
Calculator calculator = new Calculator();
public Test_Param(int op_a, int op_b) {
this.op_a = op_a;
this.op_b = op_b;
}
@Parameters
public static Collection testData(){
return Arrays.asList(new Integer[][]{{1,2},{2,3},{3,4}});
}
@Test
public void testCalculator(){
System.out.println(calculator.addtion(op_a,op_b));
}
}
三、规则测试
JUnit 4中叫新增了做规则(Rule)的新功能,它允许非常灵活在测试类重新定义每个测试方法的行为。
为了这个目的,@Rule注解被使用来标出测试类的公共字段。这些字段类型为MethodRule,定义测试方法如何运行并报告。JUnit4.9开始,MethodRule被deprecated,TestRule取代它。
多个MethodRules可以应用到一个测试方法。MethodRule接口有很多的实现:
具体规则 | 描述 |
TemporaryFolder | 在测试过程中创建临时文件或者临时目录,当测试结束后,框架会自动删除。 |
ExternalResource | 设置测试前后需要做的事情(比如:文件、socket、服务、数据库的连接与关闭)。 |
ErrorCollector | 在出现一个错误后,还可以让测试继续进行下去。 |
Verifier | 在每个测试之后,甚至是在@After之后,可以使用Verifier这个Rule,进行检查。 |
TestWatcher | 对测试的每个步骤进行监控。 |
TestName | 以获取当前测试方法的名字。 |
Timeout | 设置某个测试类,所有测试方法的超时时间。 |
ClassRule | 该注解是级别的,而不是方法级别的。 |
RuleChain | 规则链 |
ExpectedException | 允许在测试规范预期的异常类型和消息 |
除了那些已经定义的规则,开发人员可以创建自己的自定义规则,并使用来测试自己用例。
示例:Testname规则
package test.java.TestJunit;
import main.java.StuJunit.Calculator;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import static org.junit.Assert.assertEquals;
public class Test_Rule {
@Rule
public TestName testName = new TestName();//获取测试方法的名称
@Test
public void test1(){
System.out.println(testName.getMethodName());
assertEquals("test1",testName.getMethodName());
}
@Test
public void test2(){
System.out.println(testName.getMethodName());
assertEquals("test2",testName.getMethodName());
}
}
四、超时测试
TimeOut这个规则已经在Junit 4.12中过时了。我们通常在@Test注解中使用timeout设置超时时间,如下:
@Test(timeout=1000) 表示该测试方法将在1000毫秒后超时,超时后测试不通过,并抛出异常。
@Test(timeout = 1000)
public void test1(){
try {
TimeUnit.MILLISECONDS.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(testName.getMethodName());
assertEquals("test1",testName.getMethodName());
}
五、异常测试
异常测试允许在测试过程中出现指定的预期异常类型。
@Test
public void test3(){
System.out.println(1/0);
}
上述代码直接测试会出现除数为零的异常:
java.lang.ArithmeticException: / by zero
此时测试不通过,如果我们想让一个测试方法在出现指定的异常时依旧能通过测试,我们可以如下修改测试方法:
@Test(expected = ArithmeticException.class)
public void test3(){
System.out.println(testName.getMethodName());
System.out.println(1/0);
}
运行该方法,即使出现ArithmeticException异常,依旧可以通过测试。