Junit测试

Junit单元测试

Junit的概念

  • 概述 : Junit是Java语言编写的第三方单元测试框架(工具类)
  • 作用 : 用来做“单元测试”——针对某个普通方法,可以像main()方法一样独立运行,它专门用于测试某个方法。

Junit的使用步骤

  • 1.在模块下创建lib文件夹,把Junit的jar包复制到lib文件夹中

  • 2.选中Junit的jar包,右键选中 add as Library,把JUnit4的jar包添加到classPath中

maven 引入依赖

1
2
3
4
5
6
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
  • 3.在测试方法上面写上@Test注解

  • 4.执行测试方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Person {

    @Test
    public void test1(){
    System.out.println("Person test1 方法执行了....");
    }

    @Test
    public void test2(){
    System.out.println("Person test2 方法执行了....");
    }

    }

执行测试方法

  • 1.选中方法名—>右键—>选中执行 只执行选中的测试方法

  • 2.选中类名—–>右键—>选中执行 执行该类中所有的测试方法

  • 3.选中模块—- ->右键—>选中all tests 执行 执行该模块中所有的测试方法

  • 如何查看测试结果

    • 绿色:表示测试通过
    • 红色:表示测试失败,有问题

Junit单元测试的注意实现

  • 1.测试方法的权限修饰符一定是public
  • 2.测试方法的返回值类型一定是void
  • 3.测试方法一定没有参数
  • 4.测试方法 的声明之上一定要使用@Test注解

Junit注解

  • @Test:测试注释指示该公共无效方法它所附着可以作为一个测试用例。
  • @Before:用来修饰方法,该方法会在每一个测试方法执行之前执行一次。
  • @After:用来修饰方法,该方法会在每一个测试方法执行之后执行一次。(如执行每一个测试后重置某些变量,删除临时变量等)
  • @BeforeClass:用来静态修饰方法,该方法会在所有测试方法之前执行一次,而且只执行一次。(一般是测试计算共享配置方法(如连接到数据库)。)
  • @AfterClass:用来静态修饰方法,该方法会在所有测试方法之后执行一次,而且只执行一次。(AfterClass 注解可以使用以清理建立方法,(从数据库如断开连接)。)
  • @Ignore:当想暂时禁用特定的测试执行可以使用忽略注释。每个被注解为 @Ignore 的方法将不被执行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class Student {

@BeforeClass
public static void beforeClass1(){
System.out.println("Student beforeClass1静态方法执行了...");
}

@BeforeClass
public static void beforeClass2(){
System.out.println("Student beforeClass2静态方法执行了...");
}


@Before
public void b1(){
System.out.println("Student b1方法执行了...");
}

@Before
public void b2(){
System.out.println("Student b2方法执行了...");
}

@Before
public void b3(){
System.out.println("Student b3方法执行了...");
}


@Test
public void test1(){
System.out.println("Student test1 方法执行了....");
}

@Test
public void test2(){
System.out.println("Student test2 方法执行了....");
}

@After
public void a1(){
System.out.println("Student a1方法执行了...");
}

@After
public void a2(){
System.out.println("Student a2方法执行了...");
}

@After
public void a3(){
System.out.println("Student a3方法执行了...");
}

@AfterClass
public static void afterClass1(){
System.out.println("Student afterClass1方法执行了...");
}

@AfterClass
public static void afterClass2(){
System.out.println("Student afterClass2方法执行了...");
}

}

Junit断言

断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。

  • 断言:预先判断某个条件一定成立,如果条件不成立,则直接报错。 使用Assert类中的assertEquals()方法

使用断言可以创建更稳定、品质更好且 不易于出错的代码。当需要在一个值为 false 时中断当前操作的话,可以使用断言。单元测试必须使用断言(Junit/JunitX)。

常用断言方法

断言 描述
void assertEquals([String message], expected value, actual value) 断言两个值相等。值可能是类型有 int, short, long, byte, char or java.lang.Object. 第一个参数是一个可选的字符串消息
void assertTrue([String message], boolean condition) 断言一个条件为真
void assertFalse([String message],boolean condition) 断言一个条件为假
void assertNotNull([String message], java.lang.Object object) 断言一个对象不为空(null)
void assertNull([String message], java.lang.Object object) 断言一个对象为空(null)
void assertSame([String message], java.lang.Object expected, java.lang.Object actual) 断言,两个对象引用相同的对象
void assertNotSame([String message], java.lang.Object unexpected, java.lang.Object actual) 断言,两个对象不是引用同一个对象
void assertArrayEquals([String message], expectedArray, resultArray) 断言预期数组和结果数组相等。数组的类型可能是 int, long, short, char, byte or java.lang.Object.

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class Demo02 {
@Test
public void addTest(){
//测试
int add = add(3, 6);

//断言判断结果
//第一个参数表示期望值
//第二个参数表示实际值
//如果结果正确的就测试通过,如果结果错误的,就会报错
Assert.assertEquals(9,add);
}

//加法
//这个代码的语法没问题,也没有异常。他是逻辑错误,系统不知道你要算的是加法
public int add(int a, int b){
int sum = a * b;
return sum;
}
/**
* 测试断言
*/
@Test
public void testAssert() {
String obj1 = "junit";
String obj2 = "junit";
String obj3 = "test";
String obj4 = "test";
String obj5 = null;
int var1 = 1;
int var2 = 2;
int[] arithmetic1 = {1, 2, 3};
int[] arithmetic2 = {1, 2, 3};
assertEquals(obj1, obj2);
assertSame(obj3, obj4);
assertNotSame(obj2, obj4);
assertNotNull(obj1);
assertNull(obj5);
assertTrue("为真", var1 == var2);
assertArrayEquals(arithmetic1, arithmetic2);
}
}

扩展

测试本身也是一套完整学科

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
单元测试
白盒测试 能看到完整代码的
黑盒测试 没有源码的,功能测试
灰盒测试
压力测试
并发数的问题,能承载多少并发
疲劳强度测试
长期稳定运行,72小时,7天
冒烟测试
疯狂测试一个点
对主要流程测试,如支付环节
集成测试
完整功能的测试,最重要的是测试,整体业务流程
回归测试
增加一个功能,走集成测试,但是可能只有测主业务
自动化测试
编码,场景设计