github如何基于workflow实现自动集成测试提升代码质量

背景

之前研究过spring boot如何不依赖外部redis、mysql等中间件也不mock实现集成测试

这种做法主要是在本地手动进行集成测试,我们最终的目的肯定是希望能够实现自动化集成测试

所以今天我们就来看看如何通过github workflow+docker实现自动集成测试

添加集成测试相关maven依赖

添加maven依赖

首先我们需要添加集成测试相关的maven依赖

xml 复制代码
        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>1.17.6</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>testcontainers</artifactId>
            <version>1.20.4</version>
            <scope>test</scope>
        </dependency>

添加maven插件依赖

其次添加集成测试相关的maven插件依赖

xml 复制代码
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <includes>
                        <include>**/*Test.java</include> <!-- 包含所有以 Test 结尾的集成测试类 -->
                    </includes>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classesDirectory>${project.build.outputDirectory}</classesDirectory>
                </configuration>
            </plugin>
            
        </plugins>
    </build>

编写github workflow

依赖添加完成后我们就需要编写github workflow了

shell 复制代码
name: Integration Testing with Testcontainers
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  integration-testing:
    name: Integration Testing
    runs-on: ubuntu-latest
    services:
      docker:
        image: docker:dind
        options: --privileged
    steps:
      # 检出代码
      - name: Check out the repo
        uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'
          distribution: 'adopt'

      # 缓存 Maven 依赖
      - name: Cache Maven Dependencies
        uses: actions/cache@v2
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      # 运行集成测试
      - name: Run Integration Tests
        run: mvn verify -B -Dmaven.test.skip=false -Dgpg.skip=true

这里相关的源码可以参考多级缓存框架fluxcache-integration-test.yml

注意这个文件必须放在.github/workflows目录下

编写测试代码

java 复制代码
@SpringBootTest(classes = FluxCacheApplication.class)
@Slf4j
@Testcontainers
public class TestControllerTest {

    @Container
    public static GenericContainer<?> redis = new GenericContainer<>(DockerImageName.parse("redis:6.2.6"))
        .withExposedPorts(6379);

    @DynamicPropertySource
    static void redisProperties(DynamicPropertyRegistry registry) {
        registry.add("redis.host", redis::getHost);
        registry.add("redis.port", () -> redis.getMappedPort(6379).toString());
        registry.add("redis.password", () -> "");
    }

    private final static Long SLEEP_TIME = 3L;

    @Autowired
    private FluxCacheProperties cacheProperties;

    @Autowired
    private TestController testController;

    @Autowired
    private DefaultFluxCacheManager cacheManager;

    @Test
    public void testFirstCacheByCaffeine() {
        List<StudentVO> vos = testController.firstCacheByCaffeine("aaa");
        StudentVO vo = vos.get(0);
        int age = vo.getAge();
        List<StudentVO> vos1 = testController.firstCacheByCaffeine("aaa");
        StudentVO vo1 = vos1.get(0);
        int age1 = vo1.getAge();
        assertEquals(age, age1);
        List<StudentVO> vos2 = testController.firstCacheByCaffeine("bb");
        StudentVO vo2 = vos2.get(0);
        assertNotEquals(age, vo2.getAge());
    }
}

测试相关的代码解释我们可以参考之前的spring boot如何不依赖外部redis、mysql等中间件也不mock实现集成测试

实际效果

我们在main分支上切一个新分支出来,修改代码,再发起Pull requests,就可以看到github workflow自动执行了集成测试

我们看看集成测试的结果

可以看到集成测试通过了

这样只要我们的测试用例写的足够全面,我们就可以保证我们的代码质量,进行重大重构,只要测试用例通过,我们就可以放心的发布

总结

通过github workflow+docker实现自动集成测试,可以保证我们的代码质量,让我们的代码更加健壮

我们也无需手动执行,不用担心有人没有执行测试,导致改动的代码有bug

通过github workflow我们实现自动化集成测试非常简单,任何改动有了ci的检查不会像以前没有底气。

至少能保证基本的功能是正常的,不会出现非常明显的bug

相关推荐
程序员老赵3 分钟前
Docker 部署 Wiki.js:轻松搭建私有化维基知识库
docker·容器·开源
upala3 分钟前
【仓颉语言入门 · 第二篇 第 6 课】
后端
罗丹丹Luna4 分钟前
移动端显示“已提交”以后:SAP 与低代码集成该怎样暴露真实状态
后端·架构
码事漫谈8 分钟前
因为太想讨好你,所以AI会骗你
后端
吴凡wudianmei8 分钟前
每调一次模型都花钱?如何用工程手段把调用压到最少?
前端·后端·架构
花间相见10 分钟前
【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表
数据库·后端
花间相见12 分钟前
【计算基础|MySQL02】【上手】SQL 增删改查
数据库·后端
姜鱼问生28 分钟前
密码明明一样,为什么 GPG 说“错的“?
后端·算法·架构
.Bryce.32 分钟前
在智能体中使用A2A工具:让大模型自己决定“该找谁帮忙“
android·java·服务器·redis·后端·agent·a2a
xiaoqiMikko35 分钟前
fastjson 1.2.84 的补丁关掉了一个缓存:addAccept 包前缀白名单下,反序列化慢了 13~28 倍
java·后端·性能优化