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, 可以类似这样做:

 单元测试文件(如果有已存在的该单元测试文件可直接选择)

3、生成的测试文件的文件名、路径,选择需要测试的方法

 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

 

posted @ 2019-12-18 10:09  php学习笔记  阅读(1315)  评论(0编辑  收藏  举报