PHPUnit桥接
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.3,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
PHPUnit桥接
PHPUnit Bridge提供了报告遗留测试和弃用代码使用情况的实用程序,以及时间敏感型测试的帮助程序。
它具有以下功能:
- 强制测试使用一致的区域设置(
C
); - Auto-register
class_exists
加载Doctrine注释(当使用时); - 它显示了应用程序中使用的已弃用特性的整个列表;
- 按需显示弃用的堆栈跟踪;
- 提供了一个
ClockMock
而且DnsMock
用于时间或网络敏感测试的助手类。 - 提供不嵌入的PHPUnit的修改版本
ob娱乐下载symfony / yaml
也不预言
以防止与这些依赖项发生冲突。
安装
你可以用两种不同的方式安装组件:
- 通过Composer安装(
ob娱乐下载symfony / phpunit-bridge
在Packagist);作为一个dev
依赖; - 使用官方Git存储库(https://github.com/ob娱乐下载symfony/phpunit-bridge).
然后,要求供应商/ autoload.php
文件以启用Composer提供的自动加载机制。否则,您的应用程序将无法找到这个Symfony组件的类。ob娱乐下载
如果你打算PHPUnit桥接并且使用常规的PHPUnit脚本(不是Symfony提供的修改后的PHPUnit脚本),您必须注册一个新的ob娱乐下载测试监听器被称为ob娱乐下载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”><!——……--><听众><侦听器类=“ob娱乐下载Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”/>听众>phpunit)>
使用
一旦组件被安装,asimple-phpunit
脚本在供应商/
目录运行测试。这个脚本包装了原始的PHPUnit二进制文件,以提供更多的功能:
1 2
$cd我的项目/$/供应商/ bin / simple-phpunit
在运行你的PHPUnit测试之后,你会得到一个类似于下面的报告:
总结内容包括:
- Unsilenced
- 报告在没有建议的情况下触发的弃用通知@-silencing运营商.
- 遗产
- 弃用通知表示显式测试某些遗留特性的测试。
- 剩余的/其他
- 弃用通知是所有其他(非遗留)通知,按消息、测试类和方法分组。
请注意
如果你不想用simple-phpunit
脚本,注册以下内容PHPUnit事件监听器在PHPUnit配置文件中获得相同的关于弃用的报告(该报告由PHP错误处理程序被称为DeprecationErrorHandler):
1 2 3 4 5
<!——phpunit.xml.dist——><!——……--><听众><侦听器类=“ob娱乐下载Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”/>听众>
触发弃用通知
使用以下命令可以触发弃用通知:
1
@trigger_error (“您的弃用信息”, E_USER_DEPRECATED);
没有@-silencing运营商,用户将需要选择退出弃用通知。默认情况下,沉默可以交换这种行为,并允许用户在准备好应对这些错误时选择加入(通过添加一个自定义错误处理程序,就像这个桥所提供的那样)。未静音时,弃用通知将出现在Unsilenced部分的弃用报告。
将测试标记为遗产
有三种方法将测试标记为遗留:
- (推荐)加上
@group遗留
类或方法的注释; - 的类名开始
遗产
前缀; - 使其方法名以
testLegacy * ()
而不是测试* ()
.
请注意
如果数据提供程序调用的代码通常会触发弃用,则可以在其名称前加上provideLegacy
或getLegacy
为了消除这些反对意见。如果您的数据提供程序没有执行废弃的代码,那么不需要选择特殊的命名,因为数据提供程序提供的测试被标记为遗留的。
还要注意,选择两个遗留前缀之一将不会将使用此数据提供程序的测试标记为遗留测试。您仍然必须显式地将它们标记为遗留测试。
配置
如果需要检查单元测试触发的特定弃用的堆栈跟踪,则可以设置ob娱乐下载SYMFONY_DEPRECATIONS_HELPER
环境变量到与此弃用消息匹配的正则表达式,并用/
.例如,使用:
12 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_DIR”价值=“应用程序/”/><env的名字=“ob娱乐下载SYMFONY_DEPRECATIONS_HELPER”价值=“foobar /”/>php>phpunit)>
PHPUnit)将停止您的测试套件一旦弃用通知被触发,其消息包含“foobar”
字符串。
使测试失败
默认情况下,任何非遗留标记或任何非“@-silenced”_弃用通知将使测试失败。另外,设置ob娱乐下载SYMFONY_DEPRECATIONS_HELPER
到任意值(例如:320
)将使测试仅在达到较高数量的弃用通知(0
为默认值)。您也可以设置该值“弱”
这将使桥忽略任何弃用通知。这对于由于向后兼容性原因而必须使用弃用接口的项目非常有用。
在维护库时,一旦依赖项引入了新的弃用,就让测试套件失败是不可取的,因为这会将修复该弃用的负担转移到恰好在带有该弃用的新供应商发布后不久提交了pull请求的任何贡献者身上。为了缓解这一问题,您可以使用更严格的需求,希望依赖关系不会在补丁版本中引入弃用,或者甚至提交Composer锁文件,这将产生另一类问题。图书馆将经常使用ob娱乐下载SYMFONY_DEPRECATIONS_HELPER =弱
正因为如此。这样做的缺点是允许引入弃用的贡献,但是:
- 忘记修复被弃用的调用,如果有任何;
- 属性标记适当的测试
@group遗留
注释。
通过使用“weak_vendors”
对象之外触发的弃用供应商
目录将使测试套件失败,而由其中的库触发的弃用则不会,这为您提供了两全其美的方法。
禁用弃用助手
设置ob娱乐下载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 (“Bar”方法的第二个参数已弃用。”, E_USER_DEPRECATED);}
对时间敏感的测试
用例
如果你有这种与时间相关的测试:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用PHPUnit)\框架\TestCase;使用ob娱乐下载\组件\秒表\秒表;类MyTest扩展TestCase{公共函数testSomething(){$秒表=新秒表();$秒表->开始(“event_name”);睡眠(10);$持续时间=$秒表->停止(“event_name”)->getDuration ();$这->assertequal (10000,$持续时间);}}
你使用了ob娱乐下载Symfony秒表组件要计算进程的持续时间,这里是10秒。但是,根据服务器负载或本地计算机上运行的进程的不同美元的持续时间
例如,可以是10.000023秒
而不是十年代
.
这种测试被称为瞬态测试:它们根据虚假和外部环境随机失败。它们经常在使用公共持续集成服务时造成麻烦,例如特拉维斯CI.
时钟嘲笑
的ClockMock类允许您模拟PHP的内置时间函数时间()
,()
,睡眠()
而且usleep ()
.
使用ClockMock
类中添加@group时效性
注释到它的类或方法。方法执行PHPUnit时,此注释才有效供应商/ bin / simple-phpunit
脚本或在PHPUnit配置中注册以下监听器时:
1 2 3 4 5
<!——phpunit.xml.dist——><!——……--><听众><侦听器类=“\ob娱乐下载 Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”/>听众>
请注意
如果你不想用@group时效性
注释,您可以注册ClockMock
通过调用ClockMock:注册(__CLASS__进行)
而且ClockMock: withClockMock(真正的)
在考试之前ClockMock:: withClockMock(假)
考试后。
因此,以下保证工作,不再是一个瞬态测试:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用PHPUnit)\框架\TestCase;使用ob娱乐下载\组件\秒表\秒表;/ * * *@group对时间敏感的* /类MyTest扩展TestCase{公共函数testSomething(){$秒表=新秒表();$秒表->开始();睡眠(10);$持续时间=$秒表->停止();$这->assertequal (10,$持续时间);}}
这就是全部!
提示
的额外好处ClockMock
阶级就是时间瞬间流逝。使用PHP的睡眠(10)
将使您的测试等待10秒(或多或少)。相比之下,ClockMock
类将内部时钟向前推进给定的秒数,而无需实际等待该时间,因此您的测试将快10秒执行。
DNS-sensitive测试
建立网络连接的测试(例如检查DNS记录的有效性)可能由于网络条件而执行缓慢且不可靠。因此,该组件还提供了以下PHP函数的模拟:
- checkdnsrr
- dns_check_record
- getmxrr
- dns_get_mx
- gethostbyaddr
- gethostbyname
- gethostbynamel
- dns_get_record
用例
方法的示例如下checkMX
选项电子邮件
测试电子邮件域有效性的约束:
12 3 4 5 6 7 8 9 10 11 12 13 14
使用PHPUnit)\框架\TestCase;使用ob娱乐下载\组件\验证器\约束\电子邮件;类MyTest扩展TestCase{公共函数testEmail(){$验证器=……$约束=新电子邮件(数组(“checkMX”= >真正的));$结果=$验证器->validate (“foo@example.com”,$约束);/ /……}
为了避免进行真正的网络连接,请添加@dns-sensitive
类的注释,并使用DnsMock: withMockedHosts ()
要配置您希望获得的给定主机的数据:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用PHPUnit)\框架\TestCase;使用ob娱乐下载\组件\验证器\约束\电子邮件;/ * * *@groupdns-sensitive * /类MyTest扩展TestCase{公共函数testEmails(){DnsMock::withMockedHosts (数组(“example.com”= >数组(数组(“类型”= >“MX”))));$验证器=……$约束=新电子邮件(数组(“checkMX”= >真正的));$结果=$验证器->validate (“foo@example.com”,$约束);/ /……}
的withMockedHosts ()
方法配置定义为一个数组。键是模拟的主机,值是返回的相同格式的DNS记录数组dns_get_record,可以模拟不同的网络情况:
12 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
注释“按照约定”工作,并假设测试类的名称空间可以通过删除测试\
部分来自test名称空间。也就是说,如果您的测试用例完全限定类名(FQCN)是应用\ \看\ DummyWatchTest测试
,它假设测试的类名称空间为App \看
.
如果此约定不适用于您的应用程序,请在phpunit.xml
文件,例如在HttpKernel组件:
12 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”><!——……--><听众><侦听器类=“ob娱乐下载Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”><参数><数组><元素关键=“时效性”><字符串>ob娱乐下载Symfony \ \ HttpFoundation组件字符串>元素>数组>参数>侦听器>听众>phpunit)>
修改PHPUnit脚本
3.2
修改后的PHPUnit脚本在该组件的3.2版本中引入。
这个桥提供了PHPUnit的修改版本,您可以使用它来调用bin / simple-phpunit
命令。它具有以下特点:
- 不嵌入
ob娱乐下载symfony / yaml
也不预言
为了防止与这些依赖项发生冲突; - 使用PHPUnit 4.8时运行的PHP <=5.5和PHPUnit 5.3时运行的PHP >=5.6;
- 控件时收集并重放跳过的测试
ob娱乐下载SYMFONY_PHPUNIT_SKIPPED_TESTS
定义了Env var: Env var应该指定一个文件名,该文件名将用于存储第一次运行时跳过的测试,并在第二次运行时重播它们; - 当给定一个目录作为参数时,并行执行测试套件,扫描该目录
phpunit.xml.dist
档案最高可达ob娱乐下载SYMFONY_PHPUNIT_MAX_DEPTH
级别(指定为env变量,默认为3.
);
脚本将它构建的修改后的PHPUnit写入一个目录,该目录可以由ob娱乐下载SYMFONY_PHPUNIT_DIR
Env变量,或者在与simple-phpunit
如果没有提供。
如果你已经通过Composer安装了桥接器,你可以调用e.g.来运行它:
1
供应商/ bin / simple-phpunit美元
提示
设置ob娱乐下载SYMFONY_PHPUNIT_VERSION
环境变量。5.5
将PHPUnit的基本版本更改为5.5
而不是默认5.3
.
提示
如果你还需要的话预言
(但不ob娱乐下载symfony / yaml
),然后设置ob娱乐下载SYMFONY_PHPUNIT_REMOVE
环境变量ob娱乐下载symfony / yaml
.