目录
1.概述
2.断言
3.常用注解
3.1.@Test
3.2.@Before
3.3.@After
3.4.@BeforeClass
3.5.@AfterClass
4.异常测试
5.超时测试
6.参数化测试
什么是单元测试:
单元测试,是针对最小的功能单元编写测试代码,在JAVA中最小的功能单元是方法,单元测试针对JAVA就是单个方法的测试。目的就是保证单个方法的正常运行。
JUnit是什么:
专门针对java语言设计,使用广泛的一个标准单元测试框架。使用断言+注解的方式对单个方法进行测试。注解用来控制行为,断言用来进行判断。
名称 | 说明 | 示例 |
---|---|---|
assertEquals | 相等 | assertEquals(100,x) |
assertArrayEquals | 数组相等 | assertArrayEquals({1,2,3},x) |
assertEquals | 浮点数相等 | assertEquals(3.1415926,x) |
assertNull | null | assertNull(x) |
assertTrue | true | assertTrue(x>0) |
assertFalse | false | assertFalse(x<0) |
assertNotEquals | 不相等 | assertNotEquals(100,x) |
assertNotNull | 不为空 | assertNotNull(x) |
@Test,用来注解单个测试用例,每个@Test就是个独立的单元,单个@Test的生命周期是相互独立的。
代码示例:
public class Demo1Test {
Demo1 demo1;
public Demo1Test(){
System.out.println("建立测试用例!");
}
@Before
public void before(){
System.out.println("测试开始!");
demo1=new Demo1();
}
@Test
public void testSum1(){
Assert.assertEquals("65",demo1.sum("5",2,4,6));
}
@Test
public void testSum2(){
Assert.assertEquals("65",demo1.sum("5",2,4,6));
}
@After
public void after(){
System.out.println("测试结束!");
}
}
测试结果:
@Before,@Test之前执行,一般用于准备一些资源。
代码示例:
public class Demo1Test {
Demo1 demo1;
@Before
public void before(){
demo1=new Demo1();
}
@Test
public void testSum(){
Assert.assertEquals("65",demo1.sum("5",2,4,6));
}
}
@After,@Test之后执行,一般用于释放一些资源。
代码示例:
public class Demo1Test {
Demo1 demo1;
@Before
public void before(){
demo1=new Demo1();
}
@Test
public void testSum(){
Assert.assertEquals("65",demo1.sum("5",2,4,6));
}
@After
public void after(){
System.out.println("测试结束!");
}
}
@BeforeClass,作用于类层面,修饰静态方法,整个类的生命周期中,只在类的生命周期开始的时候执行一次。
一般用于准备一些所有用例共享的资源。
代码示例:
public class Demo1Test {
Demo1 demo1;
@BeforeClass
public static void beforeClass(){
System.out.println("beforeClass......");
}
public Demo1Test(){
System.out.println("建立测试用例!");
}
@Before
public void before(){
System.out.println("测试开始!");
demo1=new Demo1();
}
@Test
public void testSum1(){
Assert.assertEquals("65",demo1.sum("5",2,4,6));
}
@Test
public void testSum2(){
Assert.assertEquals("65",demo1.sum("5",2,4,6));
}
@After
public void after(){
System.out.println("测试结束!");
}
}
运行结果:
@AfterClass,作用于类层面,修饰静态方法,整个类的生命周期中,只在类的生命周期结束的时候执行一次。
一般用于销毁一些所有用例共享的资源。
代码示例:
public class Demo1Test {
Demo1 demo1;
@BeforeClass
public static void beforeClass(){
System.out.println("beforeClass......");
}
public Demo1Test(){
System.out.println("建立测试用例!");
}
@Before
public void before(){
System.out.println("测试开始!");
demo1=new Demo1();
}
@Test
public void testSum1(){
Assert.assertEquals("65",demo1.sum("5",2,4,6));
}
@Test
public void testSum2(){
Assert.assertEquals("65",demo1.sum("5",2,4,6));
}
@After
public void after(){
System.out.println("测试结束!");
}
@AfterClass
public static void afterClass(){
System.out.println("afterClass......");
}
}
运行结果:
通过@Test注解的expected属性可以断定该TestCase抛出的异常,抛出不匹配的异常会报错。
代码示例:
@Test(expected = NumberFormatException.class)
public void testNumberFormat(){
Integer.parseInt(null);
}
通过@Test注解的timeout属性可以设置每个TestCase执行耗时的时间阈值,超时会报错。
代码示例:
@Test(timeout = 3000)
public void testNumberFormat(){
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Junit提供了输入一组参数进行测试的机制。
代码示例:
@RunWith(Parameterized.class)
public class ParameterTest {
//用于准备一组数据的方法
//方法严格约定为 public Collection> data()
@Parameterized.Parameters
public static Collection> data(){
return Arrays.asList(new Object[][]{
{0,0},{1,1},{-1,1}
});
}
int input;
int expected;
//准备好的数据会在构造方法中自动传递过来
public ParameterTest(int input,int expected){
this.input=input;
this.expected=expected;
}
@Test
public void testAbs(){
int r=Math.abs(this.input);
Assert.assertEquals(this.expected,r);
}
}