Laravel项目中运用Travis持续集成和自动化测试

背景

在很多Github开源项目页面的readme中,经常看到类似的图标
Laravel项目中运用Travis持续集成和自动化测试_第1张图片

这个 bulid passing,其实是 Travis 的构建状态图标。Travis 是一个结合 Github 使用的持续集成(CI:continuous integration)工具。持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。使用 Travis 后,每当对 Github 进行 push 操作时,都会在 Travis 提供的环境上执行自动化的构建。

下面就介绍下如何在我的 PHP Laravel 项目上通过 Travis 执行自动化测试的。
先上代码:
https://github.com/zhongchenyu/jokes-laravel

1. 编写测试代码

比如我们想测试一下用户注册功能,首先在Laravel项目路径下运行下面命令生成测试用例文件:

php artisan make:test RegisterTest

这样在 tests/Feature路径下就会生成一个 RegisterTest.php 文件。如果是单元测试,可以在命令后面加 --unit,则会在 tests/Unit 路径下生成单元测试文件。

接下来编辑测试文件:

class RegisterTest extends TestCase {
  use DatabaseTransactions;

  /**
   * A basic test example.
   *
   * @return void
   */
  public function testRegister()
  {
    $response = $this->json('POST', '/api/register', [
      'name'     => 'TestUser123',
      'email'    => '[email protected]',
      'password' => '123456'
    ]);


    $response->assertStatus(200)
    ->assertJsonStructure(['token']);
  }

  public function testRegisterInvalidEmail()
  {
    $response = $this->json('POST', '/api/register', [
      'name'     => 'TestUser1234',
      'email'    => 'TestUser123TestUser.com',
      'password' => '123456'
    ]);


    $response->assertStatus(500)
      ->assertJson(['message' => 'The given data failed to pass validation.']);
  }

  public function testRegisterRepeatEmail()
  {
    User::create([
      'name' => 'TestUser12345',
      'email' => '[email protected]',
      'password' => bcrypt('123456'),
    ]);

    $response = $this->json('POST', '/api/register', [
      'name'     => 'TestUser12345',
      'email'    => '[email protected]',
      'password' => '123456'
    ]);


    $response->assertStatus(500)
      ->assertJson(['message' => 'The given data failed to pass validation.']);
  }
}

开头加上use DatabaseTransactions;,测试用例使用数据库事务,这样在用例运行完后,对数据库的修改都会被恢复。

后面三个函数对应3个测试用例,分别测试了注册成功,e-mail地址不合法,和e-mail地址跟已存在的用户重复的情况。代码都很好理解,因为 api 功能返回的是 json 格式的数据,这里用了 Laravel 框架的 json 断言 assertJsonStructure 和 assertJson,前者代表 Response body 的 json 数据包含后面的格式,但不关注字段的值,后者则要求 json 数据中包含了对应的字段和值。

用例写好后,在项目路径下运行命令 phpunit,测试通过:

vagrant@homestead:~/Code/jokes$ phpunit
PHPUnit 5.7.19 by Sebastian Bergmann and contributors.

.....                                                               5 / 5 (100%)

Time: 5.23 seconds, Memory: 14.00MB

OK (5 tests, 8 assertions)

参考 Laravel官方文档-测试

2. 配置Travis

Travis是一个持续集成工具,对于Github 上的开源项目可以免费使用。首先打开网站 https://travis-ci.org/ ,使用 Github 账号授权登录,之后 Travis 会同步 Github 上的开源项目,选择你要进行持续集成的项目即可,过程比较简单,照着Travis官方文档操作就行,关键的地方就是要编辑好Travis的配置文件,下面就介绍一下基于PHP Laravel 框架的项目配置时需要注意的地方。

1 准备环境配置文件

Laravel项目很多配置都放在 .env 文件里,这个文件一般在不同的运行环境上会单独去配置,也不会添加到 Git 中。因此我们首先准备一个在 Travis 环境上用的文件,先直接将框架自带的初始文件 .env.example 拷贝一份:

cp .env.example .env.travis

然后在修改,主要改了两个地方,一是数据库配置:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=jokes
DB_USERNAME=root
DB_PASSWORD=

Travis环境默认支持 MySql,账号有 root 和 travis,密码为空,在 .env.travis 文件中做相应修改,账户选择了权限较高的 root 。

第二个是增加 Dingo/Api 的相关配置,为了测试用例和我们实际线上环境一直,这里主要加了前缀等信息:

# DINGO/API
API_STANDARDS_TREE=vnd
API_SUBTYPE=jokes
API_PREFIX=api
API_VERSION=v1
API_NAME=jokes
API_CONDITIONAL_REQUEST=false
API_STRICT=false
API_DEBUG=true
API_DEFAULT_FORMAT=json

2 编辑 Travis 配置文件

在项目根路径下添加 .travis.yml 文件,添加如下内容:

language: php
php:
  - 7.1
service:
  - mysql
before_script:
  - composer install
  - composer dump-autoload
  - cp .env.travis .env
  - php artisan jwt:generate
  - php artisan key:generate
  - php artisan vendor:publish
  - mysql -e 'CREATE DATABASE IF NOT EXISTS jokes ;'
  - php artisan migrate
script: phpunit
  • 指定使用的语言为 PHP,并指定了要运行的版本。
  • 指明需要启动 MySql 服务。
  • before_script,表明在执行测试之前需要做的工作,这里我们做了Laravel 项目运行前基本的准备工作:
    • 通过 composer 安装依赖
    • 将之前准备的 Travis 环境专用的 .env 文件拷贝
    • 生成密钥
    • 发布 vendor 文件
    • 创建 jokes 数据库
    • 执行数据库迁移,创建数据表
  • 执行测试 phpunit

    3. 自动执行Travis

    配置好上面的内容后,当想 Github 发起 push 后,就会自动进行持续集成,安装上面的配置一步步执行,告知测试结果。
    Laravel项目中运用Travis持续集成和自动化测试_第2张图片

Laravel项目中运用Travis持续集成和自动化测试_第3张图片

Laravel项目中运用Travis持续集成和自动化测试_第4张图片

Laravel项目中运用Travis持续集成和自动化测试_第5张图片

4. 添加构建状态图标

在 Travis 项目界面点击状态图标,在弹出的窗口中现在对应的分支,以及格式,比如 Markdown,将代码复制到项目的 readme.md 文件中:
Laravel项目中运用Travis持续集成和自动化测试_第6张图片

readme.md:

[![Build Status](https://travis-ci.org/zhongchenyu/jokes-laravel.svg?branch=master)](https://travis-ci.org/zhongchenyu/jokes-laravel)

An api server project using PHP Framework Laravel.

然后在 Github 项目页面
https://github.com/zhongchenyu/jokes-laravel
就会显示项目上次构建的结果了:
Laravel项目中运用Travis持续集成和自动化测试_第7张图片

你可能感兴趣的:(PHP)