PHPUnit)大桥

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.0,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

PHPUnit)大桥

PHPUnit)大桥提供了实用程序来报告遗留测试和使用废弃的代码和一个辅助时间敏感测试。

它有以下特点:

  • 力测试使用一致的语言环境(C);
  • Auto-registerclass_exists加载教义注释(使用时);
  • 它显示整个弃用功能列表应用程序中使用;
  • 弃用按需显示堆栈跟踪;
  • 提供了一个ClockMockDnsMock助手类时间或网络敏感测试。
  • 提供了一个修改版的PHPUnit)不嵌入欧宝娱乐app下载地址symfony / yaml也不预言防止冲突与这些依赖关系。

安装

1
美元作曲家要求——戴夫“欧宝娱乐app下载地址symfony / phpunit-bridge: *”

或者,您可以克隆的https://github.com/欧宝娱乐app下载地址symfony/phpunit-bridge存储库。

请注意

如果你安装这个组件之外的Symfony应用程序,你必须要求欧宝娱乐app下载地址供应商/ autoload.php文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。

请注意

PHPUnit)大桥设计使用Symfony组件的所有维护版本,甚至在不同的主要版本。欧宝娱乐app下载地址你应该总是使用最新的稳定主要版本得到最准确的弃用的报告。

如果你计划PHPUnit)大桥和使用常规PHPUnit)脚本(不是Symfony提供的修改后的PHPUnit)脚本),你必须注册一个新的欧宝娱乐app下载地址测试监听器被称为欧宝娱乐app下载地址SymfonyTestsListener:

1 2 3 4 5 6 7 8 9 10 11
< !——http://phpunit.de/manual/6.0/en/appendixes.configuration.html——><phpunit)xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: noNamespaceSchemaLocation=“http://schema.phpunit.de/6.0/phpunit.xsd”>< !——……- - ><听众><侦听器=“欧宝娱乐app下载地址Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”/ >< /听众>< /phpunit)>

使用

另请参阅

这篇文章解释了如何使用PhpUnitBridge功能作为一个独立的组件在任何PHP应用程序。读了测试文章在Symfony应用程序了解如何使用它。欧宝娱乐app下载地址

一旦安装组件,simple-phpunit在创建脚本供应商/目录来运行测试。这个脚本包原PHPUnit)二进制提供更多的功能:

1 2
美元cd我的项目/美元/供应商/ bin / simple-phpunit

运行PHPUnit)测试后,你会得到一个报告类似于这一个:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
美元。/供应商/ bin / simple-phpunit塞巴斯蒂安·伯格曼PHPUnit)。配置<您的项目> / phpunit.xml。dist .................时间:1.77秒,记忆:5.75 mb OK(17日测试,21日断言)剩余的通知(2)getEntityManager弃用,因为Symfony 2.1。欧宝娱乐app下载地址使用getManager: 2 x 1 xDefaultControllerTest: testPublicUrls从应用\ \测试控制器1 xBlogControllerTest: testIndex从应用\ \测试控制器

摘要包括:

Unsilenced
没有推荐的报告被触发的警告注意事项@-silencing运营商
遗产
弃用通知表示明确测试一些遗留的特性。
剩余的/其他
弃用通知所有其他(non-legacy)通知,按消息分组,测试类和方法。

请注意

如果你不想使用simple-phpunit脚本,注册后PHPUnit)事件监听器PHPUnit)配置文件中得到相同的报告不支持(这是由一个PHP错误处理程序被称为DeprecationErrorHandler):

1 2 3 4 5
< !——phpunit.xml。区域- - >< !——……- - ><听众><侦听器=“欧宝娱乐app下载地址Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”/ >< /听众>

触发的通知

弃用通知可以通过使用触发:

1
@trigger_error (“你的弃用信息”,E_USER_DEPRECATED);

没有@-silencing运营商从弃用通知,用户需要选择退出。沉默的违约互换这种行为时,允许用户选择他们已经准备好应付(通过添加一个自定义错误处理程序提供的桥)。不沉默时,通知将会出现Unsilenced弃用的报告。

马克测试遗留

有三种方法可以测试标记为遗产:

  • (推荐)添加@group遗留注释的类或方法;
  • 使其类名开始遗产前缀;
  • 使其方法名称开始testLegacy * ()而不是测试* ()

请注意

