仿牛客网社区开发——第8章 项目发布与总结
单元测试
一定要保证测试方法的独立性!不能依赖别的测试方法,不能因为之前的数据没了而要重写测试方法等等。这个测试方法不是一次性的,将来功能发生变化还需要去执行,验证这个变化有没有产生什么负面影响。
- 对于 @BeforeClass 这个注解所修饰的方法是在类初始化之前执行的,只执行一次,跟类有关的,所以必须是静态的(@AfterClass 同理)
- 对于 @Before 和 @After,每调一个测试方法前后就会被调用,不用静态
- 用断言来判断结果是否正确
- 这里的 2 个测试方法的 data 就都是独立的了,调用测试方法前创建数据,调用完后又删除它。
@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");
}
@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");
DiscussPost post = discussPostService.findDiscussPostById(data.getId());
Assert.assertNotNull(post);
Assert.assertEquals(data.getTitle(), post.getTitle());
Assert.assertEquals(data.getContent(), post.getContent());
}
@Test
public void test2() {
// System.out.println("test2");
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);
}
}
点击这里运行这个测试类所有的测试方法
测试完成,全部绿√通过
项目监控
把需要暴露的端点暴露,一方面提高性能,另一方面提高安全性。
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置暴露的端点
# actuator
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=info,caches
访问
http://localhost:8080/community/actuator/health 可以访问
http://localhost:8080/community/actuator/info 无法访问
(此外还有 loggers,beans,……)
自定义端点
以获取数据库连接为例:
- 类加上 @Endpoint 注解,注意要声明 id
- 方法上加上 @ReadOperation(get 请求访问),此外还有 @WriteOperation
- 返回 JSON 字符串
@Component
@Endpoint(id = "database")
public class DatabaseEndpoint {
private static final Logger logger = LoggerFactory.getLogger(DatabaseEndpoint.class);
@Qualifier("dataSource")
@Autowired
private DataSource dataSource;
@ReadOperation
public String checkOperation() {
try (
Connection conn = dataSource.getConnection();
) {
return CommunityUtil.getJSONString(0, "获取连接成功!");
} catch (SQLException e) {
logger.error("获取连接失败:" + e.getMessage());
return CommunityUtil.getJSONString(1, "获取连接失败!");
}
}
}
进行权限配置
配置只有管理员可以访问
.antMatchers(
"/discuss/delete",
"/data/**",
"/actuator/**"
)
.hasAnyAuthority(
AUTHORITY_ADMIN
)