Gradle在默认情况下只提供src/test/java目录用于测试,对于以上3种类型的测试,我们需要将它们分开以便于管理(也是职责分离的体现)。为此,可以通过Gradle提供的SourceSets对测试代码进行分类:
- sourceSets {
- componentTest {
- compileClasspath += sourceSets.main.output + sourceSets.test.output
- runtimeClasspath += sourceSets.main.output + sourceSets.test.output
- }
-
- apiTest {
- compileClasspath += sourceSets.main.output + sourceSets.test.output
- runtimeClasspath += sourceSets.main.output + sourceSets.test.output
- }
- }
到此,3种类型的测试可以分别编写在以下目录:
- 单元测试:src/test/java
- 组件测试:src/componentTest/java
- API测试:src/apiTest/java
需要注意的是,这里的API测试更多强调的是对业务功能的测试,有些项目中可能还会存在契约测试和安全测试等,虽然从技术上讲都是对API的访问,但是这些测试都是单独的关注点,因此建议分开对待。
值得一提的是,由于组件测试和API测试需要启动程序,也即需要准备好本地数据库,我们采用了Gradle的docker-compose插件(或者jib插件),该插件会在运行测试之前自动运行Docker容器(比如MySQL):
- apply plugin: 'docker-compose'
-
-
- dockerCompose {
- useComposeFiles = ['docker/mysql/docker-compose.yml']
- }
-
- bootRun.dependsOn composeUp
- componentTest.dependsOn composeUp
- apiTest.dependsOn composeUp
更多的测试分类配置细节,比如JaCoCo测试覆盖率配置等,请参考本文的示例项目代码。对Gradle不熟悉的读者可以参考笔者的Gradle学习系列文章。
日志处理
在日志处理中,除了完成基本配置外,还有2个需要考虑的点:
1.在日志中加入请求标识,便于链路追踪。在处理一个请求的过程中有时会输出多条日志,如果每条日志都共享统一的请求ID,那么在日志追踪时会更加方便。此时,可以使用Logback原生提供的MDC(Mapped Diagnostic Context)功能,创建一个RequestIdMdcFilter:
- protected void doFilterInternal(HttpServletRequest request,
- HttpServletResponse response,
- FilterChain filterChain)
- throws ServletException, IOException {
- //request id in header may come from Gateway, eg. Nginx
- String headerRequestId = request.getHeader(HEADER_X_REQUEST_ID);
- MDC.put(REQUEST_ID, isNullOrEmpty(headerRequestId) ? newUuid() : headerRequestId);
- try {
- filterChain.doFilter(request, response);
- } finally {
- clearMdc();
- }
- }
2.集中式日志管理,在多节点部署的场景下,各个节点的日志是分散的,为此可以引入诸如ELK之类的工具将日志统一输出到ElasticSearch中。本文的示例项目使用了RedisAppender将日志输出到Logstash:
- <appender name="REDIS" class="com.cwbase.logback.RedisAppender">
- <tags>ecommerce-order-backend-${ACTIVE_PROFILE}</tags>
- <host>elk.yourdomain.com</host>
- <port>6379</port>
- <password>whatever</password>
- <key>ecommerce-ordder-log</key>
- <mdc>true</mdc>
- <type>redis</type>
- </appender>
当然,统一日志的方案还有很多,比如Splunk和Graylog等。
异常处理
(编辑:ASP站长网)
|