https://blog.csdn.net/Roobert_Chao/article/details/88796849
SpringBoot测试,改变了之前的一些不方便的地方,一是测试自动进行事务回滚。
二是可以模拟 service ,三是引入 @sql,模拟好测试场景。
Mockito ,Java Mockito 框架,用于模拟任何 Spring 管理的 Bean ,比如在单元测试中模拟一个第三方系统 service 接口返回的数据,而不会真正调用第三方系统。
@RunWith(SpringRunner.class) // 指明的类来提供单元测试。
@SpringBootTest // 默认根据包名逐级向上查找,一直找到 @SpringBootApplication 来判断是否是主程序,并在测试的时候,启动该类的上下文环境。
public class UserServiceTest{
@Autowired
UserService userService;
@Test
@DirtiesContext // 提示 Spring 重新加载 Spring 上下文
public void testService(){
}
}
单元测试不能实际调用 service ,因此单元测试中使用 了 @MockBean
@MockBean // 注解可以自动注入 Spring 管理的 userService。
private UserService userService;
// 通过 Mockito 工具创建的 UserService$xxxxx 实例,。
// given 是 Mockito 的一个静态方法,用来模拟一个 Service 方法调用返回。
// anyInt() 指示可以传入任何参数,willReturn 方法说明这个调用将返回 100。
given(this.UserService.getUser(anyInt()).willReturn(expectedCredit));
在 Spring MVC Test 中,带有 @Service 、@Component 的类不会自动扫描注册为 Spring 容器管理的 Bean 。
用来在 Servlet 容器内对 Controller 进行单元测试,并非发起 HTTP 请求调用 Controller
@WebMvcTest(UserController.class)
public class UserControllerTest{
@AutoWired
private MockMvc mvc; //
@Test
public void testMvc(){
mvc.perform(get("user/{id}",userId))
.andExpect(content().string(String.valueOf(expectedCredit)));
}
}
比较 Model
比较 forward 和 redirect
比较内容
Mock 测试,对那些不容易构建的对象用一个虚拟对象来代替测试的方法。
@RunWith(MockitoJunitRunner.class)
LinkedList mockedList = mock(LinkedList.class);
List ist = mock(List.class);
when(userService.getUser(anyInt())).thenReturn(1000);
// 传入明确的参数
when(userService.getUser(eq(userId))).thenReturn(1000);
// 通过 verify 方法类更为精确的校验模拟对象是否被调用。
verify(userService,times(2)).getUser(eq(userId)); // 期望调用两次,如果只发生一次则报异常。
// 模拟返回值
when(userService.getUser(eq(userId))).thenReturn(1000);
// 模拟异常抛出
when(userService.getUser(eq(userId))).thenThrow(new Exception("异常的抛出"));
// 模拟无参数异常抛出
doThrow(new Exception("异常的抛出")).when(list).clear();
list.clear();
@RunWith(SpringRunner.class) // 指明的类来提供单元测试。
@SpringBootTest // 默认根据包名逐级向上查找,一直找到 @SpringBootApplication 来判断是否是主程序,并在测试的时候,启动该类的上下文环境。
@ActiveProfiles("test") // test 是专门用于测试的数据库,需要新建,及配置文件的加载
@Transactional
public class UserServiceTest{
@Autowired
UserService userService;
@Test
@Sql({"user.sql"})
public void testService(){
User user = new User();
user.setId(1);
user.setName("123456");
// 修改用户名称。
boolean success = userService.updateUserName(user);
assertTrue(success);
}
}
### user.sql 文件是
INSERT INTO `user` (id,`name`,`department_id`) values(1,'ijz','1');
### @ActiveProfiles("test") 为测试环境设置新的 applicaion-test.properties
Swagger 规范是一个 JSON 格式的文件,包含项目基本信息及接口描述信息,可以在static/swagger3 下创建一个 sample.json 文件
内存存储的数据结构服务器。存放在 Redis 中的数据不大于内存容量,否则会因为操作系统虚拟内存导致性能降低。
官网暂无支持 windows 版本的内容,要下载windows版本的可访问我的网盘,包含客户端以及压缩包:链接:支持windows版本的Redis ,
提取码:fzoc
redis.windows.conf 是redis的配置文件。
redis-server.exe 服务器端。
redis-cli 命令行客户端。
redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能。
redis-server redis.windows.conf,出现下图显示内容表示启动成功了。
// 添加到系统服务当中,则会一直启动,正如 MySql 那样。
redis-server--service-install redis.windows-service.conf--loglevel verbose
重新打开一个终端,进入 src 目录,运行 ./redis-cli,进入Redis 客户端管理工具。
requirepass rootroot
auth "rootroot" // 使用 auth 命令来验证合法性,随后的操作才能成功。
### pom.xml
org.springframework.boot
spring-boot-starter-data-redis
### application.properties
spring.redis.host=127.0.0.1
spring.redis.password=rootroot
spring.redis.port=6379
### #最大的连接数
属性 max-active 指定了 Spring Boot 应用的最大连接数,0 表示无限制。
spring.redis.pool.max-active=8
StringRedisTemplate 继承了 RedisTemplate,与 RedisTemplate 不同的是重新设置了序列化策略,使用 StringRedisSerializer 类来序列化 Key-Value,以及 List、Hsah、Set 等数据结构中的元素。
Redis | Spring Boot 集成 Redis |
---|---|
set testenv para | redisClient.opsForValue().set(“testenv”,“para”); |
get testenv | redisClient.opsForValue().get(“testenv”); |
lpush platform:message hello,world | redisClient.opsForList().leftPush(“platform:message”,“hello,world”); |
lpush platform:message hello,springboot | redisClient.opsForList().leftPush(“platform:message”,“hello,springboot”); |
SpringBoot 应用通常会部署在多个 Web 服务器上同时提供服务,
1、单个应用宕(dàng)机不会停止服务,升级应用可以逐个升级不必停止服务。
2、提高了应用整体的吞吐量。
这种方式称为水平扩展
。前端通过 Nginx 提供反向代理,回鹘管理通过 Spring Session ,使用 Redis 来存放 Session 。部署SpringBoot 项目到任意一台 Web 服务器上,从而提高了系统的可靠性和可伸展性。
一、系统提升处理能力。(系统升级)
二、Spring Boot 应用水平扩展有两个问题:
三、两种方式实现共享会话
四、正/反向代理。
轻量级的 Web 服务器/反向代理服务器及电子邮件代理服务器。
http{
include mine.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream backend{
server 127.0.0.1:9000;
server 127.0.0.1:9001;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend;
}
}
}
// 紧接着创建一个 SpringBoot 应用,并分别以 9000 和 9001 两个端口启动,
// 然后再 Spring Session 的基础上来完成 应用的水平扩展。
默认情况下,Spring Boot 使用的是 Tomcat 的 Session 实现。
### application.properties
spring.session.store-type=Redis
spring.redis.host=127.0.0.1
spring.redis.host=6379
spring.redis.password=rootroot
@Controller
public class SpringSessionController{
Log log = LogFactory.getLog(SpringSessionController.class);
@RequestMapping("/session.html")
public @ResponseBody String putSession(HttpServletSession request){
HttpSession session = request.getSession();
log.info(session.getClass());
log.info(session.getId());
}
}
keys spring:session:*
查看所有 "spring:session:" 开头的 keys
其中 "spring.session.sessions" 代表一个会话id,
hgetall "会话id" // 查看会话所有信息
HMGET "会话id" 存入 Redis 的Key , // 查看存入Redis 的 内容的信息
SpringBoot 默认创建的 Key :
1、creationTime :创建时间。
2、maxInactiveInterval:指定过期时间(秒)。
3、lastAccessedTime:上次访问时间。
4、sessionAttr:以"sessionAttr:",为前缀的会话信息。
// 使用 ttl 查看会话过期的时间。
ttl spring:session:sessions:expires:key
Java EE 规范中由 JMX 来监控管理应用。
SpringBoot 也提供了 Actuator 功能来完成类似的监控。
能查看和监控一下的信息 |
---|
SpringBoot 的配置信息 |
SpringBoot 配置的 Bean 信息 |
最近请求的 Http 请求 |
数据源、NoSql 等数据状态 |
在线查看日志内容,在线日志配置修改 |
所有@RequestMapping 注解的URL 路径 |
自动配置信息汇总 |
打印虚拟机的线程栈 |
Dump 内存 |
应用的各种指标汇总 |
自定义监控指标 |
安装 Actuator。
### pom.xml
org.springframework.boot
spring-boot-starter-actuator
2.1.3.RELEASE
### application.properties
# actuator监控权限配置
management.security.enabled = false
#配置默认监控端口号
management.port = 54001
# 设置系统监控的访问端口
management.server.port=8081
endpoints.default.web.enabled=true
--- 考虑到系统监控涉及到系统安全,
--- SpringBoot的actuator启动端点监控web端默认加载默认只有两个info, health。(下面表格红色部分)
## 包含所有节点页面
management.endpoints.web.exposure.include=*
## 排除env、beans
management.endpoints.web.exposure.exclude=env,beans
### 所有监控都在 /actuator 下,可以更改配置,修改成想要的路径:
management.context-path=/manage
ID | 描述 | 敏感(Sensitive) |
---|---|---|
autoconfig | 显示一个auto-configuration的报告,该报告展示所有auto-configuration候选者及它们被应用或未被应用的原因 | true |
beans | 显示一个应用中所有Spring Beans的完整列表 | true |
configprops | 显示一个所有@ConfigurationProperties的整理列表 | true |
dump | 执行一个线程转储 | true |
env | 暴露来自Spring ConfigurableEnvironment的属性 | true |
health |
展示应用的健康信息(当使用一个未认证连接访问时显示一个简单的’status’,使用认证连接访问则显示全部信息详情) | false |
info |
显示任意的应用信息 | false |
metrics | 展示当前应用的’指标’信息 | true |
mappings | 显示一个所有@RequestMapping路径的整理列表 | true |
shutdown | 允许应用以优雅的方式关闭(默认情况下不启用) | true |
httptrace | 显示trace信息(默认为最新的一些HTTP请求) | true |
SpringBoot 2 提供注解 @Endpoint 来自定义一个监控类,并在方法上使用 @ReadOperation来显示监控指标。使用 @WriteOperation来动态更改监控指标。