0

0

使用 PHPUnit 进行 PHP 的单元测试_PHP教程

php中文网

php中文网

发布时间:2016-07-20 11:13:56

|

1028人浏览过

|

来源于php中文网

原创

PHPUnit是一个用PHP编程语言开发的开源软件,是一个单元测试框架。PHPUnit由Sebastian Bergmann创建,源于Kent Beck的SUnit,是xUnit家族的框架之一。本文将探索PHPUnit,特别介绍自动化单元测试的基本用法。你需要掌握PHP编程语言的基本知识 才能继续。

作者:Kendrick Curtis,Stainless Software, http://www.stainless-software.com/

介绍

单元测试是对单独的代码对象进行测试的过程,比如对函数、类、方法进行测试。单元测试可以使用任意一段已经写好的测试代码,也可以使用一些已经存在的测试 框架,比如JUnit、PHPUnit或者Cantata++,单元测试框架提供了一系列共同、有用的功能来帮助人们编写自动化的检测单元,例如检查一个 实际的值是否符合我们期望的值的断言。单元测试框架经常会包含每个测试的报告,以及给出你已经覆盖到的代码覆盖率。

@@##@@
heiing
翻译于 昨天(9:23)

2人顶

 翻译的不错哦!

安装

PHPUnit 通常以 PEAR 包,Composer bundle 或是 PHAR 文件形式存在。如果你要安装它,你需要先安装 PHP Code Coverage 依赖。在 PEAR 中,你需要天价 phpunit.de 频道,并通过命令行安装两个包:

立即学习PHP免费学习笔记(深入)”;

@@##@@
(注意,在输入时,默认的 XAMPP 的 PEAR 安装已经被破坏:你需要在尝试上面代码之前先安装 PEAR PHAR)。

测试一个简单的类

试试只有单一方法的简单类:

1 class TruthTeller
2 {
3 public function() tellTruth
4 {
5 return true;
6 }
7 }

是的,现在 tellTruth 方法总是返回 TRUE,那么我们应改怎么通过单元测试确保今后它的返回值不变?

heiing
Khiyuan
翻译于 昨天(14:12)

1人顶

 翻译的不错哦!

使用PHPUnit,每组测试是PHPUnit_Framework_TestCase类的一个扩展类,它提供了常用的功能,如判断。下面是一个对上述tellTruth方法的一个基本测试:
01 require_once 'PHPUnit/Autoload.php';
02 require_once 'TruthTeller.class.php';
03 class TruthTester extends PHPUnit_Framework_TestCase
04 {
05 function testTruthTeller()
06 {
07 $tt = new TruthTeller();
08 $this->assertTrue($tt->tellTruth());
09 }
10 }

请注意,您需要包括PHPUnit的自动加载器和“被测对象”,在这种情况下的TruthTeller类文件。

PHP Unit Testing with PHPUnit
媛媛小译
翻译于 昨天(10:18)

0人顶

 翻译的不错哦!

如果你启动了命令行提示,切换到你的测试所在目录,运行 phpunit TruthTester (参数是你的测试文件名,去除 .php 扩展名),PHPUnit 将会运行文件中指定的所有它能找到的测试(测试将是名字以 test 开头的所有方法)。

@@##@@

绿色大气办公家具类企业织梦模板1.0
绿色大气办公家具类企业织梦模板1.0

绿色大气办公家具类企业织梦模板是以织梦最新内核来进行开发的模板,该模板属于家具行业,装修企业,家装类,属于企业通用,装修设计、家具生产等企业均可以使用该模板,页面简洁简单,容易管理,DEDE5.5内核以上都可以使用;附带测试数据!模板特点:简洁美观大方小清新的设计风格,图片展示效果绝佳。页面结构简单,利于SEO的优化,模板后台易于管理。使用程序:织梦DEDECMS5.5以上版本都可以使用。温馨提示

下载

如果你回到 TruthTeller 类,并将其方法的返回值改为 FALSE,你讲看到类似下面的信息:

@@##@@

这就是单元测试的核心——编写断言并判断是否通过。当先前编写并测试通过的代码开始无法通过时,你就知道有更改的代码对现有代码起了负面影响。

@@##@@
Khiyuan
翻译于 昨天(14:22)

0人顶

 翻译的不错哦!

更复杂的测试

在现实中,你肯定需要处理比上一个更复杂的情况。比如一个常见的测试是检查下面的outputArray方法是否返回了一个特定数据结构的数组。

1 class ArrayTeller
2 {
3 public function outputArray()
4 {
5 return array(1,2,3);
6 }
7 }

对此方法的一个简单测试可以这样写:

01 class ArrayTester extends PHPUnit_Framework_TestCase
02 {
03 function testArrayTeller()
04 {
05 $at = new ArrayTeller();
06 $result = $at->outputArray(1);
07 $this->assertInternalType("array", $result);
08 $this->assertCount(3, $result);
09 $this->assertEquals(1, $result[0]);
10 $this->assertEquals(3, $result[2]);
11 }
12 }

如你所见,使用PHPUnit进行单元测试时可以在每一行进行多样化的检查:可以检查ArrayTeller返回的是否是一个数组,而非任何其他数据类 型;可以检查数组的长度;可以检查数组中的单个值。除这些外,还有其它一些功能的断言,比如如果你需要更复杂的判断,假设要知道一个返回值是否处于两个整 数的区间内,只要你能用一个IF语句的结果来表述,你就可以用断言assertTrue来测试结果。可点击随后链接来访问PHPUnit官网文档中的所有可用断言列表,。

