phpt文件用于PHP的自動化測試,這是PHP用自己來測試自己的測試數據用例文件。測試腳本通過執行PHP源碼根目錄下的run-tests.php,讀取phpt文件執行測試。
phpt文件包含 TEST,FILE,EXPECT 等多個段落的文件。在各個段落中,TEST、FILE、EXPECT是基本的段落,每個測試腳本都必須至少包括這三個段落。其中:
- TEST段可以用來填寫測試用例的名字。
- FILE段是一個 PHP 腳本實現的測試用例。
- EXPECT段則是測試用例的期待值。
在這三個基本段落之外,還有多個段落,如作為用例輸入的GET、POST、COOKIE等,此類字段最終會賦值給$env變量。比如,cookie存放在$env['HTTP_COOKIE'],$env變量將作為用例中腳本的執行環境。一些主要段落說明如下表所示:
PHP測試腳本中的段落說明
| :段落名 | 填充內容 | 備注 |
|-----|-----|-----|
| TEST | 測試腳本語句 | 必填段落 |
| FILE | 測試腳本語句 | 必填段落。用PHP語言書寫的腳本語句。其執行的結果將與 EXPECT* 段的期待結果做對比。 |
| ARGS | FILE 段的輸入參數 | 選填段落 |
| SKIPIF | 跳過這個測試的條件 | 選填段落 |
| POST | 傳入測試腳本的 POST 變量 | 選填段落。如果使用POST段,建議配合使用SKIPIF段 |
| GET | 傳入測試腳本的 GET 變量 | 選填段落。如果使用GET段,建議配合使用SKIPIF段。 |
| POST_RAW | 傳入測試腳本的POST內容的原生值 | 選填段落。比如在做文件上傳測試時就需要使用此字段來模擬HTTP的POST請求。 |
| COOKIE | 傳入測試腳本的COOKIE的值 | 選填段落。最常見的是將PHPSESSID的值傳入。 |
| INI | 應用于測試腳本的 ini 設置 | 選填段落。例如 foo=bar 。其值可通過函數 ini_get(string name_entry) 獲得。 |
| ENV | 應用于測試腳本的環境設置 | 選填段落。例如做gzip測試,則需要設置環境HTTP_ACCEPT_ENCODING=gzip。 |
| EXPECT | 測試腳本的預期結果 相當于測試文件的結果 | 必填段落 |
| EXPECTF | 測試腳本的預期結果 | 選填段落。可用函數 sscanf() 中的格式表達預期結果 EXPECT 段的變體 |
| EXPECTREGEX | 測試腳本的正則預期結果 | 選填段落。以正則的方式包含多個預期結果,是預期結果EXPECT段的一種變體。 |
| EXPECTHEADERS | 測試腳本的預期頭部內容 | 選填段落.測試腳本期待HTTP頭部返回,是預期結果EXPECT段的另一種格式。驗證過程中會按頭部的字段一一比對測試,比如zlib擴展中,如果開啟zlib.output_compression, 則在EXPECTHEADERS中包含Content-Encoding: gzip作為預期結果。 |
phpt文件只是用例文件,它還需要一個控制器來調用這些文件,以實現整個測試過程。PHP的測試控制器文件是源碼根目錄下的run-tests.php文件。此文件的作用是根據傳入的參數,分析用例相關數據,執行測試過程。其大概過程如下:
1. 分析輸入的命令行,根據參數配置相關參數,初始化各種信息。
1. 分析用例輸入參數,獲取需要執行的用例文件列表。PHP支持指定單文件用例執行,支持多文件用例執行,支持* .phpt多用例執行,支持* .phpt簡化版本_多用例執行(相當于_.phpt)。
1. 遍歷用例文件列表,執行每一個用例。對于每個用例,PHP會具體解析測試腳本中各個段落的含義,清除所有上次測試的記錄與設置將準備此次的測試環境,并把各種中間文件和日志文件準備好,然后用環境變量 TEST_PHP_EXECUTABLE 指定的 PHP 可執行對象運行實際的測試語句。最后將運行后的結果和測試腳本中的預期結果(EXPECT*段)進行比較,如果比較結果一致,則測試通過;如果不一致,則測試失敗,最后將結果信息一一記錄到用戶設置的日志文件中。
1. 生成測試結果。
這僅僅是執行的過程,除此之外,還有若干準備和清理工作,如,對上次測試遺留下的環境的清理,本次測試所必須的環境變量的讀取與設置,對測試參數的解析,測試腳本名的解析,各種輸出文件的準備等等
以測試腳本/tests/basic/001.phpt為例:
--TEST--
Trivial "Hello World" test
--FILE--
<?php echo "Hello World"?>
--EXPECT--
Hello World
這個用例腳本只包含必填的三項。測試控制器會執行--FILE--下面的PHP文件,如果最終的輸出是--EXPECT--所期望的結果則表示這個測試通過,如果不一致,則測試不通過,最終這個用例的測試結果會匯總會所有的測試結果集中。
- 第一章 準備工作和背景知識
- 第一節 環境搭建
- 第二節 源碼結構、閱讀代碼方法
- 第三節 常用代碼
- 第四節 小結
- 第二章 用戶代碼的執行
- 第一節 生命周期和Zend引擎
- 第二節 SAPI概述
- Apache模塊
- 嵌入式
- FastCGI
- 第三節 PHP腳本的執行
- 詞法分析和語法分析
- opcode
- opcode處理函數查找
- 第四節 小結
- 第三章 變量及數據類型
- 第一節 變量的結構和類型
- 哈希表(HashTable)
- PHP的哈希表實現
- 鏈表簡介
- 第二節 常量
- 第三節 預定義變量
- 第四節 靜態變量
- 第五節 類型提示的實現
- 第六節 變量的生命周期
- 變量的賦值和銷毀
- 變量的作用域
- global語句
- 第七節 數據類型轉換
- 第八節 小結
- 第四章 函數的實現
- 第一節 函數的內部結構
- 函數的內部結構
- 函數間的轉換
- 第二節 函數的定義,傳參及返回值
- 函數的定義
- 函數的參數
- 函數的返回值
- 第三節 函數的調用和執行
- 第四節 匿名函數及閉包
- 第五節 小結
- 第五章 類和面向對象
- 第一節 類的結構和實現
- 第二節 類的成員變量及方法
- 第三節 訪問控制的實現
- 第四節 類的繼承,多態及抽象類
- 第五節 魔術方法,延遲綁定及靜態成員
- 第六節 PHP保留類及特殊類
- 第七節 對象
- 第八節 命名空間
- 第九節 標準類
- 第十節 小結
- 第六章 內存管理
- 第一節 內存管理概述
- 第二節 PHP中的內存管理
- 第三節 內存使用:申請和銷毀
- 第四節 垃圾回收
- 新的垃圾回收
- 第五節 內存管理中的緩存
- 第六節 寫時復制(Copy On Write)
- 第七節 內存泄漏
- 第八節 小結
- 第七章 Zend虛擬機
- 第一節 Zend虛擬機概述
- 第二節 語法的實現
- 詞法解析
- 語法分析
- 實現自己的語法
- 第三節 中間代碼的執行
- 第四節 PHP代碼的加密解密
- 第五節 小結
- 第八章 線程安全
- 第二節 線程,進程和并發
- 第三節 PHP中的線程安全
- 第九章 錯誤和異常處理
- 第十章 輸出緩沖
- 第十六章 PHP語言特性的實現
- 第一節 循環語句
- foreach的實現
- 第二十章 怎么樣系列(how to)
- 附錄
- 附錄A PHP及Zend API
- 附錄B PHP的歷史
- 附錄C VLD擴展使用指南
- 附錄D 怎樣為PHP貢獻
- 附錄E phpt測試文件說明
- 附錄F PHP5.4新功能升級解析
- 附錄G:re2c中文手冊