资讯专栏INFORMATION COLUMN

使用Codeception进行Yii2的单元测试(二)测试用例(测试model类为例)

chenjiang3 / 3166人阅读

摘要:但是,我们没有忘记,这个测试用例本意是要对这个类做单元测试的。三对指定的类进行单元测试首先我的的类如下我们要在中去对上述的类做测试,第一步做的就是要能加载到该类。

一、生成测试文件

比如说我的models有一个需要测试得AdminUser类,我需要生成相应得测试文件,那么我们可以使用下面得命令生成相应得测试文件

vendorincodecept generate:test unit modelsAdiminUser

执行结果如下

二、测试用例的编写

我们生成的测试用例是这个样子的(AdiminUserTest.php):

namespace models;

/**
 * Class AdiminUserTest by gy
 * @package models
 */
class AdiminUserTest extends CodeceptionTestUnit
{
    /**
     * @var UnitTester
     */
    protected $tester;
    
    protected function _before()
    {
    }

    protected function _after()
    {
    }

    // tests
    public function testSomeFeature()
    {

    }
}


现在我们来修改这个文件,使它能完成简单的处理。这里的assertTrue方法,是用来做真假断言用的。当然还有很多其他种类的断言,如:assertInternalType;assertEquals;assertInstanceOf……可以查看更多断言详细

    



 namespace models;

/**
 * Class AdiminUserTest by gy
 * @package models
 */

class AdiminUserTest extends CodeceptionTestUnit
{
    /**
     * @var UnitTester
     */
    protected $tester;
    
    protected function _before()
    {
    }

    protected function _after()
    {
    }

    // tests
    public function testSomeFeature()
    {
        $this->assertTrue(1==1);
    }

    public function testFunction1()
    {
        $this->assertTrue(3 > 1);
    }
    //这个是明显错误
    public function testFunction2()
    {
        $this->assertTrue(3 < 1);
    }

}

现在我们可以使用命令执行我们的测试用例了:

vendorincodecept run unit modelsAdiminUserTest

执行结果如下所示(3个成功,1个失败),testFunction2有明显错误,改正以后会没有失败数量的

好了现在我们已经学会了简单的断言。但是,我们没有忘记,这个测试用例本意是要对AdminUser这个model类做单元测试的。接下来我们要真正的步入正题了。

三、对指定的类进行单元测试

首先我的AdminUser的类如下(AdminUser.php):

namespace appmodels;

class AdminUser extends yiiaseBaseObject implements yiiwebIdentityInterface
{
    public $id;
    public $username;
    public $password;
    public $authKey;
    public $accessToken;

    private static $users = [
        "100" => [
            "id" => "100",
            "username" => "admin",
            "password" => "admin",
            "authKey" => "test100key",
            "accessToken" => "100-token",
        ],
        "101" => [
            "id" => "101",
            "username" => "demo",
            "password" => "demo",
            "authKey" => "test101key",
            "accessToken" => "101-token",
        ],
    ];


    /**
     * {@inheritdoc}
     */
    public static function findIdentity($id)
    {
        return isset(self::$users[$id]) ? new static(self::$users[$id]) : null;
    }

    /**
     * {@inheritdoc}
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
        foreach (self::$users as $user) {
            if ($user["accessToken"] === $token) {
                return new static($user);
            }
        }

        return null;
    }

    /**
     * Finds user by username
     *
     * @param string $username
     * @return static|null
     */
    public static function findByUsername($username)
    {
        foreach (self::$users as $user) {
            if (strcasecmp($user["username"], $username) === 0) {
                return new static($user);
            }
        }

        return null;
    }

    /**
     * {@inheritdoc}
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * {@inheritdoc}
     */
    public function getAuthKey()
    {
        return $this->authKey;
    }

    /**
     * {@inheritdoc}
     */
    public function validateAuthKey($authKey)
    {
        return $this->authKey === $authKey;
    }

    /**
     * Validates password
     *
     * @param string $password password to validate
     * @return bool if password provided is valid for current user
     */
    public function validatePassword($password)
    {
        return $this->password === $password;
    }
}

我们要在AdiminUserTest中去对上述的类做测试,第一步做的就是要能加载到该类。我们知道,现在大部分框架都是使用psr-4规则的/vendor/autoload.php来完成自动加载的,当然yii2和它的codeception也是一样的。这边是多说了一些,等我们后续遇到这个问题了,再详细说。

namespace models;

use appmodelsAdminUser;

/**
 * Class AdiminUserTest by gy
 * @package models
 */
class AdiminUserTest extends CodeceptionTestUnit
{
    /**
     * @var UnitTester
     */
    protected $tester;
    
    protected function _before()
    {
    }