Khiyuan
赵亮-本人
翻译于 昨天(14:25)

0人顶

 翻译的不错哦!

其它翻译版本(1)
测试代码路径

单元测试片面的讲就是编写覆盖被测方法所有预期行为的测试,最好基于规范文档,不过如果你在编写覆盖现有代码的单元测试,将其视为白盒测试的一种形式更有用。如果你知道一个如下的简单切换方法:

01 class Switcher
02 {
03   public function aOrB($switch, $a, $b)
04   {
05     if ($switch == TRUE)
06     {
07       return $a;
08     }
09     else
10     {
11       return $b;
12     }
13   }
14 }

… 你就知道需要编写两个测试,分别针对一种情形。但你开始质疑你是如何知道这些的——如果以后方法变为 True 返回 $a,False 返回 $b,其它情形抛出一个异常,理想情况是规范文档中的某处有提及。无论如何,上面方法的测试如下:

01 class SwitcherTester extends PHPUnit_Framework_TestCase
02   {
03     function testSwitchTrue()
04     {
05       $switcher = new Switcher();
06       $result = $switcher->aOrB(TRUE, 1, 2);
07       $this->assertEquals(1, $result);
08     }
09     function testSwitchFalse()
10     {
11       $switcher = new Switcher();
12       $result = $switcher->aOrB(FALSE, 1, 2);
13       $this->assertEquals(2, $result);
14     }
15 }

运行两个测试同在命令行运行 phpunit SwitcherTester 一样简单。

媛媛小译
Khiyuan
翻译于 昨天(14:46)

0人顶

 翻译的不错哦!

使用 setUp,简化多个测试

当你的测试需要覆盖越来越多的输入组合及数据设置时,使用函数: setUp 将会非常有帮助。setUp 是 PHPUnit_Framework_TestCase 类中你可以覆写以在类中所有及每个测试运行前运行的代码。(注意,还有一个简单的方法,tearDown,它会在所有测试结束后立即运行——这对关闭 socket 及文件指针很有帮助)

下面是如何精简代码的一个简单的例子。尝试一个依赖一些对象数据何输入的方法。

01 class DataTeller
02   {
03   private $data;
04   public function __construct($data)
05   {
06     $this->data = $data;
07   }
08   public function outputData($switch)
09   {
10     if ($switch == TRUE)
11     {
12       if (!empty($this->data))
13         return $this->data;
14       else
15         return FALSE;
16     }
17     else
18     {
19       return "switch off";
20     }
21   }
22 }

如果你继续之前幼稚的方法,我们需要编写三个测试,并实例化三个 DataTeller 对象,每个测试一次。然而,通过 setUp,我们可以讲对 DataTellers对象的创建外包,至少是3个中的两个。只有最后一个测试需要新的 DataTeller 被创建。

01 class DataTellerTester extends PHPUnit_Framework_TestCase
02 {
03   private $dt;
04   protected $data = "valid data";
05   function setUp()
06   {
07     $this->dt = new DataTeller($this->data);
08   }
09   function testOutputArraySwitchOff()
10   {
11     $this->assertEquals("switch off", $this->dt->outputData(FALSE));
12   }
13   function testOutputArraySwitchOn()
14   {
15     $this->assertEquals($this->data, $this->dt->outputData(TRUE));
16   }
17   function testOutputArrayEmptySwitchOn()
18   {
19     $new_dt = new DataTeller("");
20     $this->assertEquals(FALSE, $new_dt->outputData(TRUE));
21   }
22 }
PHP Unit Testing with PHPUnit
Khiyuan
翻译于 昨天(15:03)

0人顶

 翻译的不错哦!

结论

PHPUnit使用断言来告诉你你所测试的代码是否如你预期那样工作。学到这里,你现在应该已经可以写一些简单的测试来覆盖一些功能相对比较独立的类了。 但当要测试一些互相有交互操作的类时,就要面对真正的挑战了。为此,请收听下一次讲解,学习如何为静态类写测试,以及如何使用 mock(模拟对象)和 stubs(存根,桩点)来孤立你要测试的对象与其所在环境中其他代码的联系。

延伸阅读

* PHPUnit 手册
* PEAR站点上的PHPUnit 教程

关于作者

Kendrick Curtis(肯德里克.柯蒂斯)是一个有十年经验的Web开发者。他是 Stainless Software(不锈钢软件)公司的创始人,提供特约的网页设计,开发,测试和内容创作。有关更多信息可参阅其公司网站: http://www.stainless-software.com/

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/440325.htmlTechArticlePHPUnit是一个用PHP编程语言开发的开源软件,是一个单元测试框架。PHPUnit由Sebastian Bergmann创建,源于Kent Beck的SUnit,是xUnit家族的框架之一。...
PHP Unit Testing with PHPUnitKhiyuan赵亮-本人KhiyuanKhiyuan

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1044

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

334

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

213

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

35

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

111

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

77

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

17

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

813

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

97

2026.02.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 11.9万人学习

CSS3 教程
CSS3 教程

共18课时 | 6万人学习

Git 教程
Git 教程

共21课时 | 3.8万人学习

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

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