浅谈如何提高PHP代码质量之端到端集成测试


Posted in PHP onMay 28, 2021

概述

在这里,我们可以使用为行为驱动开发构建的工具——官方 PHP 的 Cucumber 实现——Behat。我们可以通过运行以下代码来安装它:

$ php composer.phar require --dev behat/behat

增加一个目标到 build.xml(在本文的第一部分中描述了 Phing 设置)

<target name="behat">
	<exec executable="bin/behat" passthru="true" checkreturn="true" />
</target>…
<target name="run" depends="phpcs,phpcpd,phan,phpspec,behat" />

然后,你应该为文件 features/price.feature 的测试创建一个规范。

Feature: Price Comparison In order to compare prices As a customer I need to break the currency barrier Scenario: Compare EUR and PLN Given I use nbp.pl comparator When I compare “100EUR” and “100PLN” Then It should return some result

这个测试场景非常容易阅读,并且应该给你一个关于该特性应该如何工作的良好印象。不幸的是,计算机通常并不真正理解人类语言,所以现在是为每一步编写代码的时候了。

你可以通过运行 ./bin/behat-init 来生成它的代码模板。它应该会创建一个这样的类:

//features/bootstrap/FeatureContext.php use Behat\Behat\Context\SnippetAcceptingContext;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;
class FeatureContext implements SnippetAcceptingContext{
	/** * Initializes context. */ public function __construct() { }
}

然后你可以执行:

$ bin/behat --dry-run --append-snippets

Behat 将自动为场景中定义的每个步骤创建函数。
现在你可以通过填充函数的主体来开始实现真正的检查:

// features/bootstrap/FeatureContext.php
<?php
use Behat\Behat\Context\Context;
use Domain\Price;use Domain\PriceComparator;
use Infrastructure\NBPPriceConverter;
/*** Defines application features from the specific context.*/
class FeatureContext implements Context{
	/** @var PriceComparator */ 
	private $priceComparator;
	/** @var int */ 
	private $result; 
	/** * Initializes context. * 
	* Every scenario gets its own context instance.
	* You can also pass arbitrary arguments to the* context constructor through behat.yml. */
	public function __construct() { 
		
	} 
	/** * @Given I use nbp.pl comparator */ 
	public function iUseNbpPlComparator() {
		$this->priceComparator = new PriceComparator(new NBPPriceConverter());
	} 
	/** * @When I compare :price1 and :price2 */
	public function iCompareAnd($price1, $price2) {
		preg_match('/(\d+)([A-Z]+)/', $price1, $match1); 
		preg_match('/(\d+)([A-Z]+)/', $price2, $match2);
		$price1 = new Price($match1[1], $match1[2]);
		$price2 = new Price($match2[1], $match2[2]);
		$this->result = $this->priceComparator->compare($price1, $price2); 
	} 
	/** * @Then It should return some result */ 
	public function itShouldReturnSomeResult() {
		if (!is_int($this->result)) {
			throw new \DomainException('Returned value is not integer');
		} 
	}
}

最后,使用 ./bin/phing 运行所有的测试。你应该得到以下结果:

Buildfile: /home/maciej/workspace/php-testing/build.xmlMyProject > phpcs: MyProject > phpcpd: phpcpd 4.0.0 by Sebastian Bergmann.0.00% duplicated lines out of 103 total lines of code. Time: 17 ms, Memory: 4.00MB MyProject > phan: MyProject > phpspec: / skipped: 0% / pending: 0% / passed: 100% / failed: 0% / broken: 0% / 3 examples2 specs3 examples (3 passed)15ms MyProject > behat: Feature: Price Comparison In order to compare prices As a customer I need to break the currency barrier Scenario: Compare EUR and PLN # features/price.feature:6 Given I use nbp.pl comparator # FeatureContext::iUseNbpPlComparator() When I compare "100EUR" and "100PLN" # FeatureContext::iCompareAnd() Then It should return some result # FeatureContext::itShouldReturnSomeResult()1 scenario (1 passed)3 steps (3 passed)0m0.01s (9.13Mb) MyProject > run: BUILD FINISHED Total time: 1.1000 second

正如你所看到的,Behat 准备了一份很好的报告,说明我们的应用程序做了什么,结果是什么。下一次,当项目经理询问你在测试中涉及到哪些场景时,你可以给他一个 Behat 输出!

1、测试的结构

每个测试都包括:

  • 对该场景的一些准备,用“Given”部分表示
  • “When”部分所涵盖的一些动作
  • 一些检查被标记为“Then”部分

