在很多Github开源项目页面的readme中,经常看到类似的图标
这个 bulid passing,其实是 Travis 的构建状态图标。Travis 是一个结合 Github 使用的持续集成(CI:continuous integration)工具。持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。使用 Travis 后,每当对 Github 进行 push 操作时,都会在 Travis 提供的环境上执行自动化的构建。
下面就介绍下如何在我的 PHP Laravel 项目上通过 Travis 执行自动化测试的。
先上代码:
https://github.com/zhongchenyu/jokes-laravel
比如我们想测试一下用户注册功能,首先在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官方文档-测试
Travis是一个持续集成工具,对于Github 上的开源项目可以免费使用。首先打开网站 https://travis-ci.org/ ,使用 Github 账号授权登录,之后 Travis 会同步 Github 上的开源项目,选择你要进行持续集成的项目即可,过程比较简单,照着Travis官方文档操作就行,关键的地方就是要编辑好Travis的配置文件,下面就介绍一下基于PHP Laravel 框架的项目配置时需要注意的地方。
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
在项目根路径下添加 .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
执行测试 phpunit
配置好上面的内容后,当想 Github 发起 push 后,就会自动进行持续集成,安装上面的配置一步步执行,告知测试结果。
在 Travis 项目界面点击状态图标,在弹出的窗口中现在对应的分支,以及格式,比如 Markdown,将代码复制到项目的 readme.md 文件中:
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
就会显示项目上次构建的结果了: