解決方案 - 自動化單元測試
前言
收到讀者的諮詢,情況是這樣的:
“亮哥,看了你最近的 8 篇關於持續交付的文章,想諮詢一下對於研發人員有沒有可落地的方案,我是 PHP 研發工程師,專案中使用的是 Laravel 框架,負責的是電商業務,如何將持續交付使用起來呢?”
今天有時間,簡單整理一下,首先我們要知道持續交付涉及的事情很多,涉及的人員角色也很廣,比如包括需求分析人員、技術人員、運維人員、測試人員、客戶 等。關於這個問題,文章中理論的部分很到位,目前我們主要從技術人員的角度考慮,做一些 技術導向且支援開發過程的測試 ,實現一個可落地的方案,等拿到程式碼後就可以在此基礎上編寫,雖然不是很全面,但可以在此基礎上進行擴充套件。
約定測試 Case
以電商業務為例,簡單列舉 2 個測試 Case:
-
下單(從購物車下單) -> 支付(優惠券 + 餘額) -> 發貨 -> 收貨 -> 評價;
-
下單(直接下單) -> 支付(微信) -> 發貨 -> 收貨 -> 退款(售後);
實際場景中有很多 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 測試嗎?不一定,也可以測試自己的方法。
四、持續整合/持續交付與語言有關係嗎?沒關係。
小結
以上,就是一個可落地的方案,基本上跑通了,在此基礎上編寫就可以,根據自己的業務場景去完善吧。
在這做個小調查,大家在專案中都編寫測試用例嗎,為什麼?歡迎大家在留言區評論。
- 這個專案準備錄製視訊教程啦
- 解決方案 - 自動化單元測試
- 自動化驗收測試
- 配置管理
- 軟體交付的問題
- 關於專案中 Repository 層的思考
- 歲末將至,再見 2021
- 關於普通人如何提升執行力?
- Go - 如何編寫 ProtoBuf 外掛 (一) ?
- 為什麼用了 DDD 以後,程式碼更難懂了?
- Go - 關於 protoc 工具的小疑惑
- Golang - 關於 proto 檔案的一點小思考
- Go - 使用 sync.WaitGroup 來實現併發操作
- Go - 使用 sync.Map 來解決 map 的併發操作問題
- Go - 基於逃逸分析來提升程式效能
- Go - 使用 sync.Pool 來減少 GC 壓力
- Go - 基於逃逸分析來提升程式效能
- Go - 使用 sync.Pool 來減少 GC 壓力
- 分散式之介面冪等性
- 分散式之介面冪等性