Support

Home > Support > X community > Technical

【Codeception中文文档】第二章 Codeception 入门

祥子 2015-12-15

入门指南

让我们来看看Codeception的架构,我们假定你已经安装好了,并且用php codeception.phar bootstrap初始化了你第一个测试套件,Codeception 将会生成unit, functional, 和 acceptance三个部分,这些已经在前一章做了描述,在你的 /test 文件夹你会看到有三个配置文件和三个名称与之对应的目录。测试套件是一组有一个共同目的的测试组合。

Actors

Actiors是Codeception的一个重要概念,用来表示测试一个人行为。我们有一个UnitTester来执行功能测试代码;我们还有一个FunctionalTester,负责质量测试,采用内部的知识来把应用程序当作一个整体来测试;还有一个AcceptanceTester,以用户方式通过我们提供的界面检查应用程序的工作。

Actor类不需要写,而是通过套件生成。 Actor类的方法都是通过Codeception模块生成的,每个模块为不同的测试目的提供预定义的动作,并且它们可以被组合以适应测试环境,Codeception尝试通过这些模块解决可能存在的90%的问题,所以你不必另起炉灶。我们认为你可以花更多的时间写测试和支撑代码以使得这些测试得以运行。默认情况下AcceptanceTester依赖于PhpBrowser模块,它们在tests/acceptance.suite.yml配置文件中:

class_name: AcceptanceTester
modules:
    enabled:
        - PhpBrowser:
            url: http://localhost/myapp/
        - HelperAcceptance

在这个配置文件里你可以根据你的需求启用/禁用重新配置模块。 你改变配置的时候actor类会自动创建,如果Actor类没有如你期望创建或更新,那么你可以手动执行 build 命令生成它们:

$ php codecept.phar build

写一个场景例子

默认测试会被写成叙述式的场景,创建的场景的PHP文件必须以Cept 后缀命名。

现在我们创建一个文件 tests/acceptance/SigninCept.php

我们可以通过一下命令:

$ php codecept.phar generate:cept acceptance Signin

一个场景总是从Actor类初始化开始,接着,在场景中输入类似以 $I-> 接着从自动完成列表里选择一个合适的行为。

<?php
$I = new AcceptanceTester($scenario);
?>

将设我们有一个'login'页面,让我们登录到我们的页面通过用户名密码进行身份验证,然后我们到一个有Hello, %username%这样文本的页面,让我们来看看在Codeception里怎么写这个场景。

<?php
$I = new AcceptanceTester($scenario);
$I->wantTo('log in as regular user');
$I->amOnPage('/login');
$I->fillField('Username','davert');
$I->fillField('Password','qwerty');
$I->click('Login');
$I->see('Hello, davert');
?>

在执行这个测试之前,我们应该确保网站正在本地服务器上运行着。我们打开tests/acceptance.suite.yml配置文件将URL参数替换为你的web应用程序的访问URL:

class_name: AcceptanceTester
modules:
    enabled:
        - PhpBrowser:
            url: 'http://myappurl.local'
        - HelperAcceptance

配置好URL后用 run 命令运行测试:

$ php codecept.phar run

这里我们会看到类似的输出:

Acceptance Tests (1) -------------------------------
Trying log in as regular user (SigninCept.php)   Ok
----------------------------------------------------

Functional Tests (0) -------------------------------
----------------------------------------------------

Unit Tests (0) -------------------------------------
----------------------------------------------------

Time: 1 second, Memory: 21.00Mb

OK (1 test, 1 assertions)

让我们获取详细的输出:

$ php codecept.phar run acceptance --steps

我们应该看到一步一步的行为报告。

Acceptance Tests (1) -------------------------------
Trying to log in as regular user (SigninCept.php)
Scenario:
* I am on page "/login"
* I fill field "Username" "davert"
* I fill field "Password" "qwerty"
* I click "Login"
* I see "Hello, davert"
  OK
----------------------------------------------------  

Time: 0 seconds, Memory: 21.00Mb

OK (1 test, 1 assertions)

这个简单的测试可以扩展到一个完整的场景使用场景。 所以,通过模拟用户的行为,您可以测试您的任何网站。 接下来看一个例子。

Bootstrap

