代码质量之codeception(一)

  • Post author:
  • Post category:其他




codeception 简介

Codeception 的主要概念之一是将测试表示为一个人的行为。我们有一个 UnitTester,他执行函数并测试代码;有一个 FunctionalTester,一个合格的测试员,他测试整个应用程序,并了解其内部结构;还有一个ApiTester,他能够测试应用程序的接口,断言接口返回数据;最后,我们有一个 AcceptanceTester,一个通过我们提供的界面使用我们的应用程序的用户;



UnitTester 单元测试

Codeception 是在PHPUnit之上创建的。如果有使用 PHPUnit 编写单元测试的经验,则可以继续这样做。Codeception 执行标准的 PHPUnit 测试没有问题,但是,Codeception 本身构建了一些执行的动作作为unitTester 来反应测试角色,整个过程非常直观;比如继承了php unit 的assertEquals,同事又封装了see*,dontsee*,grab 等方法

    public function testSavingUser(\UnitTester $I)
    {
        $user = new Users();
        $user->setName('Miles');
        $user->setSurname('Davis');
        $user->save();
        $I->assertEquals('Miles Davis', $user->getFullName());
        $I->seeRecord('users', [
            'name' => 'Miles',
            'surname' => 'Davis'
        ]);
    }

执行测试命令

$ php vendor/bin/codecept run unit --steps

控制台输出

UserTestCest: Test saving user
Signature: models\UserTestCest:testSavingUser
Test: tests/unit/models/UserTestCest.php:testSavingUser
Scenario --
 I assert equals "Miles Davis","Miles Davis"
 I see record "app\models\Users",{"name":"Miles","surname":"Davis"}
 PASSED 
 



FunctionalTester 功能测试

功能测试可以模拟返回 HTML 响应的 Web 请求(



G

E

T

_GET和

















G


















E


T








_POST变量)。在测试中,您可以对响应进行断言,并且可以检查数据是否成功存储在数据库中;

功能测试可以让我们的测试功能运行的更快,但是也能详细的展现出异常;

$I->amOnPage('/');
$I->click('Sign Up');
$I->submitForm('#signup', ['username' => 'MilesDavis', 'email' => 'miles@davis.com']);
$I->see('Thank you for Signing Up!');
$I->seeEmailSent('miles@davis.com', 'Thank you for registration');
$I->seeInDatabase('users', ['email' => 'miles@davis.com']);

以上是官网的demo, 不管是amOnPage 还是amOnPage 都是指向前端的页面,对于分离的项目可能就不是很合适了;



ApiTester 接口测试

相比于功能测试,接口测试可能更适合前后端分离的项目,ApiTester的提交不设计前段页面的表单,可以直接通过post,get方法发送接口请求

Codeception 允许SOAP 和 REST 两种标准测试 Web 服务。

REST Web 服务是通过 HTTP 使用标准方法访问的:GET、POST、PUT、DELETE。它们允许用户从服务接收和操作实体。

SOAP Web 服务通常更复杂。您将需要配置了 SOAP 支持的PHP 。还需要具备良好的 XML 知识。SOAP模块使用特殊格式的 POST 请求连接到 WSDL Web 服务

访问 WebService 需要一个 HTTP 客户端,因此要使用它,您需要设置模块PhpBrowser或yii,laravel等框架模块之一

通常都是设置框架模块

配置模块api.suite.yml:

actor: ApiTester
modules:
    enabled:
        - REST:
              url: /api/
              depends: Yii2

eg:登录验证并访问首页


	private $bearer;
    private $tester;

	//前置操作   登录用户
    public function _before(\ApiTester $I)
    {
        $I->sendPost('/rest/login', [
            'username' => 'admin',
            'password' => 'admin'
        ]);
        $token = $I->grabDataFromResponseByJsonPath('$.data.token');
        return 'Bearer ' . $token[0];
    }

    // tests
    public function testIndex()
    {
        $this->tester->haveHttpHeader('Content-Type', 'application/json');
        $this->tester->haveHttpHeader('Authorization', $this->bearer);
        $this->tester->sendGet('/index/index');
        $this->tester->seeResponseCodeIs(HttpCode::OK);
    }
    



AcceptanceTester 验收测试

通过打开浏览器、访问站点、单击链接、填写表格以及实际查看网页上的内容。他们不需要知道编程语言、框架、数据库、网络服务器,或者应用程序为什么会(或没有)按预期运行;

配置模块acceptance.suite.yml:

# acceptance.suite.yml
actor: AcceptanceTester
modules:
    enabled:
        - PhpBrowser:
            url: http://www.example.com/
        - \Helper\Acceptance



总结

1.codeception 对于开发来说可能需要关注的是UnitTester,ApiTester.因为前后端分离是主流思想

2.codeception自带的模块确实省略像phpbrowser 的安装配置

3.codeception封装方法很拟人化,简单又方便,即BDD的通用语言是一种近乎自然语言的描述软件的形式

UnitTester FunctionalTester ApiTester AcceptanceTester
测试范围 单个 PHP 类 PHP 框架(路由、控制器等) 接口 浏览器中的页面(Chrome、Firefox 或PhpBrowser)
测试计算机需要访问项目的 PHP 文件 Y Y depends: PhpBrowser 不需要 N
需要网络服务器 N N depends: PhpBrowser 需要 Y
JavaScript N N N Y
需要额外的软件 N N N Selenium 用于浏览器测试
速度 相对快
配置文件 unit.suite.yml functional.suite.yml api.suite.yml acceptance.suite.yml

在这里插入图片描述



版权声明:本文为qq_39941141原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。