摘要
上学期,软件工程老师上课顺带讲了单元测试,虽然只是一笔带过。但我感觉就很有用,后来事也很多,忙过头了,一直没抽出时间研究一下。
今天就来整一下。加油,奥利给!
正文
一、测试分类 黑盒测试:不需要写入代码,给输入值,看程序是否能够输出期望的值。 白盒测试:需要写代码。关注程序的具体执行过程。像Junit就是白盒测试的一种。
展开
黑盒测试比较简单,一般现在市面上很多的测试,都是黑盒测试。
当然,如果选择做测试之类的工作的话,我还是希望做白盒测试了。多写代码,对身体有益,奥利给!
二、Junit使用:白盒测试 背景 如果想要测试一下计算器的运算结果对不对,以往,我会这样写,先定义一个Calculator类:
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 ;
}
}
再定义一个测试类:
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 步骤:
定义一个测试类(测试用例)
测试类名:被测试的类名Test,如CalculatorTest
包名:xxx.xxx.xxx.test,如top.meethigher.test 定义测试方法:可以独立运行
方法名:test测试的方法名,如testAdd()
返回值:void
参数列表:空参 给方法加注解@Test 导入Junit的依赖环境 Junit 5跟Junit 4的比较
判定结果:
红色代表失败 绿色代表成功 一般我们使用断言操作来处理结果,Assert.assertEquals(expected,actuals) 补充:
@BeforeEach:修饰的方法,会在测试方法执行之前执行
@AfterEach:修饰的方法,会在测试方法执行之后执行
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 ( "减法测试" );
}
}
展开
上面该例子是Junit5的使用例子,下面放上一个Junit4使用例子,其实没太大区别
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 ();
}
}