0

0

Yii框架官方指南系列增补版39——测试:单元测试(Unit Testing)

黄舟

黄舟

发布时间:2017-02-15 09:52:39

|

1516人浏览过

|

来源于php中文网

原创


因为yii测试框架基于phpunit构建,所以推荐你在理解如何写一个单元测试之前先通读一遍phpunit文档。下面我们简要概括一下在yii中写一个单元测试的基本原则:

  • 一个单元测试以继承自CTestCase或者CDbTestCase的XyzTest类的形式编写, 其中Xyz代表要被测试的类. 例如, 想要测试Post类,我们会相应地将测试类命名为PostTest. 基类CTestCase是通用单元测试类, 而CDbTestCase只适用于测试AR模型类. 由于PHPUnit_Framework_TestCase是这两个类的父类, 我们可以从这个类中继承所有方法。

  • 单元测试类以XyzTest.php的形式保存在PHP文件中. 方便起见,单元测试文件通常保存在 protected/tests/unit文件夹下.

  • 测试类主要包含一系列testAbc方法, 其中Abc通常是要被测试的类方法.

  • 测试方法通常包含一系列断言语句 (e.g. assertTrue, assertEquals),作为验证目标类行为的断点.

下面我们主要阐述如何为AR模型类编写单元测试. 我们的测试类将会继承自 CDbTestCase,因为它提供了数据库特定状态支持,在上一章节中我们已经详细讨论了数据库特定状态.

假设我们要测试blog案例中的Comment模型类,可以首先创建一个命名为CommentTest的类,然后将它保存为 protected/tests/unit/CommentTest.php:

Manus
Manus

全球首款通用型AI Agent,可以将你的想法转化为行动。

下载
class CommentTest extends CDbTestCase
{
    public $fixtures=array(
        'posts'=>'Post',
        'comments'=>'Comment',
    );

    ......
}

在这个类中, 我们指定成员变量 fixtures 为一个包含这个测试要用到的特定状态(fixtures)数组。这个数组表示从特定状态名称到模型类的映射或者特定状态表名 (e.g. 从  posts 到 Post). 注意当映射到特定状态表名时,应该在数据表名称前加上冒号前缀 (e.g. :P ost)来区别于映射到模型类. 当使用模型类名称时,相应的表将会被看作特定状态表。正如我们之前所描述的 ,当一个测试方法执行后特定状态表每次将会被重置到某些已知的状态。

特定状态名称允许我们在测试方法中以一种很方便的方式访问特定状态数据. 下面的代码展示了典型的使用方法:

// return all rows in the 'Comment' fixture table
$comments = $this->comments;
// return the row whose alias is 'sample1' in the `Post` fixture table
$post = $this->posts['sample1'];
// return the AR instance representing the 'sample1' fixture data row
$post = $this->posts('sample1');
Note: 如果一个特定状态声明使用它的数据表名 (e.g. 'posts'=>':Post'), 那么上述第三个使用方法将会无效,因为我们已经已经没有任何与模型类的关联信息了.

接下来,我们要编写testApprove方法在Comment模型类中测试approve方法. 代码非常简单明了: 首先我们插入一条待审核评论; 然后通过从数据库取出数据来验证这条带审核评论; 最后我们调用approve方法并且通过审核。

public function testApprove()
{
    // insert a comment in pending status
    $comment=new Comment;
    $comment->setAttributes(array(
        'content'=>'comment 1',
        'status'=>Comment::STATUS_PENDING,
        'createTime'=>time(),
        'author'=>'me',
        'email'=>[email protected]',
        'postId'=>$this->posts['sample1']['id'],
    ),false);
    $this->assertTrue($comment->save(false));

    // verify the comment is in pending status
    $comment=Comment::model()->findByPk($comment->id);
    $this->assertTrue($comment instanceof Comment);
    $this->assertEquals(Comment::STATUS_PENDING,$comment->status);

    // call approve() and verify the comment is in approved status
    $comment->approve();
    $this->assertEquals(Comment::STATUS_APPROVED,$comment->status);
    $comment=Comment::model()->findByPk($comment->id);
    $this->assertEquals(Comment::STATUS_APPROVED,$comment->status);
}

以上就是Yii框架官方指南系列增补版39——测试:单元测试(Unit Testing)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

2

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

2

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

0

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

0

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.29

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

25

2026.01.29

clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址
clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址

clawdbot龙虾机器人官网入口:https://clawd.bot/,clawdbot ai是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

16

2026.01.29

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

8

2026.01.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

622

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.7万人学习

React 教程
React 教程

共58课时 | 4.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号