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

admin3年前PHP教程42
目录
概述1、测试的结构2、上下文3、如何使用Behat 总结
概述

在这里,我们可以使用为行为驱动开发构建的工具——官方 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, $matcp);
        preg_match('/(\d+)([A-Z]+)/', $price2, $match2);
        $price1 = new Price($matcp[1], $matcp[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 建立许多上下文的更多信息,请参考behat.org/en/latest/userguide/context的文档。

3、如何使用Behat 

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

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

总结

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

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

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

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

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

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

php并发加锁问题分析与设计代码实例讲解

在工作项目中,会遇到一些php并发访问去修改一个数据问题,如果这个数据不加锁,就会造成数据的错误。下面我将分析一个财务支付锁的问题。希望对大家有所帮助。1 没有应用锁机制1.1 财务支付简化版本代码&...

PHP如何获取命令行参数

目录$argv 获得所有空格分隔的参数列表getopt() 从命令行参数列表中获取选项长选项冒号规则选项参数中断总结使用 PHP 开发的同学多少都会接触过 CLI 命令行。经常会有一些定时任务或者一些...

适合TikTok直播的跨境直播网络专线在这里

适合TikTok直播的跨境直播网络专线在这里!TikTok已经成为全球非常流行的短视频应用。除了facebook\twitter等国外本地应用,TikTok已成功成为出海的标杆产品之一。是年轻一代冲浪...

关于PHP数组迭代器的使用方法实例

近来在开发一个视力筛查电子报告系统的产品,这个产品的作用是自动提取视力筛查过程中得到的屈光检查数据,并结合数据自动生成通俗易懂且专业的电子报告,以方便家长可以通过公众号或h5链接查阅。要实现这个需求,...

台湾物理服务器配置推荐怎么选择

台湾物理服务器配置推荐怎么选择?选择台湾服务器的物理配置需要根据你的实际需求和预算来决定。以下是一些推荐的配置:处理器:双路IntelXeonE5或更高级别的处理器,可以提供更高的性能和稳定性。内存:...

如何选择适合自己的江西GPU服务器

选择适合自己的GPU服务器是一个重要的决策,因为它直接影响到你的工作效率和成果。下面是一些指南,帮助你选择适合自己的GPU服务器。确定你的需求在选择GPU服务器之前,你需要明确你的需求是什么。你需要考...