1. 程式人生 > >Laravel專案中運用Travis持續整合和自動化測試

Laravel專案中運用Travis持續整合和自動化測試

背景

在很多Github開源專案頁面的readme中,經常看到類似的圖示
這裡寫圖片描述

這個 bulid passing,其實是 Travis 的構建狀態圖示。Travis 是一個結合 Github 使用的持續整合(CI:continuous integration)工具。持續整合是一種軟體開發實踐,即團隊開發成員經常整合他們的工作,每次整合都通過自動化的構建(包括編譯,釋出,自動化測試)來驗證,從而儘早地發現整合錯誤。使用 Travis 後,每當對 Github 進行 push 操作時,都會在 Travis 提供的環境上執行自動化的構建。

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)

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 後,就會自動進行持續整合,安裝上面的配置一步步執行,告知測試結果。
    這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

4. 新增構建狀態圖示

在 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.

相關推薦

Laravel專案運用Travis持續整合自動化測試

背景 在很多Github開源專案頁面的readme中,經常看到類似的圖示 這個 bulid passing,其實是 Travis 的構建狀態圖示。Travis 是一個結合 Github 使用的持續整合(CI:continuous integration)

Maven+TravisCI持續整合Coveralls測試覆蓋率檢測

之前挖了不少開源專案的坑 ,準備慢慢填起來 .第一步當然從專案管理開始 ,把之前的maven專案弄得更加規整. Maven 還是延續之前的parent-pom/child-jar的結構 * parent中只留配置 : dependencies/plug

Jenkins學習總結(3)——Jenkins+Maven+Git搭建持續整合自動化部署的

前言     持續整合這個概念已經成為軟體開發的主流,可以更頻繁的進行測試,儘早發現問題並提示。自動化部署就更不用說了,可以加快部署速度,並可以有效減少人為操作的失誤。之前一直沒有把這個做起來,最近的新專案正好有機會,費了一番功夫總算搞好了,特此記錄。 1. 開發環

利用Travis CI+GitHub實現持續整合自動部署

前言 如果你手動部署過專案,一定會深感持續整合的必要性,因為手動部署實在又繁瑣又耗時,雖然部署流程基本固定,依然容易出錯。 如果你很熟悉持續整合,一定會同意這樣的觀點:“使用它已經成為一種標配”。 什麼是持續整合 Continuous Integration(CI) is a development p

iOS 刪除專案未使用的圖片類檔案

由於隨著專案不但的版本迭代開發,資源也不斷的替換,執行檔案 + 圖片資源的也跟著不斷的累積, 導致app的”容量“不斷地增加。 為此我們需要給app瘦身,刪除一些沒有用到的類檔案和圖片資源。   1、刪圖 在進行刪除沒有用到的圖片的時候,我想到了兩種方法去實現它。 第一、

vue專案使用easeui的sideMenutabs 標籤遇到的問題

  實現功能: 點選左側選單,右側標籤頁顯示該選單; 問題: 1.點選左側選單的時候,標籤頁不是顯示當前選單項;  解決方法: 第一使用不知道easeUide tab頁的select的使用方法.理解到select的使用方法後,給這個select方法傳遞一個當前開啟的選單在這個標籤

專案提供對外的ip埠的查詢方法

    說明: 在一個多方整合的專案中, 一般兩方的工程人員先調通網路(走專線或是其他), 然後研發再進行開發.   研發的時候, 有測試環境, 正式環境, 對外的ip和埠也都是不一樣的.   專案開發完成了, 過了很久之後, 維護該專案的人員都

PHP專案使用Guzzle執行POSTGET請求

以往在專案中要用到第三方介面時會用到封裝好的curl執行請求,現在有了更好的解決方案——Guzzle。 下面是官方介紹: Guzzle是一個PHP的HTTP客戶端,用來輕而易舉地傳送請求,並整合到我們的WEB服務上。 介面簡單:構建查詢語句、POST請求、分流

【備忘】Lucene從入門到專案運用視訊

