# Testing PHP projects

> 原文：[https://docs.gitlab.com/ee/ci/examples/php.html](https://docs.gitlab.com/ee/ci/examples/php.html)

*   [Test PHP projects using the Docker executor](#test-php-projects-using-the-docker-executor)
    *   [Test against different PHP versions in Docker builds](#test-against-different-php-versions-in-docker-builds)
    *   [Custom PHP configuration in Docker builds](#custom-php-configuration-in-docker-builds)
*   [Test PHP projects using the Shell executor](#test-php-projects-using-the-shell-executor)
    *   [Test against different PHP versions in Shell builds](#test-against-different-php-versions-in-shell-builds)
    *   [Install custom extensions](#install-custom-extensions)
*   [Extend your tests](#extend-your-tests)
    *   [Using atoum](#using-atoum)
    *   [Using Composer](#using-composer)
*   [Access private packages or dependencies](#access-private-packages-or-dependencies)
*   [Use databases or other services](#use-databases-or-other-services)
*   [Testing things locally](#testing-things-locally)
*   [Example project](#example-project)

# Testing PHP projects[](#testing-php-projects "Permalink")

本指南涵盖了 PHP 项目的基本构建说明.

涵盖了两种测试方案：使用 Docker 执行程序和使用 Shell 执行程序.

## Test PHP projects using the Docker executor[](#test-php-projects-using-the-docker-executor "Permalink")

尽管可以在任何系统上测试 PHP 应用程序，但这都需要开发人员进行手动配置. 为了克服这个问题，我们将使用可在 Docker Hub 中找到的官方[PHP Docker 映像](https://hub.docker.com/_/php) .

这将使我们能够针对不同版本的 PHP 测试 PHP 项目. 但是，并非所有事情都是即插即用的，您仍然需要手动配置一些东西.

与每项工作一样，您需要创建一个描述构建环境的有效`.gitlab-ci.yml` .

首先，让我们指定将用于作业过程的 PHP 映像（您可以在 Runner 的术语中阅读有关[使用 Docker 映像的](../docker/using_docker_images.html#what-is-an-image)更多信息，以了解映像的含义）.

首先将图像添加到您的`.gitlab-ci.yml` ：

```
image: php:5.6 
```

官方图片很棒，但是缺少一些有用的测试工具. 我们需要首先准备构建环境. 解决此问题的一种方法是创建一个脚本，该脚本在完成实际测试之前会安装所有必备组件.

Let’s create a `ci/docker_install.sh` file in the root directory of our repository with the following content:

```
#!/bin/bash

# We need to install dependencies only for Docker
[[ ! -e /.dockerenv ]] && exit 0

set -xe

# Install git (the php image doesn't have it) which is required by composer
apt-get update -yqq
apt-get install git -yqq

# Install phpunit, the tool that we will use for testing
curl --location --output /usr/local/bin/phpunit https://phar.phpunit.de/phpunit.phar
chmod +x /usr/local/bin/phpunit

# Install mysql driver
# Here you can install any other extension that you need
docker-php-ext-install pdo_mysql 
```

您可能想知道`docker-php-ext-install`是什么. 简而言之，它是官方 PHP Docker 映像提供的脚本，可用于轻松安装扩展. 有关更多信息，请参阅[https://hub.docker.com/_/php 上](https://hub.docker.com/_/php)的文档.

现在，我们创建了包含构建环境的所有先决条件的脚本，让我们将其添加到`.gitlab-ci.yml` ：

```
...

before_script:
  - bash ci/docker_install.sh > /dev/null

... 
```

最后一步，使用`phpunit`运行实际测试：

```
...

test:app:
  script:
    - phpunit --configuration phpunit_myapp.xml

... 
```

最后，提交文件并将其推送到 GitLab，以查看构建成功（或失败）.

最终的`.gitlab-ci.yml`应该类似于以下内容：

```
# Select image from https://hub.docker.com/_/php
image: php:5.6

before_script:
# Install dependencies
  - bash ci/docker_install.sh > /dev/null

test:app:
  script:
    - phpunit --configuration phpunit_myapp.xml 
```

### Test against different PHP versions in Docker builds[](#test-against-different-php-versions-in-docker-builds "Permalink")

针对多个版本的 PHP 进行测试非常容易. 只需添加另一个具有不同 Docker 映像版本的作业，即可由跑步者完成其余工作：

```
before_script:
# Install dependencies
  - bash ci/docker_install.sh > /dev/null

# We test PHP5.6
test:5.6:
  image: php:5.6
  script:
    - phpunit --configuration phpunit_myapp.xml

# We test PHP7.0 (good luck with that)
test:7.0:
  image: php:7.0
  script:
    - phpunit --configuration phpunit_myapp.xml 
```

### Custom PHP configuration in Docker builds[](#custom-php-configuration-in-docker-builds "Permalink")

有时，您需要通过将`.ini`文件放入`/usr/local/etc/php/conf.d/`来自定义 PHP 环境. 为此，添加一个`before_script`动作：

```
before_script:
  - cp my_php.ini /usr/local/etc/php/conf.d/test.ini 
```

当然， `my_php.ini`必须存在于存储库的根目录中.

## Test PHP projects using the Shell executor[](#test-php-projects-using-the-shell-executor "Permalink")

Shell 执行程序在服务器上的终端会话中运行您的作业. 因此，为了测试您的项目，您首先需要确保已安装所有依赖项.

例如，在运行 Debian 8 的 VM 中，我们首先更新缓存，然后安装`phpunit`和`php5-mysql` ：

```
sudo apt-get update -y
sudo apt-get install -y phpunit php5-mysql 
```

接下来，将以下代码段添加到`.gitlab-ci.yml` ：

```
test:app:
  script:
    - phpunit --configuration phpunit_myapp.xml 
```

最后，推送到 GitLab 并开始测试！

### Test against different PHP versions in Shell builds[](#test-against-different-php-versions-in-shell-builds "Permalink")

[phpenv](https://github.com/phpenv/phpenv)项目使您可以轻松管理不同版本的 PHP，每个版本都有自己的配置. 当使用 Shell 执行程序测试 PHP 项目时，这特别有用.

您必须按照[上游安装指南](https://github.com/phpenv/phpenv#installation)在`gitlab-runner`用户下将其安装在构建计算机[上](https://github.com/phpenv/phpenv#installation) .

使用 phpenv 还可以通过以下方式轻松配置 PHP 环境：

```
phpenv config-add my_config.ini 
```

***重要说明：**似乎`phpenv/phpenv` [被放弃了](https://github.com/phpenv/phpenv/issues/57) . [madumlao / phpenv](https://github.com/madumlao/phpenv)上有一个分叉，试图使该项目[复活](https://github.com/madumlao/phpenv) . [CHH / phpenv](https://github.com/CHH/phpenv)似乎也是一个不错的选择. 选择任何提到的工具将与基本 phpenv 命令一起使用. 指导您选择正确的 phpenv 不在本教程的范围内.*

### Install custom extensions[](#install-custom-extensions "Permalink")

由于这是 PHP 环境的裸机安装，因此您可能需要一些构建机器上当前不存在的扩展.

要安装其他扩展，只需执行以下命令：

```
pecl install <extension> 
```

不建议将其添加到`.gitlab-ci.yml` . 您应该只执行一次此命令，仅用于设置构建环境.

## Extend your tests[](#extend-your-tests "Permalink")

### Using atoum[](#using-atoum "Permalink")

除了 PHPUnit，您可以使用任何其他工具来运行单元测试. 例如，您可以使用[atoum](https://github.com/atoum/atoum) ：

```
before_script:
  - wget http://downloads.atoum.org/nightly/mageekguy.atoum.phar

test:atoum:
  script:
    - php mageekguy.atoum.phar 
```

### Using Composer[](#using-composer "Permalink")

大多数 PHP 项目使用 Composer 来管理其 PHP 软件包. 为了在运行测试之前执行 Composer，只需在`.gitlab-ci.yml`添加以下`.gitlab-ci.yml` ：

```
...

# Composer stores all downloaded packages in the vendor/ directory.
# Do not use the following if the vendor/ directory is committed to
# your git repository.
cache:
  paths:
    - vendor/

before_script:
# Install composer dependencies
  - wget https://composer.github.io/installer.sig -O - -q | tr -d '\n' > installer.sig
  - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
  - php -r "if (hash_file('SHA384', 'composer-setup.php') === file_get_contents('installer.sig')) { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
  - php composer-setup.php
  - php -r "unlink('composer-setup.php'); unlink('installer.sig');"
  - php composer.phar install

... 
```

## Access private packages or dependencies[](#access-private-packages-or-dependencies "Permalink")

如果您的测试套件需要访问私有存储库，则需要配置[SSH 密钥](../ssh_keys/README.html)才能克隆它.

## Use databases or other services[](#use-databases-or-other-services "Permalink")

大多数时候，您将需要一个正在运行的数据库才能运行测试. 如果您使用的是 Docker 执行器，则可以利用 Docker 链接到其他容器的功能. 使用 GitLab Runner，可以通过定义`service`来实现.

[CI 服务](../services/README.html)文档中涵盖了此功能.

## Testing things locally[](#testing-things-locally "Permalink")

使用 GitLab Runner 1.0，您还可以在本地测试所有更改. 从您的终端执行：

```
# Check using docker executor
gitlab-runner exec docker test:app

# Check using shell executor
gitlab-runner exec shell test:app 
```

## Example project[](#example-project "Permalink")

为了方便起见，我们建立了一个[示例 PHP 项目](https://gitlab.com/gitlab-examples/php) ，该[项目](https://gitlab.com/gitlab-examples/php)使用我们的公共[共享](../runners/README.html)运行器在[GitLab.com](https://gitlab.com)上运行.

想要破解吗？ 只需对其进行分叉，提交并推送您的更改. 稍后，公共跑步者将选择更改并开始工作.