标签:通过 version 例子 讲解 like static 博客 long 自动
SpringBoot 项目单元测试也很方便, Web项目中单元测试应该覆盖:
1. Service 层
2. Controller 层
本文前半部分讲解是一些测试基础配置. 对于Service和Controller测试的讲解,摘自一个博客(嘟嘟独立博客的博客, Spring Boot干货系列:(十二)Spring Boot使用单元测试, 链接: http://tengj.top/2017/12/28/springboot12/)
=====================
pom.xml 文件
=====================
单元测试包名称是spring-boot-starter-test, 另外,必须加上 spring-boot-starter-parent.
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> </parent>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
=====================
java 代码
=====================
Eclipse 中创建一个Mavan project, 就会自动创建单元测试专用folder, 以及一个AppTest.java, 注意该测试java程序虽然和应用程序入口的java文件不在一个目录下, 但它们是同一个package.
下面是一个极简的测试java.
// AppTest.java file @RunWith(SpringRunner.class) @SpringBootTest(classes = App.class) public class AppTest { @Test public void test1() { System.out.println("test1"); } }
上面代码重点是, 测试类加@RunWith注解, 还有加上 @SpringBootTest(classes = App.class) 注解, 这里的 App.class 是主程序java类. 主程序java程序必须是SpringBootApplication程序, 否则测试用例会报如下错误:
Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test java.lang.IllegalStateException.
下面是一个极简的主程序java.
// App.java file @SpringBootApplication public class App extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(App.class); } public static void main(String[] args) throws Exception { SpringApplication.run(App.class, args); } }
===========================
下面为转载内容, 摘自 http://tengj.top/2017/12/28/springboot12/
===========================
编写创建好的测试类,具体代码如下:
1
|
package com.dudu.service;
|
上面就是最简单的单元测试写法,顶部只要@RunWith(SpringRunner.class)
和SpringBootTest
即可,想要执行的时候,鼠标放在对应的方法,右键选择run该方法即可。
测试用例中我使用了assertThat断言,下文中会介绍,也推荐大家使用该断言。
上面只是针对Service层做测试,但是有时候需要对Controller层(API)做测试,这时候就得用到MockMvc了,你可以不必启动工程就能测试这些接口。
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
Controller类:
1
|
package com.dudu.controller;
|
这里我们也自动创建一个Controller的测试类,具体代码如下:
1
|
package com.dudu.controller;
|
上面实现了基本的增删改查的测试用例,使用MockMvc的时候需要先用MockMvcBuilders使用构建MockMvc对象,如下
1
|
@Before
|
因为拦截器那边会判断是否登录,所以这里我注入了一个用户,你也可以直接修改拦截器取消验证用户登录,先测试完再开启。
这里拿一个例子来介绍一下MockMvc简单的方法
1
|
/**
|
application/json;charset=UTF-8
application/json;charset=UTF-8
嘟嘟MD独立博客
,不是就测试不通过mockMvc 更多例子可以本篇下方参考查看
JUnit 4.4 结合 Hamcrest 提供了一个全新的断言语法——assertThat。程序员可以只使用 assertThat 一个断言语句,结合 Hamcrest 提供的匹配符,就可以表达全部的测试思想,我们引入的版本是Junit4.12所以支持assertThat。
清单 1 assertThat 基本语法
1
|
assertThat( [value], [matcher statement] );
|
清单 2 使用匹配符 Matcher 和不使用之间的比较
1
|
// 想判断某个字符串 s 是否含有子字符串 "developer" 或 "Works" 中间的一个
|
优点 3:assertThat 不再像 assertEquals 那样,使用比较难懂的“谓宾主”语法模式(如:assertEquals(3, x);),相反,assertThat 使用了类似于“主谓宾”的易读语法模式(如:assertThat(x,is(3));),使得代码更加直观、易读。
优点 4:可以将这些 Matcher 匹配符联合起来灵活使用,达到更多目的。如清单 3 所示:
清单 3 Matcher 匹配符联合使用
1
|
// 联合匹配符not和equalTo表示“不等于”
|
1
|
assertTrue( s.indexOf("developer") > -1 || s.indexOf("Works") > -1 );
|
如果该断言出错,只会抛出无用的错误信息,如:junit.framework.AssertionFailedError:null。
如果想在出错时想打印出一些有用的提示信息,必须得程序员另外手动写,如:
1
|
assertTrue( "Expected a string containing ‘developer‘ or ‘Works‘",
|
非常的不方便,而且需要额外代码。
JUnit 4.4 会默认自动提供一些可读的描述信息,如清单 4 所示:
清单 4 JUnit 4.4 默认提供一些可读的描述性错误信息
1
|
String s = "hello world!";
|
JUnit 4.4 自带了一些 Hamcrest 的匹配符 Matcher,但是只有有限的几个,在类 org.hamcrest.CoreMatchers 中定义,要想使用他们,必须导入包 org.hamcrest.CoreMatchers.*。
清单 5 列举了大部分 assertThat 的使用例子:
1
|
字符相关匹配符
|
单元个测试的时候如果不想造成垃圾数据,可以开启事物功能,记在方法或者类头部添加@Transactional
注解即可,如下:
1
|
@Test
|
这样测试完数据就会回滚了,不会造成垃圾数据。如果你想关闭回滚,只要加上@Rollback(false)
注解即可。@Rollback
表示事务执行完回滚,支持传入一个参数value,默认true即回滚,false不回滚。
如果你使用的数据库是Mysql,有时候会发现加了注解@Transactional
也不会回滚,那么你就要查看一下你的默认引擎是不是InnoDB,如果不是就要改成InnoDB。
MyISAM与InnoDB是mysql目前比较常用的两个数据库存储引擎,MyISAM与InnoDB的主要的不同点在于性能和事务控制上。这里简单的介绍一下两者间的区别和转换方法:
InnoDB:InnoDB是MySQL5.5版本的默认数据库存储引擎,不过InnoDB已被Oracle收购,MySQL自行开发的新存储引擎Falcon将在MySQL6.0版本引进。InnoDB具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。尽管如此,但是InnoDB包括了对事务处理和外来键的支持,这两点都是MyISAM引擎所没有的。
MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
查看MySQL当前默认的存储引擎:
1
|
mysql> show variables like ‘%storage_engine%‘;
|
你要看user表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):
1
|
mysql> show create table user;
|
将user表修为InnoDB存储引擎(也可以此命令将InnoDB换为MyISAM):
1
|
mysql> ALTER TABLE user ENGINE=INNODB;
|
如果要更改整个数据库表的存储引擎,一般要一个表一个表的修改,比较繁琐,可以采用先把数据库导出,得到SQL,把MyISAM全部替换为INNODB,再导入数据库的方式。
转换完毕后重启mysql
1
|
service mysqld restart
|
到此为止,Spring Boot整合单元测试就基本完结,关于MockMvc以及assertThat的用法大家可以继续深入研究。后续会整合Swagger UI这个API文档工具,即提供API文档又提供测试接口界面,相当好用。
想要查看更多Spring Boot干货教程,可前往:Spring Boot干货系列总纲
标签:通过 version 例子 讲解 like static 博客 long 自动
原文地址:https://www.cnblogs.com/harrychinese/p/springboot_unittesting.html