每一个套件都有他们自己的bootstrap文件,命名为 _bootstrap.php,测试套件执行前它会执行。 tests 目录下的是全局bootstrap文件,它可以用来include附加文件。

Cept, Cest 和 测试格式

Codeception支持3种测试格式,之前讲过的基于场景的Cept格式,Codeception也可以执行PHPUnit 单元测试测试文件和Cest格式。

Cest是OOP设计结合了场景驱动测试,如果你想组合一些测试场景到一个中你应该考虑使用Cest格式,下面的例子我们用一个单独的文件测试CRUD操作,但其中有几个测试,每次操作一个。

<?php
class PageCrudCest
{
    function _before(AcceptanceTester $I)
    {
        // will be executed at the beginning of each test
        $I->amOnPage('/');
    }

    function createPage(AcceptanceTester $I)
    {
       // todo: write test
    }

    function viewPage(AcceptanceTester $I)
    {
       // todo: write test
    }    

    function updatePage(AcceptanceTester $I)
    {
        // todo: write test
    }

    function deletePage(AcceptanceTester $I)
    {
       // todo: write test
    }
}
?>

这样的Cest文件可以通过运行生成器命令创建:

$ php codecept.phar generate:cest acceptance PageCrud

第七章有更多关于Cest 格式 的高级测试场景。

配置

Codeception有一个全局配置文件codeception.yml,每个套件也都与一个配置文件。我们也支持 .dist 配置文件。加入你一个项目有几个开发者将共享设置放在codeception.dist.yml,每一个人的配置放在codeception.yml。套件配置也是同样的,例如,unit.suite.yml 会合并unit.suite.dist.yml

运行测试

通过运行 run 命令开始运行测试。

$ php codecept.phar run

通过第一个参数可以运行一个套件。

$ php codecept.phar run acceptance

指定第二个参数可以运行一个测试,从套件目录指定一个本来路径。

$ php codecept.phar run acceptance SigninCept.php

另外你还可以提供一个完整的测试文件路径:

$ php codecept.phar run tests/acceptance/SigninCept.php

你可以从一个测试类(Cest or 单元测试格式)里执行一个测试

$ php codecept.phar run tests/acceptance/SignInCest.php:anonymousLogin

你还可以提供一个目录路径:

$ php codecept.phar run tests/acceptance/backend

这是执行 tests/acceptance/backend 目录里的所有测试

要执行一组存储不在同目录的测试时,你可以用groups(《第七章 高级用法》中将会介绍)组织它们

测试报告

你可以通过 --xml 选项生成JUnit XML,通过--html输出HTML报告。

$ php codecept.phar run --steps --xml --html

这个命令将执行所有套件的测试,逐步显示,并且构建将HTML和XML报告存储到tests/_output/目录。

了解所有可用的选项运行这个命令:

$ php codecept.phar help run

调试

获取详细的输出,执行是加上--debug 选项,在测试中可以用那个 codecept_debug方法打印任何信息。

生成器

有很多有用的Codeception命令:

  • generate:cept suite filename - Generates a sample Cept scenario
  • generate:cest suite filename - Generates a sample Cest test
  • generate:test suite filename - Generates a sample PHPUnit Test with Codeception hooks
  • generate:phpunit suite filename - Generates a classic PHPUnit Test
  • generate:suite suite actor - Generates a new suite with the given Actor class name
  • generate:scenarios suite - Generates text files containing scenarios from tests
  • generate:helper filename - Generates a sample Helper File
  • generate:pageobject suite filename - Generates a sample Page object
  • generate:stepobject suite filename - Generates a sample Step object
  • generate:environment env - Generates a sample Environment configuration
  • generate:groupobject group - Generates a sample Group Extension

结论

我们看到了Codeception的结构,大部分你需要的东西都可以通过bootstrap 命令生成,在你回顾了基本概念和配置之后,你可以写你的第一个测试场景了。

1 Reply(ies)

泰迪熊 2015-12-16

现在X社区上这种技术分享类的帖子越来越多了。
希望能有更多的人来分享,当然建站类的就更好了。
小白不懂得太多了,要学习学习

Please and then reply

I want to say

Back to top
WeChat

Scan with WeChat, follow CloudXNS official account

>
QQ
Sina Microblog