iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >浅谈如何提高PHP代码质量之单元测试
  • 713
分享到

浅谈如何提高PHP代码质量之单元测试

2024-04-02 19:04:59 713人浏览 薄情痞子
摘要

目录1、单元测试2、应该使用哪个框架?3、如何设置测试?构建测试对象在模拟中匹配运行时参数匹配运行时异常4、在哪里可以找到更多的例子?1、单元测试 通过实现单一责任原则(我们的代码应

1、单元测试

通过实现单一责任原则(我们的代码应该只关注功能的单个部分),我们将确保在测试期间,我们只会同时关注项目的一小部分

通过使用 Liskov 替换原则和依赖倒置原则,我们的代码不会关心我们是否注入模拟依赖关系,只要它们实现了适当的接口

在单元测试中,我们确实希望用模拟对象替换所有依赖的服务,因此我们一次只测试一个类。但模拟是什么?它们是实现与其他对象相同的接口的对象,但它们的行为是受控的。例如,假设我们在创建一个价格比较服务,我们利用另一个服务来获取当前的汇率。在测试我们的比较器时,我们可以使用一个模拟对象来为特定的货币返回特定的汇率,因此我们的测试既不依赖也不调用真正的服务。

2、应该使用哪个框架?

有几个好的框架可以达到这个目的。最常见的可能是 PHPUnit。在我的工作中,我发现使用行为方法来编写测试会带来更好的结果,并使我更急切地编写测试。对于我们的项目,我们选择 phpspec。

安装过程相当简单 - 只需使用:

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

然后,如果你在本文的第一部分中配置了 PHing,那么你可以在 build.xml 中添加构建目标:


<target name="phpspec">
	<exec executable="bin/phpspec" passthru="true" checkreturn="true">
		<arg line="run --fORMat=pretty" />
	</exec>
</target>...
<target name="run" depends="phpcs,phpcpd,phan,phpspec" />

然后,你必须为你想要测试的每个服务类创建一个测试类。让 PHPSpec 非常容易使用的是模型创建。你只需使用严格的输入,就可以将模拟对象声明为测试函数的参数。PHPSpec 会自动为你创建模拟。让我们看一下代码示例:


//spec/Domain/PriceComparatorSpec.php
<?php
namespace spec\Domain;
use Domain\Price;use Domain\PriceConverter;
use PhpSpec\ObjectBehavior;
class PriceComparatorSpec extends ObjectBehavior{
	public function let(PriceConverter $converter)    {       
		$this->beConstructedWith($converter);   
	} 
	public function it_should_return_equal()    {   
		$price1 = new Price(100, 'EUR');     
		$price2 = new Price(100, 'EUR');   
		$this->compare($price1, $price2)->shouldReturn(0);
	}    
	public function it_should_convert_first(PriceConverter $converter) {   
		$price1 = new Price(100, 'EUR');    
		$price2 = new Price(100, 'PLN');    
		$priceConverted = new Price(25, 'EUR');    
		$converter->convert($price2, 'EUR')->willReturn($priceConverted);  
		$this->compare($price1, $price2)->shouldReturn(1); 
	}
}

这里有三个函数:

  • let( ) - 它允许使用依赖来初始化服务
  • 两个 it_* 函数实现测试。其中一种方法是使用模拟 $priceConverter 的方法实现 priceConverter 接口,该接口被注入到测试对象的创建中。

你可以看到创建模拟非常容易。你所需要做的就是将它定义为测试函数的参数,并通过指定在执行代码时应该运行哪些函数来配置 mock。如果需要,你还可以设置返回值。

所有测试的方法都是从 $this 上下文中运行的,你可以使用与模拟相同的语法来轻松地检查它们的结果。

3、如何设置测试?

Phpspec 有一个很好的文档,但是我将尝试向你展示一些在日常实践中有用的基本用例。

构建测试对象

一般来说,设置测试对象的最简单方法是调用 $this->beConstructedWith(…) 方法,该方法将所有应该传递给对象构造函数的 params 作为参数。

如果你的对象应该使用工厂方法来创建,那么你可以使用

this−>beConstructedThrough(this−>beConstructedThrough(methodName,$argumentsArray)方法。

在模拟中匹配运行时参数

你会发现 phpspec 使用一种非常类似于人类的语法来配置模拟。例如,如果你想要检查在运行时是否有一个模拟方法 someMethod 与参数“desired value”被调用,你可以在测试中定义它,如下面的例子:


$mockObject->someMethod("desired value")->shouldBeCalled();

如果你想要测试代码的行为,当一些 mock 的函数返回“some value”时,你可以通过调用来轻松地设置它:


$mockObject->someFunction("some input")->willReturn("some value");

有时我们并不真正关心传递给 mock 的确切参数。然后可以写这段代码:


use Prophecy\Argument\Token\AnyValueToken;
$mockObject->someFunction(new AnyValueToken())->willReturn(true);

有时你会关心一些参数,最好是写一个检查函数,它会告诉你是否正确地调用了一些方法,例如:


use Prophecy\Argument\Token\CallbackToken;
$checker = function (Message $message) use ($to, $text) {  
	return $message->to === $to && $message->text === $text;
};
$msgSender->send(new CallbackToken($messageChecker))->shouldBeCalled()

匹配运行时异常

。在某些情况下,异常是代码接口的一部分。你希望它们在特定的场景被抛出。你可以通过编写以下代码来完成这项工作:


$this->shouldThrow(\DomainException::class)->during('execute', [$command, $responder]);

传给 during() 的第一个参数是将要调用的方法的名称,第二个参数是将传递给我们的方法的参数数组

4、在哪里可以找到更多的例子?

在本文中,我们只介绍了一些基本的用例。请参考 phpspec 的文档,以找到更多的示例,这些示例将使你的测试代码变得漂亮!

代码覆盖率

PHPSpec 附带了扩展子系统,它允许例如创建代码覆盖率报告。如果您想要检查在测试中执行了多少代码,它们是很有帮助的。

你可以通过以下来安装这个扩展:

$ php composer.phar require --dev leanphp/phpspec-code-coverage

然后通过创建 phpspec 来启用它。yml 文件内容:

1 extensions: LeanPHP\PhpSpec\CodeCoverage\CodeCoverageExtension: ~

默认情况下,这个扩展会使用 PHP 的 Xdebug 扩展生成代码覆盖率信息,但是 PHP 的本机调试器 - phpdbg 会更快速一些:

$ phpdbg -qrr phpspec run

现在,你可以在 build 中更改 phpspec 的构建目标。xml:


<target name="phpspec">
	<exec executable="phpdbg" passthru="true" checkreturn="true">
		<arg line="-qrr bin/phpspec run --format=pretty" />
	</exec>
</target>...
<target name="run" depends="phpcs,phpcpd,phan,phpspec" />

报告在覆盖率 / 目录中生成,作为漂亮的 html 页面,可以浏览以检查测试覆盖率。

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

--结束END--

本文标题: 浅谈如何提高PHP代码质量之单元测试

本文链接: https://www.lsjlt.com/news/127092.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈如何提高PHP代码质量之单元测试
    目录1、单元测试2、应该使用哪个框架?3、如何设置测试?构建测试对象在模拟中匹配运行时参数匹配运行时异常4、在哪里可以找到更多的例子?1、单元测试 通过实现单一责任原则(我们的代码应...
    99+
    2024-04-02
  • 浅谈如何提高PHP代码质量之端到端集成测试
    目录概述1、测试的结构2、上下文3、如何使用Behat 总结概述 在这里,我们可以使用为行为驱动开发构建的工具——官方 PHP 的 Cucumber 实现——Behat。我...
    99+
    2024-04-02
  • 浅谈如何提高PHP代码的质量
    目录概述1 必备条件2 构建工具3 静态代码分析4 代码风格5 复制 / 粘贴检测器6 想要真正深入的代码分析?概述 我们可以将此归咎于许多原因,但这肯定不仅仅是因为 PHP 生态系...
    99+
    2024-04-02
  • C++ 函数单元测试如何提高代码质量?
    单元测试是软件开发中针对单个函数进行的自动化测试,以确保其正确性和健壮性。在 c++++ 中可以使用 catch2 等库进行单元测试:包含头文件,定义测试用例,进行断言,构建和运行测试。...
    99+
    2024-04-23
    单元测试 代码质量 c++ 重构代码
  • PHPStorm 的单元测试支持:确保 PHP 代码的高质量
    PHPStorm 是一款功能强大的 PHP IDE,它提供了全面的单元测试支持,有助于提高 PHP 代码的质量。本文将探讨 PHPStorm 中的单元测试功能,并演示如何利用它们来编写和运行单元测试。 单元测试 单元测试是验证软件组件是否...
    99+
    2024-03-03
    PHP, 单元测试, PHPStorm
  • PHP 单元测试代码规范与质量准则
    php 单元测试的代码规范和质量准则包括:命名约定:测试类名以 test 后缀,方法名以 test 开头;方法签名:使用 public function testmethodname()...
    99+
    2024-05-07
    php 单元测试 代码可读性
  • 浅谈如何测试Python代码
    目录一、介绍二、测试范围三、单元测试四、第一个测试用例五、异常测试六、mounttab.py七、测试覆盖率八、总结一、介绍 编写测试检验应用程序所有不同的功能。每一个测试集中在一个关...
    99+
    2024-04-02
  • PHP如何优化单元测试代码
    这篇文章将为大家详细讲解有关PHP如何优化单元测试代码,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、单元测试通过实现单一责任原则(我们的代码应该只关注功能的单个部分),我们将确保在测试期间,我们只会同...
    99+
    2023-06-15
  • 如何使用单元测试提高JavaScript代码的可靠性
    单元测试是一种软件测试方法,可以帮助你验证代码是否按照预期工作。通过在每次提交代码时运行单元测试,你可以快速发现并修复任何问题,从而提高代码的可靠性和可维护性。 单元测试的优点 单元测试有很多优点,包括: 提高代码的可靠性。 单元测试...
    99+
    2024-02-08
    单元测试 JavaScript 代码可靠性 代码维护性
  • PHP 持续集成中的单元测试:确保代码质量的基石
    简介 单元测试是在持续集成 (CI) 流程中不可或缺的一个环节,它通过自动化测试来验证代码的正确性和健壮性。在 PHP 中,我们可以通过 PHPUnit 等单元测试框架来实现此功能。本文将深入探讨在 PHP 持续集成中使用单元测试的最佳...
    99+
    2024-02-17
    PHP 单元测试 持续集成 代码质量
  • PHP PHPUnit测试的艺术:提升代码质量的秘诀
    PHP PHPUnit 测试是一种强大的工具,可用于提高代码质量、稳定性和可维护性。遵循最佳实践可以最大化 PHPUnit 测试的有效性,从而创建更可靠、更健壮的 PHP 代码。 制定有效的测试策略 覆盖率: 确保测试涵盖应用程序的关键...
    99+
    2024-04-02
  • LeetCode 和 NPM 打包:如何提高 PHP 代码质量?
    在日常开发中,我们经常会遇到一些需要高质量 PHP 代码的场景,比如开发一个高性能的 Web 服务器、编写一个数据结构算法等等。为了提高代码质量,我们可以借鉴一些优秀的工具,比如 LeetCode 和 NPM 打包。 LeetCode 是...
    99+
    2023-08-15
    leetcode npm 打包
  • Python心得--如何提高代码质量
      前些日子用python基于prometheus开发了一个vsphere volume卷监控的exporter,于是跟vsphere的api(pyvmomi)接口打上了交道,开发的过程中你会发现pyvmomi的接口返回的对象好多列表类型的...
    99+
    2023-01-31
    心得 代码 质量
  • 如何用接口写高质量PHP代码
    本篇内容介绍了“如何用接口写高质量PHP代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!      &nbs...
    99+
    2023-06-25
  • Golang测试驱动开发:提高代码质量和可靠性的利器
    tdd 在 golang 中的优势包括更高的代码质量、更强的可靠性和更少的缺陷。实现 tdd 的步骤包括编写测试用例、最小化实现、运行测试和重构。举例计算阶乘时,编写测试用例后创建最小化...
    99+
    2024-05-11
    golang 测试驱动开发
  • PHP 学习笔记:如何利用容器提高代码质量?
    随着 PHP 技术的不断发展,越来越多的开发者开始关注代码质量的问题,因为代码质量对于项目的稳定性、扩展性和可维护性都有着非常重要的影响。而容器是一个可以帮助我们提高代码质量的工具,本文将介绍如何利用容器提高 PHP 代码的质量。 什么是...
    99+
    2023-09-21
    学习笔记 容器 数据类型
  • JavaScript的编程技巧:如何提高代码质量?
    JavaScript是一种广泛使用的编程语言,可以用于开发各种类型的应用程序,包括网站、桌面应用程序、移动应用程序等。然而,编写高质量的JavaScript代码并不容易。在本文中,我们将探讨一些JavaScript编程技巧,以提高代码质量。...
    99+
    2023-10-15
    编程算法 javascript git
  • PHP-FPM性能优化:提高网站代码质量的调试技巧
    标题:PHP-FPM性能优化:提高网站代码质量的调试技巧概述:随着互联网的快速发展,网站的性能优化成为了前端和后端开发者们极其关注的焦点之一。而作为后端开发者的我们,如果能够通过调试技巧来提高网站代码的质量和性能,将能够为用户提供更好的体验...
    99+
    2023-10-21
    性能优化 php-fpm 调试技巧
  • IDE同步和PHP重定向:如何提高你的代码质量?
    在软件开发过程中,代码质量是非常重要的。因为代码质量不仅关系到软件的功能和性能,也关系到软件的可维护性和可扩展性。因此,开发者需要采取一些措施来提高代码质量。本文将介绍两种方法:IDE同步和PHP重定向,以帮助你提高代码质量。 IDE同步...
    99+
    2023-07-07
    重定向 ide 同步
  • 如何通过 PHP 函数参数的类型来提高代码质量?
    php 中的参数类型检查可提高代码质量:声明函数参数类型,如 function myfunction(int $number, string $name)。进行类型检查,从而提前检测错误...
    99+
    2024-04-10
    代码质量
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作