Loading

仿牛客网社区开发——第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
  • 方法上加上 @ReadOperationget 请求访问),此外还有 @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
)
posted @ 2022-08-02 11:17  幻梦翱翔  阅读(366)  评论(0编辑  收藏  举报