如果您的数据提供者调用的代码通常会引发弃用,你可以它的名字前面加上provideLegacygetLegacy沉默的这些用法。如果您的数据提供者不执行弃用代码,不需要选择一个特殊的命名只是因为测试数据提供者被标记为美联储的遗产。

也请注意,选择其中一个遗留前缀不会马克测试作为遗产,利用这些数据提供者。你仍然有显式地将它们标记为遗留测试。

配置

以防你需要检查一个特定的堆栈跟踪弃用触发你的单元测试,您可以设置欧宝娱乐app下载地址SYMFONY_DEPRECATIONS_HELPER环境变量正则表达式匹配这个弃用的信息,附上/。例如,使用:

1 2 3 4 5 6 7 8 9 10 11 12
< !——http://phpunit.de/manual/6.0/en/appendixes.configuration.html——><phpunit)xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: noNamespaceSchemaLocation=“http://schema.phpunit.de/6.0/phpunit.xsd”>< !——……- - ><php><服务器的名字=“KERNEL_CLASS”价值=“应用程序\内核”/ ><env的名字=“欧宝娱乐app下载地址SYMFONY_DEPRECATIONS_HELPER”价值=“foobar /”/ >< /php>< /phpunit)>

PHPUnit)测试套件将停止一次弃用通知触发消息包含了谁的“foobar”字符串。

使测试失败

默认情况下,任何non-legacy-tagged或任何非“@-silenced”_弃用通知将使测试失败。另外,设置欧宝娱乐app下载地址SYMFONY_DEPRECATIONS_HELPER一个任意值(例:320年)将使测试失败只有达到更高数量的通知(0是默认值)。你也可以设置值“弱”这将使桥忽略任何的通知。这是有用的项目,必须使用弃用接口原因向后兼容性。

当你保持一个图书馆,在测试套件失败一旦依赖引入了一个新的弃用不可取,因为它变化的负担修理,弃用任何贡献者提交拉请求一个新的供应商发布后不久,弃用。减轻,可以使用更严格的要求,希望依赖不会介绍不支持在一个补丁版本,甚至提交作曲家锁文件,这将创建另一个类的问题。库通常会使用欧宝娱乐app下载地址SYMFONY_DEPRECATIONS_HELPER =弱因为这个。这允许贡献的缺点,不支持但介绍:

  • 忘了如果有任何解决弃用打电话;
  • 忘了马克与适当的测试@group遗留注释。

通过使用“weak_vendors”值,不支持外触发的供应商目录将测试套件的失败,而不支持从一个图书馆里面不会触发,给你最好的两个世界。

禁用弃用的助手

设置欧宝娱乐app下载地址SYMFONY_DEPRECATIONS_HELPER环境变量来禁用完全禁用弃用的助手。这是有用的利用该组件提供的其他功能没有得到错误或与此相关的信息。

写断言的用法

当添加不支持你的代码,你可能喜欢编写测试,验证他们根据需要触发。为此,提供的桥梁@expectedDeprecation注释,您可以使用在你的测试方法。它需要你通过预期的消息,在相同的格式PHPUnit)的assertStringMatchesFormat ()方法。如果你期望不止一个弃用信息对于一个给定的测试方法,您可以使用注释几次(顺序问题):

1 2 3 4 5 6 7 8 9 10
/ * * *@group遗留*@expectedDeprecation这种“% s”方法是弃用。*@expectedDeprecation“% s”方法的第二个参数是弃用。* /公共函数testDeprecatedCode(){@trigger_error (不建议使用这个“Foo”方法。,E_USER_DEPRECATED);@trigger_error (”“酒吧”方法的第二个参数是弃用。,E_USER_DEPRECATED);}

对时间敏感的测试

用例

如果你有这种与时间相关的测试:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用PHPUnit)\框架\TestCase;使用欧宝娱乐app下载地址\组件\秒表\秒表;MyTest扩展TestCase{公共函数testSomething(){美元秒表=秒表();美元秒表- >开始(“event_name”);睡眠(10);美元持续时间=美元秒表- >停止(“event_name”)- >getDuration ();美元- >assertequal (10000年,美元持续时间);}}

你使用了欧宝娱乐app下载地址Symfony秒表组件计算过程的持续时间,这10秒。然而,根据服务器的负载或在本地机器上运行的进程,美元的持续时间例如可以10.000023秒而不是十年代

