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