本文目录导读:

在CI/CD流水线中运行Laravel测试,通常需要以下几个关键步骤,这里以最流行的 GitLab CI 和 GitHub Actions 为例,提供完整的配置方案。
核心准备
# 基础依赖 - php 8.1+ - composer - node & npm (如果前端有测试) - mysql / postgresql / sqlite (测试数据库)
GitLab CI 配置
# .gitlab-ci.yml
stages:
- test
variables:
MYSQL_DATABASE: laravel_test
MYSQL_ROOT_PASSWORD: secret
DB_HOST: mysql
DB_DATABASE: laravel_test
DB_USERNAME: root
DB_PASSWORD: secret
cache:
paths:
- vendor/
- node_modules/
laravel-tests:
stage: test
image: edbizarro/gitlab-ci-pipeline-php:8.1
services:
- mysql:8.0
before_script:
# 安装 PHP 扩展
- docker-php-ext-install pdo_mysql
# 复制环境配置
- cp .env.example .env
# 生成应用密钥
- php artisan key:generate
# 安装依赖
- composer install --no-interaction --prefer-dist
# 数据库迁移
- php artisan migrate --force
script:
# 运行单元测试
- php vendor/bin/phpunit
# 或运行特定测试套件
- php artisan test --testsuite=Feature
# 检查代码风格
- ./vendor/bin/phpcs --standard=PSR2 app/ tests/
after_script:
- php artisan migrate:reset --force
artifacts:
paths:
- storage/logs/
when: on_failure
expire_in: 1 week
GitHub Actions 配置
# .github/workflows/tests.yml
name: Laravel Tests
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
laravel-tests:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: laravel_test
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
extensions: mbstring, dom, fileinfo, mysql
coverage: xdebug
- name: Copy .env
run: |
cp .env.example .env
php artisan key:generate
- name: Install Dependencies
run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name: Generate key
run: php artisan key:generate
- name: Directory Permissions
run: chmod -R 777 storage bootstrap/cache
- name: Run Migrations
run: php artisan migrate --force
- name: Execute tests
run: |
php vendor/bin/phpunit
# 或使用 Laravel 的测试工具
# php artisan test
env:
DB_CONNECTION: mysql
DB_DATABASE: laravel_test
DB_USERNAME: root
DB_PASSWORD: secret
DB_HOST: 127.0.0.1
- name: Upload test results
if: always()
uses: actions/upload-artifact@v3
with:
name: test-results
path: |
storage/logs/
tests/_output/
Docker 方式(更稳妥)
# Dockerfile.test
FROM php:8.1-cli
# 安装系统依赖
RUN apt-get update && apt-get install -y \
git \
unzip \
libpq-dev \
libzip-dev \
&& docker-php-ext-install pdo_mysql zip
# 安装 Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /app
COPY . .
# 安装项目依赖
RUN composer install --no-interaction --prefer-dist
# 运行测试
CMD ["php", "vendor/bin/phpunit"]
# .gitlab-ci.yml 中使用 Docker
test-docker:
stage: test
image: docker:latest
services:
- docker:dind
- mysql:8.0
script:
- docker build -t laravel-test -f Dockerfile.test .
- docker run --rm \
--env DB_HOST=mysql \
--env DB_DATABASE=laravel_test \
--env DB_USERNAME=root \
--env DB_PASSWORD=secret \
laravel-test
优化建议
1 并行测试
# 拆分测试任务
parallel:
matrix:
- TEST_TYPE: [Unit, Feature]
PHP_VERSION: ['8.0', '8.1']
2 仅测试变更
# 只运行与变更文件相关的测试
composer test -- --filter="$(git diff --name-only HEAD~1 | xargs -I {} basename {} .php)"
3 使用 SQLite 加速
# 在测试环境中使用 SQLite env: DB_CONNECTION: sqlite DB_DATABASE: :memory:
常见问题解决
1 数据库连接失败
# 检查 MySQL 服务是否就绪 until mysqladmin ping -h "$DB_HOST" --silent; do echo 'waiting for mysql...' sleep 2 done
2 内存不足
# 增加 PHP 内存限制 - echo "memory_limit=512M" > /usr/local/etc/php/conf.d/memory.ini
3 测试超时
# 设置超时时间 timeout: 30m
完整示例(Jenkins Pipeline)
// Jenkinsfile
pipeline {
agent any
tools {
php 'php8.1'
composer 'composer2'
}
stages {
stage('Prepare') {
steps {
sh 'cp .env.example .env'
sh 'php artisan key:generate'
sh 'composer install --no-interaction --prefer-dist'
}
}
stage('Test') {
parallel {
stage('Unit Tests') {
steps {
sh 'php vendor/bin/phpunit --testsuite=Unit'
}
}
stage('Feature Tests') {
environment {
DB_CONNECTION = 'sqlite'
DB_DATABASE = ':memory:'
}
steps {
sh 'php artisan migrate --force'
sh 'php vendor/bin/phpunit --testsuite=Feature'
}
}
}
}
stage('Code Quality') {
steps {
sh './vendor/bin/phpcs --standard=PSR12 app/ tests/'
sh './vendor/bin/phpstan analyse app/'
}
}
}
post {
always {
archiveArtifacts artifacts: 'storage/logs/*.log', onlyIfSuccessful: false
junit 'storage/logs/*.xml'
}
}
}
- 环境隔离:使用 Docker 或 CI 提供的服务容器
- 数据库策略:推荐 SQLite 内存数据库(最快),或 MySQL 服务
- 缓存依赖:缓存 vendor/ 和 node_modules/ 加速构建
- 并行执行:拆分 Unit 和 Feature 测试并行运行
- 失败处理:保存日志和测试报告便于调试
- 安全性:不要在配置中硬编码密码,使用 CI 变量
选择合适的 CI/CD 平台,根据项目规模和团队需求调整配置,建议从简单的配置开始,逐步增加并行测试、代码质量检查等功能。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播