这种测试被称为瞬态测试:他们没有根据伪随机和外部环境。他们经常使用公共持续集成服务时带来麻烦特拉维斯CI

时钟嘲笑

ClockMock这座桥提供的类允许您模拟PHP的内置时间函数时间(),(),睡眠()usleep ()

使用ClockMock在您的测试类,添加@group时效性注释的类或方法。这个注释只适用在执行PHPUnit)时使用供应商/ bin / simple-phpunit脚本或当注册侦听器在PHPUnit)配置如下:

1 2 3 4 5
< !——phpunit.xml。区域- - >< !——……- - ><听众><侦听器=“\欧宝娱乐app下载地址 Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”/ >< /听众>

请注意

如果你不想使用@group时效性注释,您可以注册ClockMock类手动通过调用ClockMock:注册(__CLASS__进行)ClockMock: withClockMock(真正的)在测试前,ClockMock:: withClockMock(假)在测试之后。

因此,以下是保证工作,不再是一个瞬态测试:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用PHPUnit)\框架\TestCase;使用欧宝娱乐app下载地址\组件\秒表\秒表;/ * * *@group对时间敏感的* /MyTest扩展TestCase{公共函数testSomething(){美元秒表=秒表();美元秒表- >开始(“event_name”);睡眠(10);美元持续时间=美元秒表- >停止(“event_name”)- >getDuration ();美元- >assertequal (10000年,美元持续时间);}}

这就是一切!

提示

使用一个额外的好处ClockMock类是时间的流逝。使用PHP的睡眠(10)会使你的实际测试等待10秒(或多或少)。相比之下,ClockMock类进步的内部时钟的秒数没有实际等待时间,因此您的测试将执行10秒更快。

DNS-sensitive测试

测试网络连接,例如检查DNS记录的有效性,可以执行缓慢和不可靠网络的条件。出于这个原因,该组件还提供了模拟这些PHP函数:

用例

考虑下面的示例,它使用checkMX选择的电子邮件测试电子邮件域的有效性约束:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用PHPUnit)\框架\TestCase;使用欧宝娱乐app下载地址\组件\验证器\约束\电子邮件;MyTest扩展TestCase{公共函数testEmail(){美元验证器=……美元约束=电子邮件(数组(“checkMX”= >真正的));美元结果=美元验证器- >validate (“foo@example.com”,美元约束);/ /……}

为了避免使一个真正的网络连接,添加@dns-sensitive注释的类,并使用DnsMock: withMockedHosts ()配置数据能够得到给定主机:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用PHPUnit)\框架\TestCase;使用欧宝娱乐app下载地址\组件\验证器\约束\电子邮件;/ * * *@groupdns-sensitive * /MyTest扩展TestCase{公共函数testEmails(){DnsMock::withMockedHosts (数组(“example.com”= >数组(数组(“类型”= >“MX”))));美元验证器=……美元约束=电子邮件(数组(“checkMX”= >真正的));美元结果=美元验证器- >validate (“foo@example.com”,美元约束);/ /……}

withMockedHosts ()方法配置被定义为一个数组。键是嘲笑主机和DNS记录的值是数组返回相同的格式dns_get_record,所以你可以模拟不同网络条件:

1 2 3 4 5 6 7 8 9 10 11 12
DnsMock::withMockedHosts (数组(“example.com”= >数组(数组(“类型”= >“一个”,“知识产权”= >“为1.2.3.4”),数组(“类型”= >“AAAA”,“ipv6”= >“::12”))));

故障排除

@group时效性@group dns-sensitive注释工作“按照惯例”和假设测试类的名称空间可以获得的测试\部分的测试名称空间。例如,如果您的测试用例完全限定类名(FQCN)应用\ \看\ DummyWatchTest测试,它假定测试类的名称空间App \看

如果本公约不工作为您的应用程序,配置的嘲笑名称空间phpunit.xml文件,例如在完成HttpKernel组件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
< !——http://phpunit.de/manual/4.1/en/appendixes.configuration.html——><phpunit)xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: noNamespaceSchemaLocation=“http://schema.phpunit.de/4.1/phpunit.xsd”>< !——……- - ><听众><侦听器=“欧宝娱乐app下载地址Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”><参数><数组><元素关键=“时效性”><字符串>欧宝娱乐app下载地址Symfony \ \ HttpFoundation组件< /字符串>< /元素>< /数组>< /参数>< /侦听器>< /听众>< /phpunit)>

PHPUnit)修改脚本

