摘要

上学期,软件工程老师上课顺带讲了单元测试,虽然只是一笔带过。但我感觉就很有用,后来事也很多,忙过头了,一直没抽出时间研究一下。

今天就来整一下。加油,奥利给!

正文

一、测试分类

  1. 黑盒测试:不需要写入代码,给输入值,看程序是否能够输出期望的值。
  2. 白盒测试:需要写代码。关注程序的具体执行过程。像Junit就是白盒测试的一种。

1.png

黑盒测试比较简单,一般现在市面上很多的测试,都是黑盒测试。

当然,如果选择做测试之类的工作的话,我还是希望做白盒测试了。多写代码,对身体有益,奥利给!

二、Junit使用:白盒测试

背景

如果想要测试一下计算器的运算结果对不对,以往,我会这样写,先定义一个Calculator类:

java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
 * 计算器类
 */
public class Calculator {
	/**
	 * 加法
	 * @param a
	 * @param b
	 * @return
	 */
	public int add(int a,int b) {
		return a+b;
	}
	/**
	 * 减法
	 * @param a
	 * @param b
	 * @return
	 */
	public int sub(int a,int b) {
		return a-b;
	}
	
}

再定义一个测试类:

java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class CalculatorTest {
	public static void main(String[] args) {
		//创建对象
		Calculator c=new Calculator();
		//调用
//		int result=c.add(1,2);
//		System.out.println(result);
		//如果我现在又想测试减法,那还得再写一个
		int result=c.sub(1, 2);
		System.out.println(result);
		
	}
}

看上面代码就知道了,我测试完了加法,又想测试减法,只能重新再写一次,很麻烦。

所以我们可以通过Junit进行单元测试,免除这些复杂的步骤。

使用Junit

步骤:

  1. 定义一个测试类(测试用例) 测试类名:被测试的类名Test,如CalculatorTest 包名:xxx.xxx.xxx.test,如top.meethigher.test
  2. 定义测试方法:可以独立运行 方法名:test测试的方法名,如testAdd() 返回值:void 参数列表:空参
  3. 给方法加注解@Test
  4. 导入Junit的依赖环境

Junit 5跟Junit 4的比较

判定结果:

  • 红色代表失败
  • 绿色代表成功
  • 一般我们使用断言操作来处理结果,Assert.assertEquals(expected,actuals)

补充:

@BeforeEach:修饰的方法,会在测试方法执行之前执行

@AfterEach:修饰的方法,会在测试方法执行之后执行

java
 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 CalculatorTest {
	/**
	 * 初始化方法
	 * 用于资源的申请,所有的测试方法都会执行该方法
	 */
	@BeforeEach
	public void init() {
		System.out.println("init...");
	}
	/*
	 * 释放资源方法
	 * 在所有测试方法执行完后,都会自动执行该方法
	 */
	@AfterEach
	public void close() {
		System.out.println("close...");
	}
	/**
	 * 测试add方法
	 */
	@Test
	public void testAdd() {
		//1.创建计算器对象
		Calculator c=new Calculator();
		//2.调用add方法
		int result=c.add(1, 2);
//		System.out.println(result);
		//3.断言,我断言这个结果是3,如果是一样的就是绿色,如果不一样就是红色
		Assert.assertEquals(3, result);
		System.out.println("加法测试");
	}
	/**
	 * 测试sub方法
	 */
	@Test
	public void testSub() {
		Calculator c=new Calculator();
		int result=c.sub(2, 2);
		Assert.assertEquals(0, result);
		System.out.println("减法测试");
	}
}

2.png

上面该例子是Junit5的使用例子,下面放上一个Junit4使用例子,其实没太大区别

java
 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
public class MybatisTest05 {
    private InputStream is;
    private SqlSession sqlSession;
    private PersonDao personDao;
    @Before //用于在测试方法之前执行
    public void init() {
        //1.读取配置文件,获取输入流
        try {
            is = Resources.getResourceAsStream("SqlMapConfig.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        //2.获取SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
        //3.获取SqlSession对象
        sqlSession = factory.openSession();
        //4.获取代理dao对象
        personDao = sqlSession.getMapper(PersonDao.class);
    }
    @After //用于在测试方法之后执行
    public void destroy() throws IOException {
        if (sqlSession != null)
            sqlSession.close();
        if (is != null)
            is.close();
    }

    /**
     * 测试查找所有
     *
     * @throws IOException
     */
    @Test
    public void testFindAll() throws IOException {
        List<Person> persons = personDao.findAll();
        for (Person p : persons) {
            System.out.println(p);
        }
    }

    /**
     * 测试保存数据
     */
    @Test
    public void testSave() throws IOException {
        Person person = new Person();
        person.setName("肖战");
        person.setGender("男");
        person.setAge(38);
        person.setGrade(1);
        person.setSchool("腾讯");
        person.setPosition("日本");
        personDao.savePerson(person);
        //提交事务
        sqlSession.commit();
    }
}