`

Yii2框架下,使用Codeception进行单元测试

阅读更多

前言:

Yii2是一款非常优秀的php框架,Yii2的官方发行版整合了Codeception测试框架。在使用Yii2框架的项目中,我们可以非常方便地利用Codeception进行单元测试、功能测试和验收测试。现在我们就利用Codeception在Yii2下实现简单的单元测试。

 

在进行单元测试前,需要做一些准备工作。

 

1. 首先确保你的机器安装了Composer,否则请自行安装,这是安装教程

 

2. 打开命令行,并切换目录到项目根目录,分别运行如下命令。

composer require "fxp/composer-asset-plugin:*"

composer require "codeception/codeception=*"

composer require "codeception/specify=*"

composer require "codeception/verify=*"

 

3. 依赖包安装好了过后,切换到tests目录下(以后的所有的命令都将在tests目录下运行),运行命令(博主所使用的是windows环境,linux同理)当然你也可以把该路径"C:\www\yii\vendor\bin\codecept"加到系统PATH里,这样你就可以直接输入"codecept build"而不用加上路径前缀了。

..\vendor\bin\codecept build

 

注:由于Yii2框架已经整合了Codeception,所以不需要运行"..\vendor\bin\codecept bootstrap"命令。

 

4. 配置tests/codeception/_bootstrap.php文件(在该文件末尾加上下面两行代码)

$config = require(__DIR__ . '/../../config/console.php');


$application = new yii\console\Application($config);

 

5. 博主在"task"数据库下,创建一个名为"department"的表,并插入如下数据。接下来,我们所有的测试都将围绕着这张表进行。

dept_name(varchar) building(varchar) budget(numeric)
Biology Watson 90000
Comp. Sci. Taylor 100000
Elec. Eng. Taylor 85000
Finance Painter 120000
History Painter 50000
Music Packard 80000
Physics Watson 70000

 

6. 配置tests/codeception/unit.suite.yml文件(博主该文件的配置如下)

# Codeception Test Suite Configuration

# suite for unit (internal) tests.
# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.

class_name: UnitTester
modules:
    enabled: 
        - Asserts
        - DB:
            dsn: 'mysql:host=localhost;dbname=task'
            user: 'root'
            password: ''

 

7. 将tests/codeception/config/config.php文件中,"dbname"改成"department"表所在的数据库名

 

 

 

前期的准备工作完成了以后,我们现在把注意力集中在创建Unit Tests上来。

 

在Web应用中,最常见的操作也就是:验证用户输入将用户输入保存到数据库修改数据库中的数据。现在,我们对这三种常见的操作,分别创建一个单元测试的例子。

 

 

验证用户输入

 

首先创建测试文件,在tests目录下面运行如下命令

 

..\vendor\bin\codecept generate:test unit \models\ExampleValidation

 结果如下

 


 
 ExampleValidationTest.php源码如下

<?php
namespace tests\codeception\unit\models;

use Yii;
use app\models\DepartmentModel;
use yii\codeception\TestCase;

class ExampleTest extends TestCase
{
    use \Codeception\Specify;
    
    private $_dept;

    /**
     * @var \UnitTester
     */
    protected $tester;

    protected function _before()
    {
        $this->_dept = new DepartmentModel();
    }

    protected function _after()
    {
    }

    public function testValidation()
    {
        $this->specify('Department validation fail', function() {

            /* 给dept_name赋一个重复的值,然后assertFalse */
            $this->_dept->dept_name = 'Biology';
            $this->assertFalse($this->_dept->validate());
        });

        $this->specify('Department validation pass', function() {

            /* 给dept_name赋一个尚未重复的值,然后assertTrue */
             $this->_dept->dept_name = 'Math';
             $this->assertTrue($this->_dept->validate());
         });
    }

}

 

 DepartmentModel.php的源码如下

<?php
namespace app\models;

use Yii;
use yii\db\ActiveRecord;

class DepartmentModel extends ActiveRecord
{
    
    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            [['dept_name', 'building'], 'string'],
            ['budget', 'double'],
            ['dept_name', 'selfDefineValidation'],
        ];
    }


    /**
     * @return string 返回与之关联的数据库表名
     */
    public static function tableName()
    {
        return 'department';
    }

    /**
     * 对输入的dept_name进行验证,不允许插入重复的dept_name
     */
    public function selfDefineValidation($attribute, $params)
    {
        $result = self::find()
            ->where(['dept_name' => $this->$attribute])
            ->limit(1)
            ->one();
        if (!empty($result)) {
            $this->addError($attribute, 'The department name has been existed');
        }
    }
}

 

然后在命令行测试结果如下

 

验证通过。

 

 

 验证用户保存数据

 

首先创建测试文件,在tests目录下面运行创建命令

 
ExampleSavingTest.php源代码如下

<?php
namespace tests\codeception\unit\models;

use app\models\DepartmentModel;
use yii\codeception\TestCase;

class ExampleSavingTest extends TestCase
{
    use \Codeception\Specify;

    /**
     * @var app\models\DepartmentModel
     */
    private $_dept;
    
    /**
     * @var \UnitTester
     */
    protected $tester;

    protected function _before()
    {
        $this->_dept = new DepartmentModel();
    }

    protected function _after()
    {
    }

    // tests
    public function testSavingDept()
    {
        $this->_dept->dept_name = 'Math';
        $this->_dept->building = 'Palmer';
        $this->_dept->budget = 70000.00;
        $this->_dept->save();

        /* 查看数据库中是否保存了数据 */
        $this->tester->seeInDatabase('department', [
            'dept_name' => $this->_dept->dept_name,
            'building' => $this->_dept->building,
            'budget' => $this->_dept->budget,
        ]);

    }
}

 

 

运行测试结果如下

 
测试通过,数据库中也确实保存了数据

 

 

验证用户修改数据

 

 首先创建单元测试文件

 

ExampleModifyingTest.php源码如下

<?php
namespace tests\codeception\unit\models;

use app\models\DepartmentModel;
use yii\codeception\TestCase;

class ExampleModifyingTest extends TestCase
{
    use \Codeception\Specify;

    /**
     * @var app\models\DepartmentModel
     */
    private $_dept;
    
    /**
     * @var \UnitTester
     */
    protected $tester;

    protected function _before()
    {
    }

    protected function _after()
    {
    }

    // tests
    public function testModify()
    {
        $this->_dept = DepartmentModel::find()
            ->where(['dept_name' => 'History'])
            ->limit(1)
            ->one();

        $old_dept_name = $this->_dept->dept_name;
        $old_building = $this->_dept->building;
        $old_budget = $this->_dept->budget;

        $this->_dept->dept_name = 'English';
        $this->_dept->building = 'Palmer';
        $this->_dept->budget = 65000.00;
        $this->_dept->save();

        /* 校验数据库中的数据是否真的被修改了 */
        $this->tester->seeInDatabase('department', [
            'dept_name' => 'English',
            'building' => 'Palmer',
            'budget' => 65000.00,
        ]);


        $this->tester->dontSeeInDatabase('department', [
            'dept_name' => $old_dept_name,
            'building' => $old_building,
            'budget' => $old_budget,
        ]);
    }
}

 

测试运行结果如下

 

  测试完毕,数据库中的数据也已经修改了。

 

 结束语:

对于任何一个软件从业人员来说,单元测试的重要性不言而喻。以上只是对Codeception这款全栈测试框架的单元测试部分,做一个简单的演示。有兴趣的朋友可以去Codepection官网查看更详细的内容。由于博主本人水平所限,如有错误,欢迎批评指正。

 

参考资料:

1. http://codeception.com/docs/05-UnitTests#.VwK7yPl97IV

2. http://pjokumsen.co.za/codeception-testing-with-yii-framework-2-0-wip/

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 大小: 10.5 KB
  • 大小: 2.6 KB
  • 大小: 6.4 KB
  • 大小: 9 KB
  • 大小: 15.6 KB
  • 大小: 6.4 KB
  • 大小: 16 KB
  • 大小: 9.9 KB
  • 大小: 6.5 KB
  • 大小: 15.1 KB
  • 大小: 9.2 KB
分享到:
评论

相关推荐

    yii 2.0 框架安装包

    - **单元测试**:Yii 2.0提供了内置的测试框架支持,包括Mocha和Codeception,便于进行单元测试和集成测试。 对于初学者,官方文档是学习Yii 2.0的好资源,它涵盖了从入门到高级主题的详尽教程和API参考。此外,...

    Codeception 测试框架

    ### Codeception 测试框架知识点详解 #### 一、Codeception 概览 - **定义**:Codeception 是一款全面的 PHP 测试框架,专为 Web 应用程序设计,支持多种类型的测试,包括单元测试、功能测试以及验收测试。 - **...

    Yii2单元测试用法示例

    首先,单元测试在Yii2框架中的实现通常需要借助于Codeception测试框架。Codeception支持三种测试类型:单元测试、功能测试、和验收测试。单元测试主要针对代码库中的最小单元(通常是函数或方法)进行测试。 在Yii2...

    yii框架(1.1.15)

    9. **测试工具**:Yii框架提供了一套完整的测试工具,如PHPUnit和Codeception的集成,1.1.15可能改进了这些工具,使测试更便捷,确保代码质量。 10. **开发工具**:Yii的Gii代码生成工具也可能有所改进,提供更强大...

    Yii2最新手册中文完整版.zip

    - **单元测试**:手册会介绍如何配置和使用Yii2的测试框架Codeception,进行单元测试和功能测试。 这份Yii2中文手册完整版详尽地覆盖了Yii2框架的各个方面,无论你是初学者还是有经验的开发者,都能从中获取到宝贵...

    yii-advanced-app-2.0.7.tgz

    4. **测试**: 利用Yii的测试框架如Codeception进行单元测试和集成测试,确保功能正常。 5. **部署**: 配置好生产环境,将代码部署到服务器,注意调整好生产环境的配置。 了解这些知识点后,你可以开始使用这个...

    列举PHP的Yii 2框架的开发优势

    它与Codeception测试框架紧密集成,后者是一个全功能的PHP测试框架,非常适合编写各种测试,如单元测试、功能测试等。Yii 2通过Codeception扩展让配置测试应用变得非常简单,只需要编辑一个配置文件即可。 为了实现...

    yii-1.0.4.r920

    4. 自动化测试:Yii 支持单元测试和功能测试,提供 Codeception 测试框架集成,帮助开发者确保代码质量并进行回归测试。 5. 缓存机制:为了提高性能,Yii 提供了多种缓存策略,包括文件缓存、内存缓存(如 APC、...

    Yii2-Cookbook-Chinese.pdf

    测试章节将教我们如何使用Codeception、PHPUnit、Atoum以及Behat等工具来测试应用。 最后,在调试、日志和错误处理章节,我们会了解到如何使用不同的日志路由、分析错误堆栈踪迹,以及如何展示自定义错误和为调试...

    yii2-ldap-password

    7. **测试和调试**: 熟悉Yii2的测试工具,如Codeception,以及如何编写单元测试和集成测试来确保LDAP功能的正确性。 8. **版本控制**: 理解Git的工作流程,因为"master"分支通常关联于Git中的主要开发分支。 9. **...

    yii2.0.chm手册

    14. **测试**:Yii 2.0 支持单元测试和集成测试,手册会解释如何编写和运行测试,以及使用Codeception测试框架。 15. **社区和扩展**:Yii有一个活跃的开发者社区,提供了大量预构建的扩展,手册会介绍如何找到和...

    Agile Web Application Development with Yii 1.1 and PHP5

    书中的内容将涵盖单元测试、集成测试,以及Yii提供的测试工具,如CodeCeption,帮助开发者建立可靠的测试框架,确保代码质量。 最后,本书可能还会讲解如何部署和优化Yii应用,包括配置服务器环境、性能调优技巧...

    yii2-console:控制台应用程序的Yii2 Framework模板

    控制台应用程序同样可以进行单元测试,Yii2提供了codeception集成,可以编写测试用例,确保命令的正确性。 总的来说,`yii2-console`提供了一套完整的控制台应用程序开发框架,使得在PHP环境中编写命令行工具变得...

    docker-yii2-ci:持续集成(CI)环境中Yii2的基本映像

    【标题】"docker-yii2-ci:持续集成(CI)环境中Yii2的基本映像" 提供了一个基于Docker的解决方案,用于在持续集成环境中高效、稳定地运行Yii2框架的应用程序。这个映像包含了开发和测试阶段所需的关键组件,确保了...

    structure_rest_yii2

    Yii2 支持 PHPUnit 和 Codeception 等测试框架,可以编写单元测试和集成测试来验证API的行为。 10. **文档生成**:良好的文档能帮助开发者理解API接口。Yii2可以配合如Swagger这样的工具,自动生成API的文档。 在...

    yii2-cropperjs-upload-widget

    理解Yii2的测试框架,如codeception,进行单元测试和功能测试。 8. **自定义配置**:组件通常会提供一些配置选项,以便适应不同的项目需求。理解如何在Yii2的配置文件中调整组件的设置,如上传目录、图片大小限制等...

    yii2_rest:具有高级日志记录和消息加密功能的 Yii2 REST API 模板

    8. **单元测试与集成测试**:Yii2 支持 PHPUnit 进行单元测试,也提供了自己的测试框架 `yii\codeception` 进行集成测试。在这个模板中,可能会有预设的测试用例,帮助开发者快速验证 API 功能的正确性。 9. **...

    yiilearn:解析yii

    Yii还支持单元测试和集成测试,通过`yiisoft/yii2-codeception`库集成Codeception测试框架,使开发者能够编写测试用例,确保代码的质量和稳定性。 在实际项目中,Yii框架的拓展性和可定制性也十分出色,通过编写...

    testphp:测试

    1. **单元测试**:使用PHP的PHPUnit框架进行单个函数或方法的测试,确保它们按预期工作。每个测试用例都独立于其他用例,这样可以精确地定位和修复问题。 2. **集成测试**:测试多个组件如何协同工作。这涉及到整个...

Global site tag (gtag.js) - Google Analytics