单元测试
开发过程中测试是十分重要的,在我们的开发过程中,测试是贯穿整个项目的,但是实际上我们有些测试之间是存在相互依赖关系的,这样或许会在之后的测试中产生麻烦,最好的方法就是每个测试类都是项目依赖的,我们在每个类中初始化测试数据,然后再进行测试,对比结果,测试完成之后再将数据删去。
Spring Boot Test中集成了很多测试工具,常用的注解有@BeforeClass,@AfterClass,@Before,@After,其中@BeforeClass和@AfterClass会在测试类构造之前和消解之后执行,@Before和@After会在该测试各个方法之前和之后执行。
接下来给出一个demo。在@Before注解声明的before()方法中我们对测试数据进行初始化,然后在测试方法中使用,然后在@After注解的after()方法中删除该数据。在测试方法中我们可以使用断言来判断测试方法是否通过。Assert.assertEquals()第一个参数表示期望值,第二个参数表示实际值,第三个参数是可选的。
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class SpringBootTests {
@Autowired
private DiscussPostService discussPostService;
DiscussPost data;
@BeforeClass
public static void beforeClass() {
System.out.println("beforeClass");
}
@AfterClass
public static void AfterClass() {
System.out.println("AfterClass");
}
@Before
public void before(){
System.out.println("before");
// 初始化测试数据
data = new DiscussPost();
data.setUserId(111);
data.setTitle("Test Title");
data.setContent("test Content");
data.setCreateTime(new Date());
discussPostService.addDiscussPost(data);
}
@After
public void after(){
System.out.println("after");
// 删除测试数据
discussPostService.updateStatus(data.getId(),2);
}
@Test
public void test1(){
System.out.println("test1");
}
@Test
public void test2(){
System.out.println("test2");
}
@Test
public void testFindById(){
DiscussPost post = discussPostService.findDiscussPostByid(data.getId());
Assert.assertNotNull(post);
Assert.assertEquals(data.getTitle(), post.getTitle());
Assert.assertEquals(data.getContent(), post.getContent());
}
@Test
public void testUpdateScore(){
int row = discussPostService.updateScore(data.getId(),2000.00);
Assert.assertEquals(1,row);
DiscussPost post = discussPostService.findDiscussPostByid(data.getId());
Assert.assertEquals(2000.00,post.getScore(),2);
}
}
如果不通过会给出错误提示
项目监控
项目的监控我们需要用到spring boot actuator来帮助我们监控项目,其核心是EndPoints,即监控程序应用入口,可以通过http或者jmx来访问得到。其默认开发的端口有很多,我们可以进行配置,下面的配置表示引入全部的端口,然后排除/info和/caches,当然我们可以自定义配置
# actuator
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=info,caches
引入自定义端口
我们可以通过@EndPoint注解引入自定义端口,比如我们实现一个连接数据库的自定义端口,我们在@EndPoint注解中声明id来表示访问路径,然后在相应的方法使用@ReadOperation来表示访问的方法是GET(@WriteOperation表示POST)
@Component
@Endpoint(id = "database")
public class DatabaseEndPoint {
private static final Logger logger = LoggerFactory.getLogger(DatabaseEndPoint.class);
@Autowired
private DataSource dataSource;
@ReadOperation
public String checkConnection(){
try(
Connection conn = dataSource.getConnection();
){
return CommunityUtil.getJSONString(200,"获取连接成功");
} catch (SQLException e){
logger.error("获取连接失败:" + e.getMessage());
return CommunityUtil.getJSONString(400,"获取连接失败!");
}
}
}
设置权限
对于项目监控的端点路径我们必须设置权限,必须是管理员才能访问,因此我们需要对权限进行配置。
.antMatchers(
"/discuss/delete",
"/data/**",
"/actuator/**"
)
.hasAnyAuthority(
AUTHORITY_ADMIN
)