phpstorm集成codeception单元测试
我们这次让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