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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM