logo头像

Hello World

Codeception(三)

前言

前两篇文章介绍了安装和单元测试。

这篇文章我们来介绍Fixture概念和功能测试、验收测试。

功能测试和验收测试在Codeception中,部分代码和测试流程很相似,所以我们也来说一下功能测试和验收测试的区别。

Fixture概念

Fixtures 是测试中非常重要的一部分。他们的主要目的是建立一个固定/已知的环境状态以确保测试可重复并且按照预期方式运行。
Yii 提供一个简单可用的 Fixure 框架 允许你精确的定义你的 Fixtures 。

Yii 的 Fixture 框架的核心概念称之为 fixture object 。
一个 Fixture object代表一个测试环境的某个特定方面,它是 yii\test\Fixture 或者其子类的实例。 比如,你可以使用 UserFixture 来确保用户DB表包含固定的数据。 你在运行一个测试之前加载一个或者多个 fixture object,并在结束后卸载他们。


如果使用该功能,记的创建自己的测试DB,并且在test-local里配置DB。该功能在卸载时,会清空数据库

官方文档:http://www.yiiframework.com/doc-2.0/guide-test-fixtures.html

功能测试和验收测试的区别

  • 功能测试 Functional Testing

    功能测试主要用于测试我们是否创建了正确的产品,逐项测试各个功能。
    对于这种类型的测试,要涵盖所有可能情景的测试用例,即使这种情况在“现实环境”中不太可能存在。当进行这种类型的测试时,我们的目标是最大的代码覆盖率。

  • 验收测试 Acceptance Testing

    验收测试是部署软件之前的最后一个测试操作。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。
    这部分测试通常是与客户或内部测试人员合作完成的。
    对于这种类型的测试,我们使用的测试用例涵盖了我们期望软件使用的典型场景。
    该测试主要测试以下几个点

    • 可靠性,可用性:压力测试
    • 扩展性:负载测试进行验证。
    • 可用性:界面是否符合用户习惯等
    • 安全性:代码审计、入侵测试
    • 可维护性:通过演示如何提供软件更新/补丁来验证。
    • 可配置性:通过证明客户如何修改系统配置来满足他们的需求来进行验证。

功能测试

  • 使用模版创建功能测试
    同样的,我们使用模板来创建一个功能测试。

    1
    codecept g:cest functional StudentCest

    创建好的文件会在tests/functional下.内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
    namespace backend\tests;
    use backend\tests\FunctionalTester;

    class StudentCest
    {
    public function _before(FunctionalTester $I)
    {
    }

    public function _after(FunctionalTester $I)
    {
    }

    // tests
    public function tryToTest(FunctionalTester $I)
    {

    }
    }

    可以看到内容和之前创建的Test模板很像。

    不同的是,这里的方法多了一个参数functionalTester。

    其实这个参数就是我们在Codeception(二)里面所说的actor概念。传送门:点我跳转

  • 配置
    比如我们这里对登录功能做测试。需要使用到数据库,所以我们首先应配置数据库。

    修改config/test-local.php,如果我们项目中使用了多个数据库,也要配置多个db。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     <?php
    return yii\helpers\ArrayHelper::merge(
    require __DIR__ . '/../../common/config/test-local.php',
    require __DIR__ . '/main.php',
    require __DIR__ . '/main-local.php',
    require __DIR__ . '/test.php',
    [
    'components' => [
    'db' => [
    'dsn' => 'mysql:host=localhost;dbname=yii2-test',
    'username' => '',
    'password' => '',
    ],
    'db2' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=yii2-test2',
    'username' => '',
    'password' => '',
    'charset' => 'utf8',
    ],
    ],
    ]
    );
  • 定义Fixture
    定义Fixture,用于指定账号密码登录
    修改刚才模板生成的文件,加入以下方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public function _fixtures()
    {
    return [
    'user' => [
    'class' => UserFixture::className(),
    'dataFile' => codecept_data_dir() . 'login_data.php',
    ]
    ];
    }

    注:该方法会在Yii2::_before()里自动调用

    然后我们需要在tests/_data文件夹下写入登录数据

    /tests/_data/login_data.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    return [
    [
    'username' => 'erau',
    'auth_key' => 'tUu1qHcde0diwUol3xeI-18MuHkkprQI',
    // password_0
    'password_hash' => '$2y$13$nJ1WDlBaGcbCdbNC5.5l4.sgy.OMEKCqtDQOdQ2OWpgiKRWYyzzne',
    'password_reset_token' => 'RkD_Jw0_8HEedzLk7MM-ZKEFfYR7VbMr_1392559490',

    'created_at' => '1392559490',
    'updated_at' => '1392559490',
    'email' => 'sfriesen@jenkins.info',
    ],
    ];
  • 编写测试方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
      public function loginUser(FunctionalTester $I)
    {
    $I->amOnRoute('site/login');
    $I->fillField('LoginForm[username]', 'erau');
    $I->fillField('LoginForm[password]', 'password_0');
    $I->click('login-button');
    $I->see('退出 (erau)');
    $I->dontSeeLink('登录');
    }
  • 运行功能测试

    1
    codecept run

一些其它说明

  1. _before的使用

    比如我们在做登录功能测试时,不仅要测试正确的账号密码是否可以登录,还要考虑用户名密码为空时,是否会显示用户名密码不能为空这样的提示。
    也要测试错误的密码是否会提示密码错误。这就需要我们每次测试之前跳转到登录页面。

    因此可以写如下代码,每次测试时,恢复路由。

    1
    2
    3
    4
    public function _before(FunctionalTester $I)
    {
    $I->amOnRoute('site/login');
    }

验收测试

验收测试编写流程和功能测试大体相同,不再赘述。

上一篇