我們這次讓PhpStorm集成codeception單元測試框架
官網下載:https://codeception.com/builds
github源碼:https://github.com/Codeception/Codeception
我們下載最新的包:
https://codeception.com/releases/3.1.2/codecept.phar
在下載的當前目錄下,新建一個 codecept.bat ,將下面代碼保存進去:
@php "%~dp0codecept.phar" %*
就可以用命令行執行 codecept
命令了
codecept --version
省去輸入.bat的做法,在當前目錄 E:\PHPServer\phplibrary 下 新建一個 codecept 文件(無后綴名),將下面代碼拷貝進去保存即可。
#!/usr/bin/env sh # php /path/to/codecept.phar $* php `dirname $0`/codecept.phar $*
phpstorm添加代碼提示:
項目資源管理器下, External Libraries 右鍵 > Configure PHP Include Paths (F4)
添加 進存放 codecept.phar 包的路徑 添加進去即可
再次,配置 PhpStorm 的文件夾目錄設置:Settings > Directories
Mark as : Tests , Sources , Excluded , Resource Root 有這幾個設置選項
Tests : 把目錄設置為 測試單元目錄
我們右鍵根目錄下的 tests文件夾,點擊 New Folder,創建一個子文件夾 codecept_unit
點擊 codecept_unit 文件夾,右鍵菜單 設置為 Tests (作為單元測試目錄)
就會發現 codecept_unit 文件夾變成綠色了,意味着這個目錄就是測試單元目錄
生成codeception.yml配置文件:
默認的生成配置文件的命令是 codecept bootstrap
這個命令,官方的解釋是 This creates configuration file codeception.yml and tests directory and default test suites.
很明顯 tests 文件夾作為了codeception的默認單元測試目錄,
如果我們要更改為我們剛才編輯器設置的 tests/codecept_unit 才是單元測試目錄,咋辦
查閱了codecept.phar 內置的源碼:
要指定單元測試目錄,我們可以在命令后面直接加上指定目錄 tests/codecept_unit: (或者加上 --path 參數)
codecept bootstrap tests/codecept_unit
執行完后就會生成 tests文件夾里的文件 和 codeception.yml 配置文件了,
切換進 tests/codecept_unit 目錄下:
cd tests/codecept_unit
隨便創建個單元測試文件:
codecept generate:test unit Example
可以參考 :https://codeception.com/docs/05-UnitTests
執行測試:
codecept run
生成第一次驗收測試。驗收測試模仿行為的真實用戶訪問你的網站:
codecept generate:cest acceptance First
編輯 acceptance.suite.yml,原代碼:
# Codeception Test Suite Configuration # # Suite for acceptance tests. # Perform tests in browser using the WebDriver or PhpBrowser. # If you need both WebDriver and PHPBrowser tests - create a separate suite. actor: AcceptanceTester modules: enabled: - PhpBrowser: url: http://localhost/myapp - \Helper\Acceptance step_decorators: ~
修改成:
# Codeception Test Suite Configuration # # Suite for acceptance tests. # Perform tests in browser using the WebDriver or PhpBrowser. # If you need both WebDriver and PHPBrowser tests - create a separate suite. actor: AcceptanceTester modules: enabled: - PhpBrowser: url: http://www.thinkapp.com - \Helper\Acceptance step_decorators: ~
編輯 acceptance/FirstCest.php, 原代碼:
<?php class FirstCest { public function _before(AcceptanceTester $I) { } // tests public function tryToTest(AcceptanceTester $I) { } }
修改為:
<?php class FirstCest { public function _before(AcceptanceTester $I) { } // tests public function tryToTest(AcceptanceTester $I) { $I->amOnPage('/index/test/show'); $I->see('show_test'); } }
我們在 application/index/controller/ 下創建一個文件 Test.php
編寫Test.php文件代碼:
<?php # application/index/controller/Test.php文件 namespace app\index\controller; class Test { public function testNum($a, $b) { $c = $a * $b; return $c; } public function testError($a, $b) { $c = $a * $b; return $z; // 故意寫錯成 $z } public function show() { return 'show_test'; } }
最后執行命令 codecept run --steps 進行測試
codecept run --steps
進行api單元測試:
文檔參考:https://codeception.com/docs/10-APITesting
生成 api目錄 和 api.suite.yml配置文件:
codecept generate:suite api
編輯api.suite.yml配置文件,原代碼:
actor: ApiTester
modules:
enabled:
- \Helper\Api
修改為:
actor: ApiTester modules: enabled: - REST: url: http://www.lancms.com depends: PhpBrowser part: Json
刷新文件生成:
codecept build
創建api測試單元文件:
codecept generate:cest api CreateUser
大概幾秒后,就能看見tests/api目錄下 新生成了 CreateUserCest.php 文件:
編輯 CreateUserCest.php 文件,原代碼:
<?php class CreateUserCest { public function _before(ApiTester $I) { } // tests public function tryToTest(ApiTester $I) { } }
修改為:
<?php class CreateUserCest { public function _before(ApiTester $I) { } // tests public function tryToTest(ApiTester $I) { } // tests public function createUserViaAPI(\ApiTester $I) { # 發送請求api地址: http://www.lancms.com/api/test/demo # 請求參數: {"name":"test","email":"test@163.com"} # 響應結果: {"code":1,"msg":"success","data":[]} $I->haveHttpHeader('accept', 'application/json'); // $I->haveHttpHeader('Content-Type', 'application/x-www-form-urlencoded'); // 普通表單形式發送 $I->haveHttpHeader('Content-Type', 'application/json;'); // 發送JSON形式數據 $I->sendPOST('/api/test/demo', [ 'name' => 'test', 'email' => 'test@163.com', ]); $I->seeResponseCodeIs(\Codeception\Util\HttpCode::OK); // 200 $I->seeResponseCodeIs(200); $I->seeResponseIsJson(); $I->seeResponseContains('success'); $I->seeResponseContainsJson([ "code" => "1", ]); $I->seeResponseJsonMatchesJsonPath("$.data"); $I->seeResponseJsonMatchesXpath('//data'); $I->seeResponseMatchesJsonType([ 'code' => 'integer', 'msg' => 'string', 'data' => 'string|array|null', ]); } }
執行測試api測試單元:
codecept run api
執行結果:
說明請求成功了,被請求的項目后台記錄了請求信息:
PhpStorm編輯器配置 codeception單元測試:
工具欄,點擊 Edit Configurations..
彈出的 Run/Debug Configuare 窗口
點擊 +號 , 選擇 Codeception:
Use alternative configuration file前面的勾選選上,指定配置文件 codeception.xml :
彈出的Test Frameworks 窗口中 點擊 +號,選擇 Codeception Local
在 Path to Codeception executable 選擇 codecept.phar 文件路徑:
選擇剛才的單元測試Debug選項配置: test-codecept, 點擊 按鈕,就可以跑單元測試了:
也可以通過 Settings > Test Frameworks 查看剛才的IDE編輯器配置
PhpStorm 配置集成 ThinkPHP 5.1 單元測試 codeception 3.1.2
在 public目錄下 新建一個 cli.php 文件:
cli.php文件代碼:
<?php namespace think; define('ROOT_PATH', __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR); define('APP_PATH', ROOT_PATH . 'application' . DIRECTORY_SEPARATOR); define('ADDON_PATH', ROOT_PATH . 'addons' . DIRECTORY_SEPARATOR); // 加載基礎文件 require ROOT_PATH . '/thinkphp/base.php'; // 應用初始化 Container::get('app')->path(ROOT_PATH . 'application/')->initialize();
配置_bootstrap.php自動加載文件:
在 tests測試目錄下的 _bootstrap.php 填入下面的代碼后保存:
<?php // 下面這段,是觸發tp框架初始化用的...這樣就可以調用Model等信息了 require_once __DIR__ . '/../../../public/cli.php';
codeception.yml配置文件代碼參考:
codeception.yml文件的內容:
include: paths: tests: tests output: tests/_output data: tests/_data support: tests/_support envs: tests/_envs actor_suffix: Tester bootstrap: _bootstrap.php settings: colors: true memory_limit: 1024M extensions: enabled: - Codeception\Extension\RunFailed
命令行切換到 tests/codecept_unit/ 目錄下,執行 codecept build 命令,進行構建代碼:
然后可以執行 codecept run 來測試一下單元測試是否可以正常運行:
還差一步,再配置一下編輯器的Debug配置,就能大功完成了:
最后 工具欄Debug下拉選項 選擇 test-codecept , 然后點 運行,就能看到 codecept 單元測試結果了:
測試ThinkPHP項目里的代碼:
在 application/index/controller/ 目錄下,新建一個 Test.php :
文件 Test.php 里的代碼:
<?php # application/index/controller/Test.php文件 namespace app\index\controller; class Test { public function testNum($a, $b) { $c = $a * $b; return $c; } public function testError($a, $b) { $c = $a * $b; return $z; // 故意寫錯成 $z } public function show() { return 'show_test'; } }
在 單元測試 tests/unit 目錄下的一個單元測試文件 ExampleTest.php 編寫測試代碼:
ExampleTest.php 文件代碼:
<?php class ExampleTest extends Codeception\Test\Unit { /** * @var \UnitTester */ protected $tester; protected function _before() { } protected function _after() { } // tests public function testSomeFeature() { $this->assertTrue(true); $app = new \app\index\controller\Test(); // 假設 index/test/show 方法返回的字符串中包含 "show_test" $this->assertContains('show_test666', $app->show()); } }
點擊Debug運行按鈕 進行單元測試:
測試結果看出來: 測試不通過。
因為項目地址 http://www.thinkapp.com/index/test/show 訪問地址返回的結果是字符串 show_test , 沒有包含 show_test666 字符串。
我們命令行校驗一下,上面編輯器的Debug結果是不是正確:
在命令行模式,切換到 codecept_unit 目錄下,執行命令 codecept build 進行codeception測試代碼構建 :
再次執行 codecept run 命令進行單元測試:
測試結果跟PhpStorm的Debug調試工具測試的一致 ,也是測試不通過。
可以比對一下這兩種測試方式,可以明顯看出,PhpStorm的Debug調試工具測試結果更直觀,更方便。不需要命令行來先執行 codecept build 后再來執行 codecept run 等一系列命令,
只需要一個按鈕 就可完成一次測試
------------------------------------------------------------------------
編輯器附帶其他操作:
創建單元測試文件 1、右鍵 Go To | Test, 可以類似這樣做:
單元測試文件(如果有已存在的該單元測試文件可直接選擇)
4、生成后的測試文件
運行測試文件 1、點擊方法左側的綠色箭頭選擇Run或者debug,選擇對應的測試框架(Codeception)
最后編寫測試用例,然后調試測試。~~
錯誤報告:
默認情況下Codeception使用的是E_ALL & ~E_STRICT & ~E_DEPRECATED錯誤報告級別。 在功能測試中您可能需要自定義框架的錯誤級別,該錯誤報告級別可以設置在套件配置中:
actor: UnitTester modules: enabled: - Asserts - \Helper\Unit error_level: "E_ALL & ~E_STRICT & ~E_DEPRECATED"
error_level可以設置在 codeception.yml文件中。
更改默認的cmd客戶端,比如更改成 Git Bash (路徑:D:\Program Files\Git\bin\sh.exe)
修改: Settings > Tools > Terminal > Application settings > Shell path, 輸入 D:\Program Files\Git\bin\sh.exe
===================================================================================================
附:
Codeception\Util\Autoload
通過class后綴自動加載class,提供的方法有
public static load($class) public static matches($class, $namespace, $suffix) public static register($namespace, $suffix, $path) public static registerSuffix($suffix, $path)
如
\Codeception\Util\Autoload::registerSuffix('Page', __DIR__.DIRECTORY_SEPARATOR.'_pages');
Console
GenerateSuite:要求的參數有:suite的名稱+actor名稱
codecept generate:suite api # api + ApiTester
codecept generate:suite integration CodeTester # integration + CodeTester
codecept generate:suite frontend FrontTester # frontend + FrontTester
Console:在執行時執行測試命令 codecept console acceptance
GenerateGroup:codecept generate:groupobject AdminGenerateCept
codecept generate:cept suite Login
codecept generate:cept suite subdir/subdir/testnameCept.php
codecept generate:cept suite LoginCept -c path/to/project
SelfUpdate:自動更新 codecept self-update
GenerateTest:生成單元測試
codecept generate:test unit User codecept generate:test unit "App\User"
Build:依據suite.yml文件生成actor類
codecept build
codecept build path/to/project
GenerateHelper:生成空的Helper類
Bootstrap:生成默認的config,文件夾等
GeneratePhpUnit:生成GeneratePhpUnit testcase
codecept generate:phpunit unit UserTest codecept generate:phpunit unit User codecept generate:phpunit unit "App\User
GenerateScenarios:為testcase生成文本場景
codecept generate:scenarios acceptance - for all acceptance tests codecept generate:scenarios acceptance --format html - in html format codecept generate:scenarios acceptance --path doc - generate scenarios to doc dir
GenerateStepObject:生成stepobject類
codecept generate:step acceptance AdminSteps
codecept generate:step acceptance UserSteps --silent - skip action questions
Clean:清除log
codecept clean
codecept clean -c path/to/project
GenerateCest:生成測試類文件
codecept generate:cest suite Login codecept generate:cest suite subdir/subdir/testnameCest.php codecept generate:cest suite LoginCest -c path/to/project codecept generate:cest "App\Login"
GeneratePageObject:生成page類
codecept generate:page Login
codecept generate:page Registration
codecept generate:page acceptance Login
Configuration
...
Codeception\Util\Fixtures
用於存儲數據,應用於Cests/Tests
Fixtures::add('user1', ['name' => 'davert']); Fixtures::get('user1');
可以用的方法有
public static add($name, $data) public static cleanup() public static get($name)
Shorthand Functions
提供一些常用的方法
codecept_debug($data)
codecept_output_dir()
codecept_root_dir()
codecept_data_dir()
Codeception\Util\Locator
為CSS 和 XPath locators提供一些方法
combine:public static combine($selector1, $selector2)
<?php use \Codeception\Util\Locator; //下面這句將在h1,h2,h3這三種tag中搜索文本“Title” $I->see('Title', Locator::combine('h1','h2','h3')); ?>
也可以這樣用:
<?php use \Codeception\Util\Locator; $I->fillField(Locator::combine('form input[type=text]','//form/textarea[2]'), 'qwerty'); ?>
find: 通過元素屬性來查找元素 public static find($element, array $attributes)
href:用給定的url來匹配一個元素 public static href($url)
<?php use \Codeception\Util\Locator; $I->see('Log In', Locator::href('/login.php')); ?>
iscss:public static isCSS($selector)
isID:檢查元素定位是不是通過ID來實現的 public static isID($id)
isXpath:判斷元素定位是不是xpathpublic static isXPath($locator)
option:匹配一個option元素 public static option($value)
tabIndex:通過tabindex匹配元素public static tabIndex($index)
Codeception\Util\Stub
...
Codeception\Util\XmlBuilder
...
請查看我的另兩篇文章更多詳細介紹codeception語法分析:
codeception單元測試語法介紹 ( https://www.cnblogs.com/phplog/articles/12076760.html )
codeception測試使用框架模塊Module ( https://www.cnblogs.com/phplog/articles/12078663.html )
相關文檔:
上面單元測試實例源碼已經放到Github上了: https://github.com/lajox/thinkphp-codeception-example
關於斷言的文檔地址: https://phpunit.readthedocs.io/zh_CN/latest/
官方文檔: https://codeception.com/quickstart
官方文檔: https://codeception.com/docs/
官方文檔:https://github.com/Codeception/codeception.github.com
英文文檔: https://www.w3cschool.cn/doc_codeception/
交流提問: http://phptest.club/c/codeception
中文文檔: http://www.kkh86.com/it/codeception/guide-leaning-depends.html
中文文檔: https://www.cloudxns.net/AccountSupport/index/u/950.html
編輯器配置參考: https://www.w3cschool.cn/intellij_idea_doc/using_codeception_framework.html