这座桥提供PHPUnit)的修改版本,您可以通过使用它的调用bin / simple-phpunit命令。它具有以下特点:

  • 不嵌入欧宝娱乐app下载地址symfony / yaml也不预言防止任何与这些依赖项的冲突;
  • 使用PHP运行时使用的4.8 PHPUnit) < = 5.5, PHPUnit) 5.7运行时使用PHP > = 5.6和6.5 PHPUnit)运行时使用PHP > = 7.2;
  • 收集和回放时跳过测试欧宝娱乐app下载地址SYMFONY_PHPUNIT_SKIPPED_TESTSenv var定义:env var应该指定一个文件名,将用于存储在第一次运行跳过测试,然后重复它们在第二次运行;
  • 对测试套件执行当给定一个目录作为参数,扫描该目录phpunit.xml.dist文件到欧宝娱乐app下载地址SYMFONY_PHPUNIT_MAX_DEPTH水平(env var,指定默认值3);

脚本编写修改PHPUnit)它构建在一个可配置的目录欧宝娱乐app下载地址SYMFONY_PHPUNIT_DIRenv var,或在相同的目录中simple-phpunit如果不提供。

如果你已经安装了桥通过作曲家,您可以运行它通过调用。例如:

1
供应商/ bin / simple-phpunit美元

提示

设置欧宝娱乐app下载地址SYMFONY_PHPUNIT_VERSION如env var。5.5改变PHPUnit)的基本版本5.5而不是默认的5.3

提示

如果你仍然需要使用预言(但不欧宝娱乐app下载地址symfony / yaml),然后设置欧宝娱乐app下载地址SYMFONY_PHPUNIT_REMOVEenv var来欧宝娱乐app下载地址symfony / yaml

代码覆盖率侦听器

默认情况下,代码覆盖率计算使用以下规则:如果一行代码执行,那么它被标记为覆盖。和测试执行一行代码因此标记为“覆盖行代码”。这可能会误导人。

考虑下面的例子:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35
酒吧{公共函数barMethod(){返回“酒吧”;}}喷火{私人美元酒吧;公共函数__construct(酒吧美元酒吧){美元- >酒吧=美元酒吧;}公共函数fooMethod(){美元- >酒吧- >barMethod ();返回“酒吧”;}}扩展PHPUnit)\框架\TestCase{公共函数测试(){美元酒吧=酒吧();美元喷火=Foo (美元酒吧);美元- >assertSame (“酒吧”,美元喷火- >fooMethod ());}}

脚:测试方法执行每一行代码喷火酒吧类,但酒吧不是真正的考验。的CoverageListener旨在解决这个问题通过添加适当的行为@covers注释在每一个测试类。

如果一个测试类已经定义了@covers没有注释,这侦听器。否则,它试图找到相关的代码到测试的测试部分的名称:我\名称空间\ \脚测试- >我\名称空间\ Foo

安装

添加以下配置的phpunit.xml.dist文件

1 2 3 4 5 6 7 8 9 10 11
< !——http://phpunit.de/manual/6.0/en/appendixes.configuration.html——><phpunit)xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: noNamespaceSchemaLocation=“http://schema.phpunit.de/6.0/phpunit.xsd”>< !——……- - ><听众><侦听器=“欧宝娱乐app下载地址Symfony \ \ PhpUnit) \ CoverageListener桥”/ >< /听众>< /phpunit)>

如果用于查找相关代码的逻辑太简单或不适合您的应用程序,您可以使用自己的SUT(被测系统)解决:

1 2 3 4 5 6 7
<听众><侦听器=“欧宝娱乐app下载地址Symfony \ \ PhpUnit) \ CoverageListener桥”><参数><字符串>我的\ \ SutSolver:名称空间:解决< /字符串>< /参数>< /侦听器>< /听众>

我的\ \ SutSolver:名称空间:解决可以是任何PHP调用和接收当前测试名称作为第一个参数。

最后,听众也可以显示警告消息当SUT的解算器找不到SUT:

1 2 3 4 5 6 7 8
<听众><侦听器=“欧宝娱乐app下载地址Symfony \ \ PhpUnit) \ CoverageListener桥”><参数></ ><布尔>真正的< /布尔>< /参数>< /侦听器>< /听众>
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。