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

相关推荐
JGDT_9 小时前
社区跃迁:从“模型开源”到“生态共创”
开源
考虑考虑10 小时前
arthas使用
java·运维·后端
lswzw10 小时前
我开源了 ssh-mcp:让支持 MCP 的 AI 客户端通过 SSH 查服务器、查数据库、读文件和部署
人工智能·开源·ssh
李昊哲小课10 小时前
Spring Boot 4 旅游主题实战教程 阶段三:数据持久化
spring boot·后端·mybatis·旅游
AI 编程助手GPT10 小时前
Bun 1.4 正式发布:从 Zig 改写为 Rust,内置浏览器、图片处理和并行测试
开发语言·人工智能·后端·ai·chatgpt
IT_陈寒10 小时前
Redis大KEY删除慢到手抖,这几个方法让我少熬一夜
前端·人工智能·后端
步行cgn11 小时前
传统 SSM 与 Spring Boot 开发对比:从配置地狱到约定优于配置
java·spring boot·后端
极小狐11 小时前
从 GitLab Flow 到 Pipeline:分支策略 + CI/CD + 运维一文打通
ci/cd·gitlab·devops·极狐gitlab
redfred11 小时前
DBeaver 使用教程:开源免费数据库管理工具 100+ 数据库连接 SQL编辑器 ER图 AI生成SQL 全平台
数据库·sql·开源