「Container 的技術有利於簡化測試。」,ㄏㄏ。

前言

系列文

文章適用對象

  • 使用 Laravel 開發的工程師,希望整合自動化測試

實作

需求

步驟

統一將環境放在 .docker/testing 資料夾下(如果沒有這個資料夾請自行建立)

Step 1. 調整 Laravel 的測試設定

config/database.php 中的 connections 加入 In Memory SQLite

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php
return [
    // Ignore ...
    'connections' => [
        // Ignore ...
        'sqlite_testing' => [
            'driver' => 'sqlite',
            'database' => ':memory:',
            'prefix' => '',
            'foreign_key_constraints' => true,
        ],
        // Ignore ...
    ],
    // Ignore ...
]

Step 2. 建立 Testing 的 Dockerfile

建立 .docker/testing/Dockerfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
FROM {project_name} AS code

FROM php:alpine

ENV APP_KEY="Input Your Application Key, Generated By Laravel"

WORKDIR /www

COPY --from=code /build /www

CMD ["php", "vendor/bin/phpunit"]

建立 Dockerfile 之後,使用 docker build -t {project_name}/testing . 建立 Testing Docker Image。

整合

GitLab CI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
stages:
  - build-code
  - build
  - testing

build-main-image:
  image: docker

  services:
    - docker:dind

  stage: build-code

  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

  script:
    - docker build -t registry.gitlab.com/group_name/repo_name .
    - docker push registry.gitlab.com/group_name/repo_name

build-testing-image:
    image: docker

    services:
        - docker:dind
    
    stage: build

    before_script:
        - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWROD $CI_REGISTRY
    
    script:
        - docker build -t registry.gitlab.com/group_name/repo_name .
        - docker push registry.gitlab.com/group_name/repo_name

fast-test:
    image: registry.gitlab.com/group_name/repo_name

    stage: test

    environments:
        - DB_CONNECTION=sqlite_testing

    script:
        - cd /www
        - php vendor/bin/phpunit

此處僅定義了由 In Memory SQLite 執行測試的 fast-test

實務上應該還需要一個 complete-test,使用一樣的 test image,然後啟動與正式環境差不多的服務(如資料庫),這樣測試時雖然會慢不少,但是有助於進行比較完整的測試。

※ pdo_sqlite 是 php:alpine 中內建的 extension,所以不需要另外安裝 ※ 最終環境變數會根據 CI 時期的 environments 進行修改,所以 Dockerfile 中不宜將 config cache 起來