-
Notifications
You must be signed in to change notification settings - Fork 33
BIP 1: Test suite supporting byzer notebook
Status: ACCEPTED
Author: @hellozepp
Contributor: @hellozepp
Date: 2022.03.09
Pull Requests: byzer-notebook #94
Byzer-notebook 没有质量检查工具和代码覆盖率工具,存在诸多漏洞,需要建设一个完整的质量套件,方便我们观测和提示代码质量,快速添加单元测试。
- 修复现有代码缺陷,提升产品质量
- 添加一套易用的测试套件,方便RD快速提升
Code Coverage到50%
1)变更模块:byzer-notebook
2)变更内容:
-
集成Jacoco
-
github workflow 集成 sonarCloud
-
添加易用的测试套件
下面将详细介绍如何在本地使用测试套件。
前提条件:
-
安装 Docker Desktop:从 Docker 官网 下载适配您操作系统的安装包,安装并使用。
-
安装JDK8和JDK11环境。修改默认的notebook配置
src/test/resource/notebook.properties:
notebook.user.home=<Set the user home>
notebook.database.home=<Set the database home>
- 测试
-
IDE 中启动测试类 streamingpro-it/src/test/scala/tech/mlsql/it/ByzerScriptTestSuite
-
或者通过 maven 命令启动
export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home
alias jdk8='export JAVA_HOME=$JAVA_8_HOME'
export JAVA_11_HOME=`/usr/libexec/java_home -v 11`
alias jdk11="export JAVA_HOME=$JAVA_11_HOME"
jdk8
mvn clean install
jdk11
mvn -DskipTests verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=byzer-org_byzer-notebook -Dsonar.login=<OUR_SONAR_TOKEN>
JAVA_8_HOME需要替换为您自己的java8路径
OUR_SONAR_TOKEN为byzer组织的token,需要有用owner权限才可以提交,否则将得到下面的错误:
- 本地效果演示
通过mvn命令执行install和测试,您将看到我们默认启动了一个mockserver容器:

测试运行成功,容器会自动销毁。整个流程从启动容器到测试和销毁用时 1-3 分钟。

我们可以在target目录看到生成的jacoco测试覆盖率报告:

访问index.html,可以在本地查看覆盖率详情:

访问sonarcloud,查看代码覆盖率情况。
- Github效果演示
PR提交后触发覆盖率、sonarCloud、LGTM检查,sonarCloud会作为comment展示结果:

使用了jacoco生成覆盖率,sonarCloud进行质量检查,mockServer+testcontainers模拟byzer引擎,h2内存数据库模拟mysql。
-
设置maven参数:
<properties> <jacoco-maven-plugin.version>0.8.7</jacoco-maven-plugin.version> <scala.binary.version>2.11</scala.binary.version> <scalatest.version>3.0.8</scalatest.version> <sonar.organization>byzer-org</sonar.organization> <sonar.host.url>https://sonarcloud.io</sonar.host.url> </properties> -
引入 maven 依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.scalatest</groupId>
<artifactId>scalatest_${scala.binary.version}</artifactId>
<version>${scalatest.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mockserver</artifactId>
<version>1.16.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-client-java</artifactId>
<version>5.5.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.210</version>
<scope>test</scope>
</dependency>
-
设置plugin
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>${jacoco-maven-plugin.version}</version> <executions> <execution> <id>jacoco-initialize</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>jacoco-report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> <configuration> <outputDirectory>target/site/jacoco</outputDirectory> </configuration> </execution> </executions> </plugin> -
定义github workflow
详情参考 .github/workflows/build.yml
- liquibase + JPA + h2 模拟数据库
用于覆盖测试的spring配置位于 src/test/resource/notebook.properties,会将默认mysql替换为我们的模拟库h2,liquibase的表结构和表数据位于 src/test/resource/changelog中。
注意:liquibase生成的表结构和数据dump部分和h2语法不兼容,JPA生成的DAO CURD语句也存在不兼容的情况,测试套件中已经做了完整的适配。h2语法详情参考:https://www.h2database.com/html/commands.html
- 测试套件
测试套件集成了mockServer和mockServerClient,使用SpringBootTest测试工具,封装为通用的测试套件,包括了如下功能:
- 设置notebook中使用的spring配置类和环境变量
- 初始化testContainer中的mockServer容器
- 启动spring容器
- 执行单元测试
使用测试套件,需要继承 NotebookLauncherTestBase,基于它创建的容器跑单测。如果对于相同的HTTP mock,需要有不同的response,可以使用mockServer清理mock配置。
client.reset();
详情参考:NotebookLauncherTestBase