01_lucenc簡介和建立索引初步.avi 02_lucene簡介和搜尋初步.avi 03_lucene索引_建立_域選項.avi 04_lucene索引_的刪除和更新.avi 05_lucene索引_加權操作和Luke的簡單演示.avi  06_對日期和數字進行索引.av

怎樣實際專案運用責任鏈模式

1 模式概要 1.1 簡介 責任鏈模式為請求建立一個接收者物件鏈,每個接收者都包含對另一個接收者的引用,如果一個物件不能處理該請求,那麼它會把請求傳給下一個接收者,依此類推 責任鏈模式避免了請求的傳送者和接收者耦合在一起,讓多個物件都有可能接收請求,將這些物件連成一條鏈,並且沿著這條鏈傳遞請

Android 專案配置 gitlab-ci 持續整合

一、專案根目錄下建立一個 .gitlab-ci.yml 檔案 然後在 .gitlab-ci.yml 中配置持續整合的指令碼: 指令碼配置詳細可以看:   Configuration of your jobs with .gitlab-ci.yml Setting up GitLab

專案運用rabbitmq

本章內容 解耦思維 例項解析 實現RPC功能        在專案開發中,我們談論最多的應該就是專案的可擴充套件性,解耦專案中的各模組就是解決擴充套件性的一種實現方式。為什麼要解耦?什麼樣的場景需要解耦呢? 解耦思維 &n

Nginx設定Laravel專案圖片防盜鏈以及禁止位址列直接訪問圖片

為了防止圖片盜用,禁止外鏈以及禁止位址列直接訪問圖片是必不可少的方案,當然這樣的限制還比較基礎,還是有別的途徑可以盜圖的,更多的限制之後會追加,現在先做好這兩個基礎防護。 location ~ .*\.

Vue專案引入iconfont 圖示庫 圖示顯示成小方塊的問題解決

這兩天弄了個vue的小demo ,引入了iconfont 的圖示,沒想到是噩耗的開始,一直顯示的是小方塊,一步步排查踩坑把問題解決。 首先看看官方對專案引入iconfont 的介紹。 unicode引用 unicode是字型在網頁端最原始的應用方式,特點是: 相容性最

Jenkins+Sonar搭建持續整合程式碼質量檢查環境

Jenkins+Sonar搭建 一、相關環境及下載地址 二、軟體安裝 Jenkins安裝 命令:dpkg –i jenkins_2.121.3_all.deb 若有報錯,執行# apt-get update 和# apt-get –f install, # ln -s /opt/jdk1.8.0_131/b

在同一SpringBoot專案啟動Dubbo服務端客戶端

Dubbo是微服務框架,服務需要部署到不同JVM虛擬機器,由此代理的問題是需要提供一個統一Jar包(包含Dubbo介面和JVM間傳遞的實體類),Dubbo伺服器端與客戶端需要共享這個Jar包,在專案開發中這是最為通用的方法, 但在Dubbo案例中如此實現,需要定義三個Maven工程,工作量

實際專案運用責任鏈模式 | 併發程式設計網

1 模式概要 1.1 簡介 責任鏈模式為請求建立一個接收者物件鏈,每個接收者都包含對另一個接收者的引用,如果一個物件不能處理該請求,那麼它會把請求傳給下一個接收者,依此類推 責任鏈模式避免了請求的傳送者和接收者耦合在一起,讓多個物件都有可能接收請求,將這些物件連成一條鏈,並且沿著這條鏈傳遞請

持續整合 CI 自動化構建自動化測試--初探

此文章是為了總結前一段時間由於Maven2的學習而引起的一個持續整合的學習。 一、什麼是持續整合(Continuous Integration)?      這個概念到底是怎麼定義,說實話很多不同的版本。這裡我就把我理解的什麼叫持續整合說下,其實持續整合是

Swagger在Laravel專案的使用

本篇講述在如何快速在Laravel中引入Swagger並開始使用。 安裝 首先是使用Laravel的一個composer:L5 Swagger。 下面是對應的各個版本。 Laravel Swagger UI OpenAPI Spec c

專案使用redis單機版叢集版

redis搭建請看上一篇文章新增jedis依賴: <!-- Redis客戶端 --> <dependency> <groupId>redis.clients</groupId> &l