介绍
集成测试对于确保Go应用程序与数据库等外部依赖项的无缝协作至关重要。在本文中,我们将探讨如何使用GitHub Actions为Go应用程序设置和运行集成测试。我们将在CI(持续集成)管道中配置PostgreSQL数据库,简化测试流程,并确保每次代码推送后代码库的可靠性和生产就绪状态。让我们开始吧!
GitHub Actions
GitHub Actions是一个持续集成和持续交付(CI/CD)平台,允许您自动化构建、测试和部署管道。GitHub Actions可以在您的代码库中发生其他事件时运行工作流。
GitHub工作流
工作流是一个可配置的自动化过程,可以运行一个或多个作业。工作流通过存储在代码库中的YAML文件定义,并在代码库中的事件触发时运行。工作流定义在.github/workflows
目录中。
事件:是触发工作流运行的代码库中的特定活动。在我们的例子中,这将是对分支的推送。 作业:是工作流中在同一运行器上执行的一组步骤。 运行器:是触发时运行工作流的服务器。每个运行器一次只能运行一个作业。
工作流YAML
第一步是创建.github/workflows
文件夹,其中将放置我们的YAML文件。接下来创建YAML文件,在本例中我们将其命名为ci-test.yml
。
name: ci-test
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: Password123
POSTGRES_DB: crud_db
jobs:
build:
name: tests
runs-on: ubuntu-latest
services:
postgres:
image: postgres
env:
POSTGRES_USER: ${{ env.POSTGRES_USER }}
POSTGRES_PASSWORD: ${{ env.POSTGRES_PASSWORD }}
POSTGRES_DB: ${{ env.POSTGRES_DB }}
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: "1.22"
- name: Install dbmate for golang migrations
run: |
sudo curl -fsSL -o /usr/local/bin/dbmate https://github.com/amacneil/dbmate/releases/latest/download/dbmate-linux-amd64
sudo chmod +x /usr/local/bin/dbmate
which dbmate
- name: Construct DB URL
id: construct_url
run: echo "DB_URL=postgres://${{ env.POSTGRES_USER }}:${{ env.POSTGRES_PASSWORD }}@localhost:5432/${{ env.POSTGRES_DB }}?sslmode=disable" >> $GITHUB_ENV
- run: env
- name: Make Migrations
run: make migrations URL=${{ env.DB_URL }}
- name: Seed test DB
run: go run db/seed.go
- name: Test
run: make test
YAML描述
工作流名称
第一部分是为该动作命名,在本例中为ci-test
。
工作流触发器
第二部分描述了触发器,即触发动作的事件。在此文件中,我们有两个事件会触发作业的运行:推送和针对主分支的拉取请求。这确保了每次计划用于生产的代码更改在合并前都经过测试,从而维护项目的完整性。
环境变量
GitHub工作流支持全局和作业特定的环境变量。这些变量描述了我们将在YAML文件中使用的PostgreSQL凭据。
作业
jobs:
build:
name: tests
runs-on: ubuntu-latest
在这里,我们为将执行核心任务的作业分配了一个名称,即构建和测试我们的代码。运行器描述了工作流将在何处运行,这将是一个Ubuntu虚拟机。
服务
GitHub Actions工作流允许您定义服务。在本例中,我们需要一个PostgreSQL数据库来运行测试。
使用官方的PostgreSQL Docker镜像创建一个PostgreSQL容器。容器使用我们之前声明的环境变量进行配置。
工作流步骤
检出代码库
- uses: actions/checkout@v4
这行代码获取代码库的最新版本,提供对所有源文件的访问。
设置Go环境
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: "1.22"安装dbmate
- name: Install dbmate for golang migrations
run: |
sudo curl -fsSL -o /usr/local/bin/dbmate https://github.com/amacneil/dbmate/releases/latest/download/dbmate-linux-amd64
sudo chmod +x /usr/local/bin/dbmate
which dbmate构建数据库URL
- name: Construct DB URL
id: construct_url
run: echo "DB_URL=postgres://${{ env.POSTGRES_USER }}:${{ env.POSTGRES_PASSWORD }}@localhost:5432/${{ env.POSTGRES_DB }}?sslmode=disable" >> $GITHUB_ENV运行数据库迁移
- name: Make Migrations
run: make migrations URL=${{ env.DB_URL }}填充测试数据库
- name: Seed test DB
run: go run db/seed.go执行测试
- name: Test
run: make test
此工作流将在每次我们对主分支进行拉取请求或推送代码时运行。
采用GitHub Actions的一些优势
自动化测试:在每次代码更改时一致地运行测试。 数据库集成:提供真实的PostgreSQL环境进行测试,模拟生产条件。 可重现的环境:GitHub Actions使用容器化服务和预定义步骤,以确保所有运行结果的一致性。 快速反馈循环:它们使开发人员能够在出现问题时快速获得反馈,从而加快问题解决。 简化的协作:确保所有贡献者的更改在合并前经过验证,维护代码质量和项目稳定性。
结论
通过利用GitHub Actions,此工作流简化了测试和数据库设置,确保了稳健和可靠的软件开发。访问GitHub代码库以查看使用上述动作进行测试的代码。