摘要:本系列教程所有的測試基于版本,框架目錄結構模塊下的目錄是符合的模塊結構的如等是模塊目錄下的結構目錄如果有自己的目錄同級分配即可,如我這里的整體結構重寫過基類的測試基類,用于我們用這個基類做測試基類,后續會說明自動加載文件測試用例目錄某測試模
本系列教程所有的PHPUnit測試基于PHPUnit6.5.9版本,Lumen 5.5框架
目錄結構模塊下的目錄是符合Lumen的模塊結構的
如:Controllers、Models、Logics等是Lumen模塊目錄下的結構目錄
如果有自己的目錄同級分配即可,如我這里的Requests
├── BaseCase.php 重寫過Lumen基類的測試基類,用于我們用這個基類做測試基類,后續會說明 ├── bootstrap.php tests自動加載文件 ├── Cases 測試用例目錄 │ └── Headline 某測試模塊 │ ├── logs 日志輸出目錄 │ ├── PipeTest.php PHPUnit流程測試用例 │ ├── phpunit.xml phpunit配置文件xml │ └── README.md 本模塊測試用例說明 ├── ExampleTest.php 最原始測試demo └── TestCase.php Lumen自帶的測試基類某模塊的目錄結構
Headline //某測試模塊測試用例目錄 ├── Cache ├── Controllers │?? ├── ArticleTest.php │?? ├── ... ├── Listeners │?? └── MyListener.php ├── Logics ├── Models │?? ├── ArticleTest.php │?? ├── ... ├── README.md ├── Requests │?? ├── ArticleTest.php │?? ├── ... ├── logs //日志和覆蓋率目錄 │?? ├── html │?? │?? ├── ... │?? │?? └── index.html │?? ├── logfile.xml │?? ├── testdox.html │?? └── testdox.txt ├── phpunit-debug-demo.xml //phpunit.xml案例 ├── phpunit-debug.xml //改名后測試用的 └── phpunit.xml //正式用的xml配置BaseCase.php
"token*", "dev" => "token*", "prod" => "" //如果測試真實請填寫授權token ]; /** * 重寫setUp */ public function setUp() { parent::setUp(); $this->seeder = false; if (method_exists($this, "factory")) { $this->app->make("db"); $this->factory($this->app->make(Factory::class)); if (method_exists($this, "seeder")) { if (!method_exists($this, "seederRollback")) { dd("請先創建seederRollback回滾方法"); } $this->seeder = true; $this->seeder(); } } } /** * 重寫tearDown */ public function tearDown() { if ($this->seeder && method_exists($this, "seederRollback")) { $this->seederRollback(); } parent::tearDown(); } /** * 獲取地址 * @param string $apiKey * @param string $token * @return string */ protected function getRequestUri($apiKey = "list", $token = "dev", $ddinfoQuery = true) { $query = "?token=" . static::TOKEN[strtolower($token)]; if ($ddinfoQuery) { $query = $query . "&" . http_build_query(static::DDINFO); } return $apiUri = static::DOMAIN . static::API_URI[$apiKey] . $query; } }phpunit-debug-demo.xml
本文件是我們多帶帶為某些正在測試的測試用例,直接編寫的xml,可以不用來回測試,已經測試成功的測試用例了,最后全部編寫完測試用例,再用正式phpunit.xml即可,具體在運行測試階段看如何指定配置
測試用例案例../../../app/Http/Controllers/Headline ../../../app/Http/Requests/Headline ../../../app/Models/Headline ../../../app/Models/Headline/ArticleKeywordsRelationModel.php ./
define(ArticlesModel::class, function (Generator $faker) use (&$id, $words) { $id++; return [ "id" => $id, "uri" => $faker->lexify("T???????????????????"), "title" => $id == 263 ? "搜索" : $words[rand(0, sizeof($words) - 1)], "authorId" => 1, "state" => 1, "isUpdated" => 0, ]; }); } /** * 生成模擬的數據,需seederRollback 成對出現 */ public function seeder() { $articles = factory(ArticlesModel::class, 10)->make(); foreach ($articles as $article) { // 注意: article為引用對象,不是copy if ($article->isRecommend) { $article->recommendTime = time(); } $article->save(); } } /** * getArticleList 測試數據 * @return array */ public function getArticleListDataProvider() { return [ [1, "搜索", 1, 10, 1], [2, "搜索", 1, 10, 0], [2, null, 1, 10, 0], [3, "搜索", 1, 10, 0], [1, null, 1, 10, 1], [2, null, 1, 10, 0], [3, null, 1, 10, 0], ]; } /** * @dataProvider getArticleListDataProvider */ public function testGetArticleList($type, $searchText, $page, $pageSize, $expceted) { $rst = self::$model->getArticleList($type, $searchText, $page, $pageSize); $this->assertGreaterThanOrEqual($expceted, sizeof($rst)); $rst = self::$model->getArticleCount($type, $searchText); $this->assertGreaterThanOrEqual($expceted, $rst); } /** * addArticle 測試數據 * @return array */ public function addArticleDataProvider() { return [ [ [ "id" => 273, "uri" => "ffffdffffdffffdd0123" ], "save", 0 ], [ [ "id" => 274, "uri" => "ffffdffffdffffdd123" ], "publish", 0 ], [ [ "id" => 275, "uri" => "ffffdffffdffffdd456" ], "preview", 0 ], ]; } /** * @dataProvider addArticleDataProvider */ public function testAdd($data, $action, $expected) { $rst = self::$model->addArticle($data, $action); if ($rst) { self::$model::where("id", $rst)->delete(); } $this->assertGreaterThanOrEqual($expected, $rst); } public function testGetArticleInfo() { $rst = self::$model->getArticleInfo(263, 0); $this->assertGreaterThanOrEqual(1, sizeof($rst)); $rst = self::$model->getArticleInfo(2000, 1); $this->assertEquals(0, sizeof($rst)); } /** * 回滾模擬的數據到初始狀態 */ public function seederRollback() { self::$model::where("id", ">=", 263)->where("id", "<=", 272)->delete(); } }運行測試
cd {APPROOT}/tests/Cases/Headline # mv phpunit-debug-custom.xml -> phpunit-debug.xml ../../../vendor/bin/phpunit --verbose -c phpunit-debug.xml參考
PHPUnit 5.0 官方中文手冊
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30105.html
摘要:創建帳號提供的是持續集成服務,簡稱。在這里引入的原因是我們的項目需要使用服務進行持續集成和測試,當然你也可以替換成別的單元測試工具。創建單元測試用例是單元測試類庫家族中的一員,使用的一個主要目的是為我們的模塊創建單元測試用例。 本文首發于 Travis CI 持續集成服務構建 Composer 類庫簡明教程,轉載請注明出處! 在項目開發過程中,編碼工作只是軟件開發整個過程中的一小部分環...
摘要:另外一些單元測試可能會測試負向路徑的場景,保證代碼不僅會產生錯誤,而且是預期的錯誤。是一個面向程序員的測試框架,這是一個的體系結構的單元測試框架。 本系列教程所有的PHPUnit測試基于PHPUnit6.5.9版本,Lumen 5.5框架 前置 日常我們的普通用到的測試: 代碼直接echo,debug等方法測試 -> 跟蹤細節斷點型測試 log日志輔助測試 -> 跟蹤細節斷點型測試 ...
摘要:另外一些單元測試可能會測試負向路徑的場景,保證代碼不僅會產生錯誤,而且是預期的錯誤。是一個面向程序員的測試框架,這是一個的體系結構的單元測試框架。 本系列教程所有的PHPUnit測試基于PHPUnit6.5.9版本,Lumen 5.5框架 前置 日常我們的普通用到的測試: 代碼直接echo,debug等方法測試 -> 跟蹤細節斷點型測試 log日志輔助測試 -> 跟蹤細節斷點型測試 ...
摘要:可是我們在做單元測試的時候,希望盡可能少的產生依賴。后記任何一個可靠的系統,單元測試都是必不可少的。慶幸的是,幫我們提供了好用的單元測試。 本文是我在實踐后的一點總結,難免有不妥之處。如有幸得大神路過,還望不吝賜教,小弟在此謝過了! 很早就知道有單元測試的概念,也曾嘗試過,但是一直對單元測試的概念和方法,比較模糊。在聽了 @vimac 大神的講堂 PHP單元測試與測試驅動開發 后,慢慢...
摘要:是的單元測試框架。單元測試在軟件開發中越來越受到重視,測試先行編程極限編程和測試驅動開發在實踐中被廣泛。利用單元測試,也可以實現契約式設計。現在第二個測試也能通過啦你也可以使用契約式設計的風格,只需使用類提供的靜態斷言方法編寫契約條件。 PHPUnit是PHP的單元測試框架。單元測試在軟件開發中越來越受到重視,測試先行編程、極限編程和測試驅動開發在實踐中被廣泛。利用單元測試,也可以實現...
閱讀 1458·2021-11-24 09:39
閱讀 1775·2021-11-22 15:25
閱讀 3728·2021-11-19 09:40
閱讀 3283·2021-09-22 15:31
閱讀 1288·2021-07-29 13:49
閱讀 1192·2019-08-26 11:59
閱讀 1308·2019-08-26 11:39
閱讀 919·2019-08-26 11:00