Skip to content

BIP 1: Test suite supporting byzer notebook

AdmondGuo edited this page Mar 29, 2022 · 1 revision

CI License SonarCloud Coverage

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

  • 添加易用的测试套件

使用介绍

下面将详细介绍如何在本地使用测试套件。

前提条件

  1. 安装 Docker Desktop:从 Docker 官网 下载适配您操作系统的安装包,安装并使用。

  2. 安装JDK8和JDK11环境。修改默认的notebook配置 src/test/resource/notebook.properties

notebook.user.home=<Set  the user home>
notebook.database.home=<Set  the database home>
  1. 测试
  • 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权限才可以提交,否则将得到下面的错误: middle_img_v2_7580ba74-8924-430b-87da-c62a855e3ffg

  1. 本地效果演示

通过mvn命令执行install和测试,您将看到我们默认启动了一个mockserver容器: image-20220308170257865

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

image-20220309145145729

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

image-20220309145232790

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

image-20220309145355903

访问sonarcloud,查看代码覆盖率情况。

  1. Github效果演示

PR提交后触发覆盖率、sonarCloud、LGTM检查,sonarCloud会作为comment展示结果:

image

技术设计

使用了jacoco生成覆盖率,sonarCloud进行质量检查,mockServer+testcontainers模拟byzer引擎,h2内存数据库模拟mysql。

  1. 设置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>
    
  2. 引入 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>
  1. 设置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>
    
  2. 定义github workflow

详情参考 .github/workflows/build.yml

  1. 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

  1. 测试套件

测试套件集成了mockServer和mockServerClient,使用SpringBootTest测试工具,封装为通用的测试套件,包括了如下功能:

  • 设置notebook中使用的spring配置类和环境变量
  • 初始化testContainer中的mockServer容器
  • 启动spring容器
  • 执行单元测试

使用测试套件,需要继承 NotebookLauncherTestBase,基于它创建的容器跑单测。如果对于相同的HTTP mock,需要有不同的response,可以使用mockServer清理mock配置。

client.reset();

详情参考:NotebookLauncherTestBase

Clone this wiki locally