单元测试
保证独立性。
Assert:断言,一般用来比较是否相等,比如
Assert.assertEquals
在JUnit测试框架中,@BeforeClass,@Before,@After和@AfterClass是四个常用的注解,它们的作用如下:
@BeforeClass:这个注解应用于静态方法,表示这个方法会在所有测试方法之前执行一次。通常用于进行一些耗时的初始化操作,例如连接数据库。
@Before:这个注解应用于方法,表示这个方法会在每个测试方法执行之前执行。通常用于进行一些初始化操作,例如重置某些变量。
@After:这个注解应用于方法,表示这个方法会在每个测试方法执行之后执行。通常用于进行一些清理操作,例如关闭数据库连接。
@AfterClass:这个注解应用于静态方法,表示这个方法会在所有测试方法之后执行一次。通常用于进行一些清理操作,例如释放资源。
这四个注解的执行顺序是:@BeforeClass -> @Before -> 测试方法 -> @After -> @AfterClass。
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class SpringBootTests {
@Autowired
private DiscussPostService discussPostService;
private DiscussPost data;
@BeforeClass
public static void beforeClass() {
System.out.println("beforeClass");
}
@Before
public void before() {
// 初始化测试数据
System.out.println("before");
this.data = new DiscussPost();
data.setUserId(111);
data.setTitle("test title");
data.setContent("Test");
data.setCreateTime(new Date());
data.setScore(Math.random() * 2000);
discussPostService.addDiscussPost(data);
}
@After
public void after() {
// 删除测试数据
System.out.println("after");
discussPostService.updateStatus(data.getId(), 2);
}
@AfterClass
public static void afterClass() {
System.out.println("afterClass");
}
@Test
public void testFindById() {
DiscussPost post = discussPostService.findDiscussPostById(data.getId());
//判断data和post是否一致
Assert.assertNotNull(post);
Assert.assertEquals(data.getTitle(), post.getTitle());
Assert.assertEquals(data.getContent(), post.getContent());
}
@Test
public void testUpdateScore() {
int rows = discussPostService.updateScore(data.getId(), 2000.00);
Assert.assertEquals(1, rows);
DiscussPost post = discussPostService.findDiscussPostById(data.getId());
Assert.assertEquals(2000.00, post.getScore(), 2);
}
}
执行整个类:
项目监控
下面演示的使用HTTP进行监控。
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
导入后就默认启用,二十多个端点大多数都启用,只有一个关闭服务器的端点未启用)最好不要启用),但只暴露了两个端点(health和info)
配置暴露
除了info和caches端点其余全暴露:
# 暴露所有端点
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=info,caches
management.endpoint.health.show-details=always
beans:
loggers:
…
自定义端点
创建actuator/DatabaseEndPoint类:
@Component
//访问路径:/actuator/database
@Endpoint(id = "database")
public class DatabaseEndpoint {
private static final Logger logger = LoggerFactory.getLogger(DatabaseEndpoint.class);
//通过连接池获取连接,查询数据库
@Autowired
private DataSource dataSource;
//ReadOperation表示只能通过GET请求访问
@ReadOperation
public String checkConnection() {
try (
Connection conn = dataSource.getConnection();
) {
return CommunityUtil.getJsonString(0, "获取连接成功!");
} catch (Exception e) {
logger.error("获取连接失败!" + e.getMessage());
return CommunityUtil.getJsonString(1, "获取连接失败!");
}
}
}
访问database:
添加权限管理
.requestMatchers(
"/discuss/delete",
"/data/**",
"/actuator/**"
)
.hasAnyAuthority(
AUTHORITY_ADMIN
)
项目部署(Deprecated)
本地代码传到云服务器→ 云服务器打包→ 云服务器部署
云服务器内存暂时不够,先跳过。
项目总结
常见面试题(Deprecated)
等到面试在看。