    protected function _after()
    {
    }

    // tests
    public function testFindUserById()
    {
        expect_that($user = AdminUser::findIdentity(100));
        expect($user->username)->equals("admin");

        expect_not(AdminUser::findIdentity(999));
    }

    public function testFindUserByAccessToken()
    {
        expect_that($user = AdminUser::findIdentityByAccessToken("100-token"));
        expect($user->username)->equals("admin");

        expect_not(AdminUser::findIdentityByAccessToken("non-existing"));
    }

    public function testFindUserByUsername()
    {
        expect_that($user = AdminUser::findByUsername("admin"));
        expect_not(AdminUser::findByUsername("not-admin"));
    }

    /**
     * @depends testFindUserByUsername
     */
    public function testValidateUser($user)
    {
        $user = AdminUser::findByUsername("admin");
        expect_that($user->validateAuthKey("test100key"));
        expect_not($user->validateAuthKey("test102key"));

        expect_that($user->validatePassword("admin"));
        expect_not($user->validatePassword("123456"));
    }

}

expect_that: 假设为true
expect_not: 假设为false
和我们用assertFalse和assertTrue意义是一样的

好了,我们来执行命令吧。看看现在的会不会如我们设想的一般。

vendorincodecept run unit modelsAdiminUserTest

4个测试方法,12个断言都没有问题,执行成功。

总结,至此我们的小小目标基本达成,生成测试文件,测试相关单元的目标基本都可以完成了。当然,我们还是有一些问题亟待解决的,比如说,我们用来测试的数据还是models的静态变量(不够真实);我们有100个model类难道要一个个手动生成测试类;如果我们项目文件结构有所改变的话也会会遇到一些问题。不过没关系,我们再接下来的几篇文章里会介绍相关的内容。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31987.html

相关文章

  • 使用Codeception进行Yii2单元测试(一)安装以及简介篇

    摘要:一简介作为工程师,我们很可能遇到一些有必要的进行单元测试的场景。本系列文章就来介绍下,在框架下,如何使用进行单元测试。 一、简介 作为php工程师,我们很可能遇到一些有必要的进行单元测试的场景。本系列文章就来介绍下,在Yii2框架下,如何使用Codeception进行单元测试。本篇就首先介绍Yii2,以及Codeception的安装。 二、Yii2和codeception安装 安装Yi...

    dabai 评论0 收藏0
  • codeception (7) 危险Yii2-codeception

    摘要:前言忽然想起之前用时让我胆战心惊的那刻,那天我在测试服务器上研究着,忽然同事大叫,怎么用户表被清空了,我当时觉得跟自己没关,但想起我今天刚把的配置更改了,链接到了测试数据库上,并且运行过里面自带的登陆案例,但运行结果是失败的,我觉得很有可能 前言 忽然想起之前用codecetion时让我胆战心惊的那刻,那天我在测试服务器上研究着codeception,忽然同事大叫,怎么用户表被清空了,...

    ZHAO_ 评论0 收藏0
  • YII2.0 codeception 一点经验

    摘要:测试驱动的安装我就不写了,这里有详细说明。然后在命令提示符里执行命令重构一下记住测试驱动里代码发生改变都需要重构一下不然会报错。在执行命令进行测试执行了个测试驱动个断言全部成功以上只是我的一些经验代码不一定对希望对大家有帮助 测试驱动 codeception 的安装我就不写了,http://www.kkh86.com/it/codec... 这里有详细说明。 我就说一下我的测试。 首先...

    chaosx110 评论0 收藏0
  • Yii修行之路 - Extension 扩展

    摘要:运行来安装指定的扩展。这更便于用户辨别是否是的扩展。当用户运行安装一个扩展时,文件会被自动更新使之包含新扩展的信息。上述代码表明该扩展依赖于包。例如,上述的条目声明将对应于别名。为达到这个目的,你应当在公开发布前做测试。 简述 扩展是专门设计的在 Yii 应用中随时可拿来使用的, 并可重发布的软件包。 基础 例如, yiisoft/yii2-debug 扩展在你的应用的每个页面底部添加...

    bovenson 评论0 收藏0
  • YII2通过composer优化vendor

    摘要:本文讨论通过工具安装框架并优化过程中遇到的问题,约定读者对基本原理有一定了解,并且有安装框架的实际经验。这个命令是优化包的关键一环。命令要谨慎使用。 本文讨论通过composer工具安装Yii2框架并优化Vendor过程中遇到的问题,约定读者对composer基本原理有一定了解,并且有安装Yii2框架的实际经验。 在Yii2社区里经常会遇到一类问题,那就是 安装完官方推荐的版本后1 ...

    dcr309duan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<