浅谈如何提高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 相关文章推荐
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 PHP
Admin generator, filters and I18n
Oct 06 PHP
PHP多文件上传类实例
Mar 07 PHP
Laravel 5框架学习之环境与配置
Apr 08 PHP
PHP结合jQuery实现找回密码
Jul 22 PHP
ThinkPHP函数详解之M方法和R方法
Sep 10 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
Mar 18 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
Sep 09 PHP
PHP实现的解汉诺塔问题算法示例
Aug 06 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
Jan 23 PHP
详解阿里云视频直播PHP-SDK接入教程
Jul 09 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
批量修改RAR文件注释的php代码
2010/11/20 PHP
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
如何利用http协议发布博客园博文评论
2015/08/03 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
2017/07/22 jQuery
微信小程序如何获取用户信息
2018/01/26 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
使用pandas将numpy中的数组数据保存到csv文件的方法
2018/06/14 Python
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
python属于哪种语言
2020/08/16 Python
歌唱比赛主持词
2014/03/18 职场文书
党员公开承诺书范文
2014/03/25 职场文书
2015欢度元旦标语口号
2014/12/09 职场文书
英语感谢信范文
2015/01/20 职场文书
逃课检讨书
2015/01/26 职场文书
先进个人自荐书
2015/03/06 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
手把手教你怎么用Python实现zip文件密码的破解
2021/05/27 Python