中運(yùn)行 ramsey/uuid 測(cè)試套件)
使用 Vagrant 在 Linux 虛擬機(jī)中運(yùn)行 ramsey/uuid 測(cè)試套件【免費(fèi)下載鏈接】uuid:snowflake: A PHP library for generating universally unique identifiers (UUIDs).項(xiàng)目地址: https://gitcode.com/gh_mirrors/uui/uuidramsey/uuid 是一套 PHP 的通用唯一標(biāo)識(shí)符UUID生成與處理庫(kù)。為了讓貢獻(xiàn)者和維護(hù)者能在干凈、可復(fù)現(xiàn)的 Linux 環(huán)境中運(yùn)行完整測(cè)試倉(cāng)庫(kù)在resources/vagrant/linux/下提供了現(xiàn)成的 Vagrant 配置。本文將帶你一步步啟動(dòng)這臺(tái) Linux 虛擬機(jī)、安裝依賴并跑完整個(gè)測(cè)試套件同時(shí)深入解析 Vagrantfile 中每一項(xiàng)配置的含義并說(shuō)明test腳本背后到底執(zhí)行了哪些檢查。讀完本文你將掌握用 Vagrant 搭建 ramsey/uuid 開(kāi)發(fā)環(huán)境的標(biāo)準(zhǔn)流程也能看懂這套環(huán)境為“測(cè)試通過(guò)”提供了哪些保障。一、為什么用 Vagrant 跑測(cè)試ramsey/uuid 的測(cè)試覆蓋了 UUID 解析、生成、編解碼、時(shí)間與數(shù)字轉(zhuǎn)換等大量邏輯可參考 phpunit.xml.dist 中對(duì)tests目錄的測(cè)試套件配置。本地開(kāi)發(fā)環(huán)境往往和 CI 環(huán)境存在差異例如 PHP 版本、擴(kuò)展bcmath、gmp、uuid是否安裝等。Vagrant 允許你用一段聲明式配置Vagrantfile啟動(dòng)一臺(tái)與預(yù)期一致的虛擬機(jī)保證“在我機(jī)器上能跑”變成“在任何地方都能跑”。倉(cāng)庫(kù)在 resources/vagrant/README.md 中統(tǒng)一說(shuō)明了這套方案需要先安裝 Vagrant每個(gè)環(huán)境均可使用 VirtualBox 運(yùn)行根據(jù)所用 box 的不同也可能支持 VMware、Hyper-V 等其他 provider提供了 Linux、FreeBSD、Windows 三個(gè)平臺(tái)的環(huán)境目錄可分別閱讀 linux/README.md、freebsd/README.md 與 windows/README.md。本文聚焦 Linux 環(huán)境它對(duì)應(yīng) resources/vagrant/linux/Vagrantfile。二、前置條件在開(kāi)始之前請(qǐng)確認(rèn)本機(jī)滿足已安裝 Vagrant版本建議不低于 2.xVagrantfile 使用了Vagrant.configure(2)配置 API已安裝 VirtualBox或你希望使用的其他 provider如 VMware、Hyper-V網(wǎng)絡(luò)可訪問(wèn) Ubuntu 鏡像與 PHP 軟件包源首次vagrant up需要下載 box 鏡像并運(yùn)行apt-get。三、三步啟動(dòng) Linux 測(cè)試環(huán)境Linux 環(huán)境的使用方式非常簡(jiǎn)潔進(jìn)入該目錄后依次執(zhí)行cd /path/to/uuid/resources/vagrant/linux vagrant up vagrant ssh命令含義如下vagrant up根據(jù) Vagrantfile 創(chuàng)建并啟動(dòng)虛擬機(jī)首次運(yùn)行會(huì)自動(dòng)下載 box、執(zhí)行初始化腳本provisionvagrant ssh通過(guò) SSH 登錄進(jìn)虛擬機(jī)進(jìn)入交互式 Shell若后續(xù)改動(dòng)了 Vagrantfile 或需要重新執(zhí)行初始化腳本可結(jié)合vagrant provision/vagrant reload --provision使用標(biāo)準(zhǔn) Vagrant 命令。提示請(qǐng)把/path/to/uuid替換為你的 ramsey/uuid 倉(cāng)庫(kù)實(shí)際所在路徑。Vagrant 的 synced_folder 會(huì)把倉(cāng)庫(kù)根目錄同步到虛擬機(jī)內(nèi)因此無(wú)需在虛擬機(jī)里手動(dòng) clone 代碼。四、進(jìn)入虛擬機(jī)后運(yùn)行測(cè)試登錄進(jìn)虛擬機(jī)后工作目錄中應(yīng)已包含同步進(jìn)來(lái)的倉(cāng)庫(kù)詳見(jiàn)下文對(duì)同步配置的分析。此時(shí)按順序執(zhí)行cd uuid/ composer install composer run-script --timeout0 test兩步各司其職composer install依據(jù) composer.json 安裝全部依賴含require-dev中的 PHPUnit、PHPStan、PHPBench、Mockery、代碼規(guī)范檢查工具等。首次執(zhí)行可能需要幾分鐘composer run-script --timeout0 test執(zhí)行test腳本。--timeout0用于取消 Composer 腳本的默認(rèn)執(zhí)行超時(shí)限制——因?yàn)橥暾膖est腳本包含靜態(tài)分析、基準(zhǔn)測(cè)試等耗時(shí)長(zhǎng)任務(wù)若不取消超時(shí)可能中途被 Composer 中斷。test腳本到底做了什么打開(kāi) composer.json 可以看到腳本定義scripts: { dev:analyze: dev:analyze:phpstan, dev:analyze:phpstan: phpstan analyse --ansi --memory-limit 1G, dev:bench: php -d error_reporting24575 vendor/bin/phpbench run, dev:lint: [ dev:lint:syntax, dev:lint:style ], dev:lint:fix: phpcbf --cachebuild/cache/phpcs.cache, dev:lint:style: phpcs --cachebuild/cache/phpcs.cache --colors, dev:lint:syntax: parallel-lint --colors src/ tests/, dev:test: [ dev:lint, dev:bench, dev:analyze, dev:test:unit ], dev:test:unit: phpunit --colorsalways, test: dev:test }也就是說(shuō)composer run-script test最終等價(jià)于依次執(zhí)行四類檢查dev:test步驟命令作用語(yǔ)法檢查parallel-lint --colors src/ tests/掃描src/與tests/下所有 PHP 文件的語(yǔ)法錯(cuò)誤代碼風(fēng)格檢查phpcs --cachebuild/cache/phpcs.cache --colors依據(jù)項(xiàng)目編碼規(guī)范見(jiàn) phpcs.xml.dist檢查風(fēng)格靜態(tài)分析phpstan analyse --ansi --memory-limit 1GPHPStan 類型級(jí)靜態(tài)分析配置見(jiàn) phpstan.neon.dist內(nèi)存上限 1G基準(zhǔn)測(cè)試phpbench run運(yùn)行 tests/benchmark 下的性能基準(zhǔn)如UuidGenerationBench、UuidStringConversionBench等單元測(cè)試phpunit --colorsalways執(zhí)行 phpunit.xml.dist 配置的unit-tests測(cè)試套件覆蓋整個(gè)tests/目錄因此當(dāng)你在虛擬機(jī)里看到test腳本最終輸出綠色“OK”時(shí)說(shuō)明該環(huán)境下的代碼同時(shí)通過(guò)了語(yǔ)法、風(fēng)格、靜態(tài)分析、基準(zhǔn)與單元測(cè)試五重校驗(yàn)這也與倉(cāng)庫(kù) docs/testing.rst 介紹的完整質(zhì)量保障體系一致。五、深入解析 Linux VagrantfileLinux 環(huán)境的完整配置在 resources/vagrant/linux/Vagrantfile 中只有二十余行逐段拆解如下。1. 初始化腳本預(yù)裝 PHP 生態(tài)依賴$script -SCRIPT apt-get update apt-get install -y \ composer \ php-bcmath \ php-cli \ php-gmp \ php-json \ php-uuid \ php-xdebug \ php-xml \ php-zip \ unzip SCRIPT這段 Shell 腳本會(huì)在虛擬機(jī)首次啟動(dòng)時(shí)由 Vagrant 的 provision 階段執(zhí)行完成兩件事apt-get update刷新軟件源索引apt-get install -y ...一次性安裝 PHP 測(cè)試環(huán)境所需的全部軟件包。各包與 ramsey/uuid 的對(duì)應(yīng)關(guān)系如下軟件包作用composerPHP 依賴管理器用于composer installphp-cliPHP 命令行運(yùn)行環(huán)境本庫(kù)是純庫(kù)無(wú)需 Web 服務(wù)器php-bcmath啟用 BCMath 任意精度整數(shù)運(yùn)算。按 composer.json 的suggest說(shuō)明可“使用 BCMath 實(shí)現(xiàn)更快的任意精度整數(shù)數(shù)學(xué)運(yùn)算”對(duì)應(yīng)src/Math/下的 BigNumber 相關(guān)轉(zhuǎn)換器php-gmp啟用 GMP 任意精度整數(shù)運(yùn)算同樣是suggest中提到的可選加速擴(kuò)展php-uuidPECL uuid 擴(kuò)展用于啟用PeclUuidTimeGenerator與PeclUuidRandomGenerator見(jiàn) src/Generator并關(guān)聯(lián)NameGeneratorFactory、RandomGeneratorFactory、TimeGeneratorFactory對(duì) PECL 實(shí)現(xiàn)的探測(cè)php-jsonJSON 支持src/Type/中的類型對(duì)象序列化等場(chǎng)景需要php-xdebugXdebug 調(diào)試擴(kuò)展composer.json 中dev:test:coverage:*腳本用xdebug.modecoverage生成覆蓋率報(bào)告php-xmlXML 解析擴(kuò)展PHPUnit 的 XML 配置與 JUnit 日志輸出依賴它php-zipZIP 擴(kuò)展composer install下載/解壓依賴包時(shí)需要unzip解壓工具配合php-zip保證 Composer 能正常安裝歸檔類依賴由此可見(jiàn)這臺(tái)虛擬機(jī)幾乎預(yù)裝了本庫(kù)可能用到的全部 PHP 擴(kuò)展組合從而能讓測(cè)試覆蓋“帶 bcmath/gmp/uuid 擴(kuò)展”的真實(shí)運(yùn)行形態(tài)避免因擴(kuò)展缺失導(dǎo)致部分測(cè)試被跳過(guò)。2. Vagrant 核心配置Vagrant.configure(2) do |config| config.vm.box ubuntu/eoan64 config.vm.provision shell, inline: $script config.vm.synced_folder ../../../, /home/vagrant/uuid, type: rsync config.vm.provider virtualbox do |v| v.name ramsey-uuid-linux end endconfig.vm.box ubuntu/eoan64使用 Ubuntu 19.10 (Eoan) 64 位官方 box。需要說(shuō)明的是該 box 基于較老的 Ubuntu 發(fā)行版軟件包版本可能偏舊如果你在本地遇到 box 下載失敗或源失效可以按同樣的結(jié)構(gòu)替換為較新的 Ubuntu box并把$script中的包名適配到對(duì)應(yīng)發(fā)行版config.vm.provision shell, inline: $script以 Shell 方式執(zhí)行前面定義的初始化腳本屬于up階段的自動(dòng)化配置config.vm.synced_folder ../../../, /home/vagrant/uuid, type: rsync把倉(cāng)庫(kù)根目錄resources/vagrant/linux的上三級(jí)目錄即 ramsey/uuid 倉(cāng)庫(kù)根以rsync方式同步到虛擬機(jī)內(nèi)的/home/vagrant/uuid。這正是上一節(jié)cd uuid/能直接進(jìn)入倉(cāng)庫(kù)的原因。注意 rsync 是單向同步在虛擬機(jī)內(nèi)的改動(dòng)不會(huì)自動(dòng)回傳到宿主機(jī)config.vm.provider virtualbox do |v| v.name ramsey-uuid-linux end當(dāng) provider 為 VirtualBox 時(shí)把虛擬機(jī)顯示名稱設(shè)為ramsey-uuid-linux便于在 VirtualBox 管理界面中識(shí)別。六、與其他平臺(tái)環(huán)境的對(duì)比倉(cāng)庫(kù)還提供了另外兩套同構(gòu)環(huán)境操作流程幾乎一致FreeBSDfreebsd/README.md 同樣是vagrant up→vagrant ssh→composer install→composer run-script --timeout0 test用于驗(yàn)證庫(kù)在 BSD 系 PHP 環(huán)境下的行為Windowswindows/README.md 在登錄虛擬機(jī)后多了一步refreshenv刷新環(huán)境變量使 PATH 中生效新安裝的工具且目錄為cd uuid。也就是說(shuō)同一套測(cè)試命令可以在三種操作系統(tǒng)環(huán)境中復(fù)現(xiàn)這正是 Vagrant 方案的價(jià)值所在用一份配置把“跨平臺(tái)測(cè)試”變成標(biāo)準(zhǔn)化的可重復(fù)操作。七、小結(jié)與排查建議標(biāo)準(zhǔn)流程cd resources/vagrant/linux→vagrant up→vagrant ssh→cd uuid/→composer install→composer run-script --timeout0 testtest腳本 語(yǔ)法檢查 代碼風(fēng)格 PHPStan 靜態(tài)分析 PHPBench 基準(zhǔn) PHPUnit 單元測(cè)試五重校驗(yàn)若composer install報(bào)擴(kuò)展缺失回到宿主機(jī)執(zhí)行vagrant provision或vagrant reload --provision重新執(zhí)行$script安裝軟件包若測(cè)試結(jié)果與宿主機(jī)不一致優(yōu)先檢查虛擬機(jī)內(nèi) PHP 版本與擴(kuò)展加載情況php -v、php -m這臺(tái)虛擬機(jī)預(yù)裝了bcmath、gmp、uuid、xdebug等擴(kuò)展宿主環(huán)境不一定具備由于采用 rsync 單向同步建議在宿主機(jī)編輯代碼、在虛擬機(jī)內(nèi)跑測(cè)試避免雙向同步的混亂如需了解測(cè)試覆蓋率、靜態(tài)分析等更多質(zhì)量工具的用法可繼續(xù)閱讀 docs/testing.rst 以及根目錄 README.md 中關(guān)于開(kāi)發(fā)和測(cè)試的章節(jié)。【免費(fèi)下載鏈接】uuid:snowflake: A PHP library for generating universally unique identifiers (UUIDs).項(xiàng)目地址: https://gitcode.com/gh_mirrors/uui/uuid創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考