解決方案 - 自動化單元測試

語言: CN / TW / HK

前言

收到讀者的諮詢,情況是這樣的:

“亮哥,看了你最近的 8 篇關於持續交付的文章,想諮詢一下對於研發人員有沒有可落地的方案,我是 PHP 研發工程師,專案中使用的是 Laravel 框架,負責的是電商業務,如何將持續交付使用起來呢?”

今天有時間,簡單整理一下,首先我們要知道持續交付涉及的事情很多,涉及的人員角色也很廣,比如包括需求分析人員、技術人員、運維人員、測試人員、客戶 等。關於這個問題,文章中理論的部分很到位,目前我們主要從技術人員的角度考慮,做一些 技術導向且支援開發過程的測試 ,實現一個可落地的方案,等拿到程式碼後就可以在此基礎上編寫,雖然不是很全面,但可以在此基礎上進行擴充套件。

約定測試 Case

以電商業務為例,簡單列舉 2 個測試 Case:

  1. 下單(從購物車下單) -> 支付(優惠券 + 餘額) -> 發貨 -> 收貨 -> 評價;

  2. 下單(直接下單) -> 支付(微信) -> 發貨 -> 收貨 -> 退款(售後);

實際場景中有很多 Case,比如就支付這塊就有很多種排列組合,退款這塊也會有很多排列組合,原理都是一樣的,只要上面的兩個會寫了,其他的也就都會寫了。

專案分析

Case 中的不同環節的不同操作,對於後端來說都是可供呼叫的 API 介面,其實我們要實現的就是如何自動化按照流程自定義流程順序呼叫這些 API 介面。

專案的框架是 Laravel,那麼我們考慮的就是在框架中如何編寫單元測試程式碼?這個比較簡單,在 tests 目錄就可以編寫測試用例。

用例編寫

安裝 orchestra/testbench

composer require --dev "orchestra/testbench"

使用這個包,可以幫助編寫 Laravel 專案測試,在這裡面可以使用 Laravel 中的一些特性。

建立 BaseTestCase.php

<?php

namespace Tests;

abstract class BaseTestCase extends \Orchestra\Testbench\TestCase

{

}

要注意的是 extends \Orchestra\Testbench\TestCase 而不是 PHPUnit\Framework\TestCase

建立 OrderTest.php

<?php

namespace Tests\Unit;

use Tests\BaseTestCase;

class OrderTest extends BaseTestCase

{

/**

* 流程:

* 1.下單(從購物車下單)

* 2.支付(優惠券 + 餘額)

* 3.發貨

* 4.收貨

* 5.評價

*/

public  function testCase1 ()

{

// 1.下單(從購物車下單)

// 2.支付(優惠券 + 餘額)

// 3.發貨

// 4.收貨

// 5.評價

/**

* 1.在每個流程中都模擬呼叫 HTTP API 介面;

* 2.斷言 HTTP 狀態碼為 200;

* 3.如果還有業務狀態碼,需要斷言業務狀態碼為正確返回的狀態碼;

*/

// 僅做效果演示,斷言 200 = 200,總是真 

$this ->assertEquals(200, 200);

}

/**

* 流程:

* 1.下單(直接下單)

* 2.支付(微信)

* 3.發貨

* 4.收貨

* 5.退款(售後)

*/

public  function testCase2 ()

{

// 1.下單(直接下單)

// 2.支付(微信)

// 3.發貨

// 4.收貨

// 5.退款(售後)

$this ->assertEquals(200, 200);

}

}

輸出結果美化

composer require --dev codedungeon/phpunit-result-printer

使用這個工具,可以讓輸出結果更加美觀、清晰明瞭。

phpunit.xml 中配置 printerClass = "Codedungeon\PHPUnitPrettyResultPrinter\Printer" ,例如:

<?xml version= "1.0" encoding= "UTF-8" ?>

<phpunit

printerClass= "Codedungeon\PHPUnitPrettyResultPrinter\Printer"

colors= "true" >

<testsuites>

<testsuite name= "Laravel Test Suite" >

<directory suffix= "Test.php" >./tests</directory>

</testsuite>

</testsuites>

</phpunit>

效果

./vendor/bin/phpunit tests/Unit/OrderTest.php

兩個綠色對勾,表示兩個 Case 執行通過。

疑問

一、有同學會說了,這不是自動化的呀,需要手動執行一個命令才行,如果你們釋出系統使用的 GitLab,那麼在 GitLab 中增加一個環節即可,在這個環節中執行這個命令。

二、如果執行專案內全部的 case 怎麼辦?命令這樣寫就可以 ./vendor/bin/phpunit tests

三、Case 一定 API 測試嗎?不一定,也可以測試自己的方法。

四、持續整合/持續交付與語言有關係嗎?沒關係。

小結

以上,就是一個可落地的方案,基本上跑通了,在此基礎上編寫就可以,根據自己的業務場景去完善吧。

在這做個小調查,大家在專案中都編寫測試用例嗎,為什麼?歡迎大家在留言區評論。