每个部分都可以包含多个与“And”关键字连接的步骤:

Scenario: Compare EUR and PLN Given nbp.pl comparator is available And I use nbp.pl comparator When I compare "100EUR" and "100PLN" And I save the result Then It should return some result And the first amount should be greater

2、上下文

Behat 允许你为你的测试定义多个上下文。这意味着你可以将步骤代码分割成多个类,并从不同的角度去测试你的场景。

你可以例如:为 web 上下文编写代码,它将使用你的应用程序 HTTP 控制器运行你的测试步骤。你还可以创建“domain”上下文,它将只使用 PHP API 调用来运行你的业务逻辑。通过这种方式,你可以单独地测试业务逻辑集成,从端到端应用程序测试。

关于如何在 Behat 建立许多上下文的更多信息,请参考http://behat.org/en/latest/userguide/context.html的文档。

3、如何使用Behat 

正如一开始所提到的,你可以使用 Behat 进行集成测试。通常情况下,你的代码依赖于一些外部的第三方系统。当我们在第 2 部分中编写单元测试时,我们总是假设外部依赖关系像预期的那样工作。使用 Behat,你可以编写测试场景,它将自动运行你的代码,并检查它是否正确地使用真实场景的服务。

最重要的是,Behat 对于测试系统使用的复杂的端到端场景非常有用。它允许你隐藏在一个可读性的名字后面运行测试步骤所需的复杂代码,并编写一个人人都能理解的场景。

总结

从以上的文章中,你已经学习了如何在你的项目中设置六个有用的工具:

  • PHing 用于运行你的构建
  • PHPCS 用于自动检查代码格式
  • PHPCPD 用于检测重复代码的
  • Phan 用于高级静态代码分析
  • PHPSpec 用于单元测试
  • Behat 用于端到端和集成测试

现在,你可以向 git 提交钩子添加 ./bin/phing,并设置持续集成来运行每个提交的测试。

是不是突然之间,没有什么能阻止你写出高质量的 PHP 代码!

以上就是浅谈如何提高PHP代码质量之端到端集成测试的详细内容,更多关于如何提高PHP代码质量之端到端集成测试的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
PHP4和PHP5性能测试和对比 测试代码与环境
Aug 17 PHP
Uncaught exception com_exception with message Failed to create COM object
Jan 11 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
PHP的error_reporting错误级别变量对照表
Jul 08 PHP
PHP获取当前完整URL地址的函数
Dec 21 PHP
CodeIgniter视图使用注意事项
Jan 20 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
Sep 01 PHP
php连接mysql数据库
Mar 21 PHP
PHP简单实现遍历目录下特定文件的方法小结
May 22 PHP
PHP文件系统管理(实例讲解)
Sep 19 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 PHP
Laravel 前端资源配置教程
Oct 18 PHP
浅谈如何提高PHP代码质量之单元测试
May 28 #PHP
浅谈如何提高PHP代码的质量
May 28 #PHP
详解thinkphp的Auth类认证
May 28 #PHP
如何理解PHP核心特性命名空间
May 28 #PHP
如何用Laravel包含你自己的帮助函数
May 27 #PHP
详解Laravel框架的依赖注入功能
May 27 #PHP
详解PHP Swoole与TCP三次握手
May 27 #PHP
You might like
《APMServ 5.1.2》使用图解
2006/10/23 PHP
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
在Windows系统下使用PHP生成Word文档的教程
2015/07/03 PHP
JS查看对象功能代码
2008/04/25 Javascript
javascript 表格排序和表头浮动效果(扩展SortTable)
2009/04/07 Javascript
JavaScript伸缩的菜单简单示例
2013/12/03 Javascript
JS的document.all函数使用示例
2013/12/30 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
AngularJs中route的使用方法和配置
2016/02/04 Javascript
AngularJS基础 ng-show 指令简单示例
2016/08/03 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
解决一个微信号同时支持多个环境网页授权问题
2019/08/07 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
python基础教程之面向对象的一些概念
2014/08/29 Python
python分析nignx访问日志脚本分享
2015/02/26 Python
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
Python学习笔记之lambda表达式用法详解
2019/08/08 Python
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
学生宿舍管理制度
2014/01/30 职场文书
优秀经理事迹材料
2014/02/01 职场文书
机关节能减排实施方案
2014/03/17 职场文书
师德师风的心得体会
2014/09/02 职场文书
治庸问责心得体会
2014/09/12 职场文书
药店采购员岗位职责
2014/09/30 职场文书
党员承诺书格式范文
2015/04/28 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
2022/08/05 Vue.js