目录
什么是单元测试:
单元测试,是针对最小的功能单元编写测试代码,在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);
- }
- }