阅读时间 4 分钟 (876 字)

保持冷静,编写测试

Keep Calm and Write Test

在“框架单元测试”项目的第一篇系列文章中,我们将继续探讨针对 PHP 库的单元测试。本文主要分为两部分,一部分是 PHP 单元测试,另一部分是项目更新。您可以自由地跳过任何或所有部分。

在多个 PHP 版本上运行测试。

设置测试环境是测试过程中的首要任务。我们已经看到了如何设置 phpunit,现在我们将看到如何设置系统以在不同的 PHP 版本上运行测试。

设置此环境所需的工具是 php-build[1] 和 phpenv[2]。这两个工具都可以从其托管在 github 上的 git 仓库中下载,无论是通过克隆它们还是直接下载存档。现在使用 php-build 构建一个 PHP 版本。您可以使用命令 `php-build --definitions` 获取所有 PHP 版本的列表。在继续之前,您还应该使用您的包管理器安装一些基本的构建依赖项。在基于 Debian 的 Linux 发行版上使用 `sudo apt-get install build-essential autoconf automake libtool bison re2c`。

要构建版本 a.b.c,只需运行 `php-build -i development a.b.c $HOME/.phpenv/versions/a.b.c`。这将从 src 下载 php a.b.c 并构建它,这可能需要几分钟,所以请耐心等待。现在您可以使用 phpenv 启用 php a.b.c 版本。其命令为 `phpenv global a.b.c`。您可以使用 `php -v` 检查当前 PHP 版本。要将活动版本还原到系统的默认版本,请使用 `phpenv global system`。

面向对象测试

面向对象编程以诸如对象、类、消息、接口、继承、多态等概念为中心。对象具有状态、行为和身份。对象中状态的存在意味着操作调用的顺序很重要,并且我们可以用有限状态机(FSM)的形式正式地描述对象的行为。

传统的单元测试关注于与周围程序隔离的单元测试。单元通常是函数或模块。然而,对于面向对象的程序,最小的单元是类(或对象)。由于状态与大多数操作之间的耦合程度很高,类的属性无法轻易与操作分离。这并不意味着操作不能彼此独立验证,而是意味着类属性必须存在且可访问。

IsometricShapes.jpg

根据有限状态机(FSM)编写特定单元的测试用例非常简单。首先将类置于特定状态,然后对其执行不同的操作,这些操作可能会将状态更改为另一个状态。现在编写断言以测试最终状态。在创建特定操作的测试时,请参考以下表格。类的每个方法(函数)都是可以应用于特定状态中类的操作。

类型

获取器

设置器

静态

可见性

     

公共

测试它。

测试它

测试它。

受保护的

测试它。

测试它

测试它

私有的

不要测试它。

不要测试它。

不要测试它。

 

测试获取器方法

使用基于状态的测试,首先将对象设置为某个状态(如果需要,使用反射),然后调用获取器并测试预期的输出。示例:

$field = new TextField;

TestHelper::setValue($field, 'id', 'myId');

TestHelper::setValue($field, 'name', 'myName');

TestHelper::setValue($field, 'value', 'avalue');

$this->assertEquals(

$field->input,

'<input type="text" name="myName" id="myId" value="avalue"/>'

);

测试设置器方法

使用基于状态的测试,将输入值传递给设置器,然后检查达到的状态(如果需要,使用反射)。示例:

$field = new \Joomla\Form\Field\TextField;

$this->assertEquals(

$field->type,

'Text'

);

$this->assertNull($field->formControl);

$this->assertNull(TestHelper::getValue($field, 'form'));

使用代码覆盖率分析作为工具

代码覆盖率分析是一个报告,显示了已测试代码和未测试代码。它可以用来找出无法访问的代码部分或死代码。程序在任何可能的条件下都不会执行此代码部分。

代码覆盖率分析的另一种用途是创建边界测试用例。在一个纯粹是算法实现的函数中,不可能考虑所有可能的输入-输出场景。在这种情况下,代码覆盖率可以给出缺少条件的提示。要使用PHPUnit创建覆盖率HTML报告,需要配置调试器(Xdebugger或Zend Debugger)。使用命令`phpunit --coverage-html ./report`我们可以在浏览器中查看分析报告。报告还可以导出为其他格式,如Clover XML、Crap4J XML、文本、PHPUnit XML。

项目更新

添加和审查框架包测试的项目已完成一半。我打算通过一些统计数据展示项目的状态。

image.png

 

 

 

image (1).png

  

尽管基本工作已完成,但我正在考虑再次遍历所有这些包,以提高使用的断言类型。文件系统包正在进行过渡,以使用vfsStream。在编写测试时,我在不同的包中遇到了几个错误、死代码和冗余代码,我立即进行了修复。归档、数据库、语言、图像、路由、依赖注入、数据和方法包正在管道中。

参考资料

 

  1. https://github.com/CHH/php-build
  2. https://github.com/phpenv/phpenv
  3. http://docs.joomla.org/Configuring_Xdebug_for_PHP_development
  4. http://www.zend.com/topics/Zend-Debugger-Installation-Guide.pdf
  5. https://github.com/mikey179/vfsStream

 

 

 

发表在 Joomla 社区杂志上的某些文章代表了作者对特定主题的个人观点或经验,可能不代表 Joomla 项目官方立场。

0
 

评论

已经注册? 登录这里
暂无评论。成为第一个发表评论的人

接受后,您将访问由 https://magazine.joomla.net.cn/ 外部的第三方提供的服务