女主宣言

说实话,在代码质量方面,PHP的压力非常大。通过阅读本系列文章,您将了解如何提高PHP代码的质量。

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

在本系列的最后一部分,是时候设置端到端/集成测试环境,并确保我们已经准备好检查我们工作的质量。

在本系列的前几部分中,我们建立了一个构建工具,一些静态代码分析器,并开始编写单元测试。如果你还没有读过这些,那就去看看吧!

如何提高PHP代码的质量?第一部分 自动化工具

如何提高PHP代码的质量?第二部分 单元测试

为了使我们的测试堆栈更完整,有一些测试可以检查你的代码是否在真实环境中运行,以及它是否能在更复杂的业务场景中运行良好。

在这里,我们可以使用为行为驱动开发构建的工具——官方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 ComparisonIn order to compare pricesAs a customerI need to break the currency barrierScenario: Compare EUR and PLNGiven 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

<?phpuse 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.00MBMyProject > phan:

MyProject > phpspec:

/  skipped: 0%  /  pending: 0%  / passed: 100%  /  failed: 0%   /  broken: 0%   /  3 examples2 specs3 examples (3 passed)15msMyProject > behat:

Feature: Price ComparisonIn order to compare pricesAs a customerI need to break the currency barrierScenario: Compare EUR and PLN          # features/price.feature:6Given 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 FINISHEDTotal time: 1.1000 second

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

1

测试的结构

每个测试都包括:

  • 对该场景的一些准备,用“Given”部分表示

  • “When”部分所涵盖的一些动作

  • 一些检查被标记为“Then”部分

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

Scenario: Compare EUR and PLNGiven nbp.pl comparator is availableAnd I use nbp.pl comparator    When I compare "100EUR" and "100PLN"And I save the resultThen It should return some resultAnd 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代码!

Well done!

HULK一线技术杂谈

由360云平台团队打造的技术分享公众号,内容涉及云计算、数据库、大数据、监控、泛前端、自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

如何提高PHP代码的质量?第三部分 端到端/集成测试相关推荐

  1. 如何在vscode运行php代码_如何提高 PHP 代码的质量?

    说实话,在代码质量方面,PHP 的压力非常大.通过阅读本系列文章,您将了解如何提高 PHP 代码的质量. 我们可以将此归咎于许多原因,但这肯定不仅仅是因为 PHP 生态系统缺乏适当的测试工具.在本文中 ...

  2. 如何提高PHP代码的质量?第二部分 单元测试

    女主宣言 说实话,在代码质量方面,PHP的压力非常大.通过阅读本系列文章,您将了解如何提高PHP代码的质量. PS:丰富的一线技术.多元化的表现形式,尽在"HULK一线技术杂谈", ...

  3. 如何提高PHP代码的质量?第一部分 自动化工具

    女主宣言 说实话,在代码质量方面,PHP的压力非常大.通过阅读本系列文章,您将了解如何提高PHP代码的质量. PS:丰富的一线技术.多元化的表现形式,尽在"HULK一线技术杂谈", ...

  4. 如何提高安卓代码的质量和语法

    本文讲的是如何提高安卓代码的质量和语法, 在这篇文章中,我会介绍几种不同的方式,让你通过自动化工具提高你的Android代码质量,包括 Checkstyle, Findbugs,PMD, 当然,还有我 ...

  5. java 重用性_提高Java代码重用性的三个方法

    三种修改现有代码提高其可重用性的方法,它们分别是:改写类的实例方法,把参数类型改成接口,选择最简单的参数接口类型. 措施一:改写类的实例方法 通过类继承实现代码重用不是精确的代码重用技术,因此它并不是 ...

  6. php代码质量怎么提高,如何提高PHP代码的质量?第一部分 自动化工具

    重复的代码是不好的,每个人都知道.有时我们错误地创建了这样的代码,我们从来没有注意到它.有时我们这样做是因为我们懒惰.最好是配备一个工具,它可以在构建时提示这个问题.PHPCPD - PHP复制/粘贴 ...

  7. 提高面试代码质量的三要素

    作者总结自己多年面试他人以及被他人面试的经验,发现应聘者可以从代码的规范性.完整性和鲁棒性三个方面提高代码的质量. 程序员在职业生涯中难免要接受编程面试.有些程序员由于平时没有养成良好的编程习惯,在面 ...

  8. 提高Objective-C代码质量心机一:简化写法

    提高OC代码质量的小心机 一.OC特性 OC 为 C 语言添加了面向对象特性,是其超集; OC 使用动态绑定的消息结构,也就是,在运行时才会检查对象类型; 接收一条消息后,究竟应执行何种代码,由运行期 ...

  9. 提高 Java 代码质量

    高质量代码中往往缺陷更少!确保高的 Java 代码质量有两个步骤:尽早并经常地编写各个层次的测试用例,以及持续的监测质量状况.那么我们又该如何实践呢?本专题汇集了大量来自代码质量专家们的专业经验.最佳 ...

最新文章

  1. 《IT咨询指南》读书笔记一开卷 前言
  2. 影响SEO网站文章收录的因素有哪些?
  3. 机器学习算法学习---处理分类问题常用算法(一)
  4. bool类型头文件_[C++基础入门] 2、数据类型
  5. java与bartender_Java调取Bartender使用教程.md
  6. 解决 VS2019 中.net core WPF 暂时无法使用 Designer 的临时方法
  7. IIS之错误解决之道
  8. 三天花三万!跟董事长女儿相亲却被骗财?世纪佳缘致歉杭州小吴并承诺赔偿...
  9. 数据库服务器备份日志文件,数据库服务器备份日志文件
  10. 【2021团体程序设计天梯赛】L2部分(PTA,L2-037到L2-040)题解代码复盘
  11. 极大似然估计和交叉熵
  12. 新手如何发网站外链,网站的外链如何发,发外链的方法集合
  13. 使用react制作点赞组件
  14. 电脑连不上5GWiFi解决办法:更新驱动
  15. reportportal 集成 robotframework 自动化执行及结果可视化
  16. Unity3D中Isometric Tilemap功能实践
  17. 取消ctrl+alt+left旋转桌面
  18. 纵向抽奖滚动效果代码
  19. 我继续问了ChatGPT关于SAP顾问职业发展前景的问题,大家感受一下
  20. 易语言 5.93静态编译报错

热门文章

  1. Spring自学日志00(Spring配置文件头及xsd文件版本浅析)
  2. Idea 版本控制冲突解决
  3. oracle释放shm空间,安装11gRAC时提示/dev/shm大小不足
  4. 泽尼克多项式 matlab,zernike多项式 ---matlab程序 ---arrayfun.m函数
  5. python 命名空间报错_python命名空间与作用域
  6. plsql存储过程修改后怎么保存_分布式基础-存储引擎
  7. Java中选择排序,冒泡排序,插入排序,快速排序
  8. E-MapReduce解决hive comment中文乱码问题
  9. SAP HANA中创建时间相关的数据时候需要Variant Schema
  10. zend_soap做webservice的使用方法