PHPUnit桥接
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
PHPUnit桥接
PHPUnit Bridge提供了报告遗留测试和废弃代码使用情况的实用程序,以及模拟与时间、DNS和类存在相关的本地函数的帮助程序。
它具有以下功能:
- 强制测试使用一致的区域设置(
C
)(如果创建区域敏感的测试,请使用PHPUnit的setLocale ()
方法); - Auto-register
class_exists
加载Doctrine注释(当使用时); - 它显示了应用程序中使用的已弃用特性的整个列表;
- 按需显示弃用的堆栈跟踪;
- 提供了一个
ClockMock
,DnsMock
而且ClassExistsMock
类用于对时间、网络或类存在敏感的测试; - 提供PHPUnit的修改版本,允许1。将应用程序的依赖项与phpunit的依赖项分离,以防止应用任何不必要的约束;2.当一个测试套件被分成几个phpunit.xml文件时,并行运行测试;3.记录并重放跳过的测试;
- 它允许创建与多个PHPUnit版本兼容的测试(因为它为缺少的方法提供了填充,为非名称空间类提供了名称空间别名,等等)。
安装
1
$创建symfony/phpunit-bridgob娱乐下载e
请注意
如果在Symfony应用程序外部安装此组件,则必须要求ob娱乐下载供应商/ autoload.php
文件,以启用Composer提供的类自动加载机制。读这篇文章欲知详情。
请注意
PHPUnit桥设计用于使用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=“https://schema.phpunit.de/6.0/phpunit.xsd”><!——……--><听众><侦听器类=“ob娱乐下载Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”/>听众>phpunit)>
使用
另请参阅
本文解释了如何在任何PHP应用程序中使用PhpUnitBridge特性作为独立组件。读了测试文章,以了解如何在Symfony应用程序中使用它。ob娱乐下载
一旦组件被安装,asimple-phpunit
脚本在供应商/
目录运行测试。这个脚本包装了原始的PHPUnit二进制文件,以提供更多的功能:
1 2
$cd我的项目/$/供应商/ bin / simple-phpunit
在运行你的PHPUnit测试之后,你会得到一个类似于下面的报告:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
$./vendor/bin/simple-phpunit配置读从<项目> / phpunit.xml。经销 .................时间:1.77秒,内存:5.75Mb OK(17个测试,21个断言)剩余的弃用通知(2)getEntityManager自Symfony 2.1以来已弃用。ob娱乐下载请使用getManager: 2x 1x在DefaultControllerTest:: testpublicurl from App\Tests\Controller 1x在BlogControllerTest::testIndex来自App\Tests\Controller
总结内容包括:
- Unsilenced
- 报告在没有建议的情况下触发的弃用通知@-silencing运营商.
- 遗产
- 弃用通知表示显式测试某些遗留特性的测试。
- 剩余的/其他
- 弃用通知是所有其他(非遗留)通知,按消息、测试类和方法分组。
请注意
如果你不想用simple-phpunit
脚本,注册以下内容PHPUnit事件监听器在PHPUnit配置文件中获得相同的关于弃用的报告(该报告由PHP错误处理程序被称为DeprecationErrorHandler):
1 2 3 4 5
<!——phpunit.xml.dist——><!——……--><听众><侦听器类=“ob娱乐下载Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”/>听众>
并行运行测试
修改后的PHPUnit脚本允许通过提供包含多个测试套件的目录来并行运行测试phpunit.xml.dist
.
1 2 3 4 5 6 7
├──tests/│├──Functional/││├──…││├──phpunt .xml.dist│├──Unit/││├──…││├─phpunt .xml.dist
1
$/ /供应商/ bin / simple-phpunit测试
修改后的PHPUnit脚本将递归地遍历所提供的目录,最多可遍历3个子目录或环境变量指定的值ob娱乐下载SYMFONY_PHPUNIT_MAX_DEPTH
,寻找phpunit.xml.dist
文件,然后并行运行它找到的每个套件,收集它们的输出,并在各自的部分中显示每个测试套件的结果。
触发弃用通知
使用可以触发弃用通知trigger_deprecation
从ob娱乐下载symfony / deprecation-contracts
包:
1 2 3 4 5
//表示vendor-name/packagename的某些内容自版本1.3以来已弃用trigger_deprecation (“商家名称/包名称”,“1.3”,“您的弃用信息”);//你也可以使用printf格式(消息后的所有参数都将被使用)trigger_deprecation (“……”,“1.3”,“值“%s”已弃用,使用…相反。”,$价值);
将测试标记为遗产
有三种方法将测试标记为遗留:
- (推荐)加上
@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=“https://schema.phpunit.de/6.0/phpunit.xsd”><!——……--><php><服务器的名字=“KERNEL_CLASS”价值=“应用程序\内核”/><env的名字=“ob娱乐下载SYMFONY_DEPRECATIONS_HELPER”价值=“foobar /”/>php>phpunit)>
PHPUnit)将停止您的测试套件一旦弃用通知被触发,其消息包含“foobar”
字符串。
使测试失败
默认情况下,任何非遗留标记或任何非' @-silenced <@-silencing运算符> ' _弃用通知将使测试失败。或者,您也可以通过设置来配置任意阈值ob娱乐下载SYMFONY_DEPRECATIONS_HELPER
来马克斯(总)= 320
例如。只有当达到较高数量的弃用通知时,才会使测试失败(0
为默认值)。
控件的其他键可以进行更细粒度的控制马克斯
数组,它们是自我
,直接
,间接
.的ob娱乐下载SYMFONY_DEPRECATIONS_HELPER
环境变量接受url编码的字符串,这意味着你可以结合阈值和任何其他配置设置,如下所示:ob娱乐下载SYMFONY_DEPRECATIONS_HELPER = '马克斯(总)= 42马克斯(自我)= 0 verbose = 0 '
内部的用法
在维护库时,一旦依赖项引入了新的弃用,就让测试套件失败是不可取的,因为这会将修复该弃用的负担转移到恰好在带有该弃用的新供应商发布后不久提交了pull请求的任何贡献者身上。
为了缓解这个问题,您可以使用更严格的需求,希望依赖关系不会在补丁版本中引入弃用,或者甚至提交composer.lock
文件,这会产生另一类问题。图书馆将经常使用ob娱乐下载SYMFONY_DEPRECATIONS_HELPER = max(总)= 999999
正因为如此。这样做的缺点是允许引入弃用的贡献,但是:
- 忘记修复被弃用的调用,如果有任何;
- 属性标记适当的测试
@group遗留
注释。
通过使用ob娱乐下载SYMFONY_DEPRECATIONS_HELPER = max(自我)= 0
的外部触发的弃用供应商
目录将单独考虑,而从其中的库触发的弃用将不会(除非您达到其中的999999个),为您提供两全其美的方法。
直接和间接弃用
当你在做一个项目时,你可能会更感兴趣马克斯(直接)
.假设您希望在弃用出现时立即修复它们。许多开发人员遇到的一个问题是,他们拥有的一些依赖项往往落后于他们自己的依赖项,这意味着他们不能尽快修复弃用的问题,这意味着您应该在过时的供应商上创建一个拉请求,并忽略这些弃用,直到您的拉请求被合并。
的马克斯(直接)
配置允许您只对直接弃用设置一个阈值,允许您注意到你的代码正在使用已弃用的api,并跟上变化。你仍然可以使用马克斯(间接)
如果您希望将间接弃用保持在给定的阈值以下。
下面是一个总结,可以帮助你选择正确的配置:
价值 | 推荐情况 |
---|---|
马克斯(总)= 0 | 推荐用于具有健壮/无依赖关系的积极维护的项目 |
马克斯(直接)= 0 | 建议用于依赖项无法跟上新弃用的项目。 |
马克斯(自我)= 0 | 推荐给那些自己使用弃用系统且无法负担使用上述模式之一的库。 |
关闭Verbose输出
默认情况下,桥将显示一个详细的输出,其中包括弃用的数量以及弃用的位置。如果这对你来说太多了,你可以用ob娱乐下载SYMFONY_DEPRECATIONS_HELPER = verbose = 0
关闭详细输出。
还可以根据弃用类型更改冗长。例如,使用安静的[]= indirect&quiet [] =
将隐藏类型“间接”和“其他”的弃用细节。
5.1
的安静的
选项在Symfony 5.1中引入。ob娱乐下载
禁用弃用助手
设置ob娱乐下载SYMFONY_DEPRECATIONS_HELPER
环境变量为禁用= 1
完全禁用弃用帮助程序。这对于使用该组件提供的其他特性而不会得到与弃用相关的错误或消息非常有用。
自动加载时的弃用通知
默认情况下,PHPUnit桥接使用DebugClassLoader
从ErrorHandler组件在类自动加载时抛出弃用通知。方法可以禁用此功能debug-class-loader
选择。
12 3 4 5 6 7 8 9 10 11 12
<!——phpunit.xml.dist——><!——……--><听众><侦听器类=“ob娱乐下载Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”><参数><数组><!——将此选项设置为0以禁用DebugClassLoader集成——><元素关键=“debug-class-loader”><整数>0整数>元素>数组>参数>侦听器>听众>
编译时的用法
使用调试:容器
命令列出在编译和预热容器期间生成的弃用项:
1
$PHP bin/console debug:container——deprecations
5.1
的与此同时,
选项在Symfony 5.1中引入。ob娱乐下载
编写关于弃用的断言
在向代码中添加弃用项时,您可能喜欢编写测试来验证它们是否按要求被触发。为此,桥接提供expectDeprecation ()
可以在测试方法上使用的方法。它要求您传递预期的消息,该消息以与PHPUnit)的assertStringMatchesFormat ()方法。如果你期望一个给定的测试方法有多个弃用消息,你可以多次使用该方法(顺序很重要):
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
使用PHPUnit)\框架\TestCase;使用ob娱乐下载\桥\PhpUnit)\ExpectDeprecationTrait;类MyTest扩展TestCase{使用ExpectDeprecationTrait;/ * * *@group遗留* /公共函数testDeprecatedCode(){//测试一些代码,触发以下弃用:// trigger_deprecation('vendor-name/package-name', '5.1', 'This "Foo" method is deprecated.');$这->expectDeprecation (既然vendor-name/package-name 5.1:此“%s”方法已弃用);/ /……//测试一些代码,触发以下弃用:// trigger_deprecation('vendor-name/package-name', '4.4', ' Bar方法的第二个参数已弃用');$这->expectDeprecation (“由于vendor-name/package-name 4.4:“%s”方法的第二个参数已弃用。”);}}
5.1
ob娱乐下载5.1之前的Symfony版本还包含一个@expectedDeprecation
注释不赞成测试,但是不赞成使用该方法。
显示完整的堆栈跟踪
默认情况下,PHPUnit桥只显示弃用消息。若要显示与弃用相关的完整堆栈跟踪,请设置的值ob娱乐下载SYMFONY_DEPRECATIONS_HELPER
到匹配弃用消息的正则表达式。
例如,如果抛出以下弃用通知:
1 2
1x: Doctrine\Common\ClassLoader已弃用。1 x在EntityTypeTest::安装从Symfony\ob娱乐下载桥\学说\测试\形式\类型
运行以下命令将显示完整的堆栈跟踪:
1
$ob娱乐下载SYMFONY_DEPRECATIONS_HELPER ='/Doctrine\\Common\\ClassLoader已弃用\./'/供应商/ bin / simple-phpunit
使用多个PHPUnit版本进行测试
当测试一个必须与多个版本的PHP兼容的库时,测试套件不能使用最新版本的PHPUnit,因为:
- PHPUnit 8弃用了一些方法,取而代之的是旧版本中不可用的其他方法(例如PHPUnit 4);
- PHPUnit 8添加了
无效
返回类型到设置()
方法,该方法与PHP 5.5不兼容; - PHPUnit从PHPUnit 6开始切换到名称空间类,因此测试必须使用或不使用名称空间。
对于不可用方法的填充
当使用simple-phpunit
脚本,PHPUnit桥注入填充的大多数方法TestCase
而且断言
类(如。expectException ()
,expectExceptionMessage ()
,assertContainsEquals ()
等)。这允许使用最新的最佳实践编写测试用例,同时仍然与旧的PHPUnit版本兼容。
删除Void返回类型
当运行simple-phpunit
脚本使用ob娱乐下载SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT
环境变量设置为1
时,PHPUnit桥接将改变PHPUnit的代码以删除返回类型(在PHPUnit 8中引入)设置()
,tearDown ()
,setUpBeforeClass ()
而且tearDownAfterClass ()
方法。这允许您编写一个与PHP 5和PHPUnit 8兼容的测试。
或者,你也可以使用traitSetUpTearDownTrait的正确签名设置()
,tearDown ()
,setUpBeforeClass ()
而且tearDownAfterClass ()
方法,并将调用委托给doSetUp ()
,doTearDown ()
,doSetUpBeforeClass ()
而且doTearDownAfterClass ()
方法:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用PHPUnit)\框架\TestCase;使用ob娱乐下载\桥\PhpUnit)\SetUpTearDownTrait;类MyTest扩展TestCase{//当使用SetUpTearDownTrait时,doSetUp()等方法可以//被定义为'void'返回类型,如你所愿使用SetUpTearDownTrait;私人函数doSetUp(){/ /……}受保护的函数doSetUp():无效{/ /……}}
使用命名空间PHPUnit类
PHPUnit桥为大多数没有名称空间声明的PHPUnit类添加了名称空间类别名(例如;PHPUnit_Framework_Assert
),允许你总是使用命名空间类声明,即使测试是用PHPUnit 4执行的。
对时间敏感的测试
用例
如果你有这种与时间相关的测试:
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,$持续时间);}}
您使用秒表实用程序计算了进程的持续时间配置Symfonob娱乐下载y应用程序.但是,根据服务器负载或本地计算机上运行的进程的不同美元的持续时间
例如,可以是10.000023秒
而不是十年代
.
这种测试被称为瞬态测试:它们根据虚假和外部环境随机失败。它们经常在使用公共持续集成服务时造成麻烦,例如特拉维斯CI.
时钟嘲笑
的ClockMock类允许您模拟PHP的内置时间函数时间()
,()
,睡眠()
,usleep ()
而且函数()
.另外,函数日期()
是模拟的,因此如果没有指定时间戳,则使用模拟时间。
具有可选时间戳参数的其他函数,默认为时间()
仍将使用系统时间而不是模拟时间。这意味着您可能需要更改测试中的某些代码。例如,而不是新的DateTime ()
,你应该使用DateTime: createFromFormat(“U”,时间())
使用被嘲笑的时间()
函数。
使用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(){$秒表=新秒表();$秒表->开始(“event_name”);睡眠(10);$持续时间=$秒表->停止(“event_name”)->getDuration ();$这->assertequal (10000,$持续时间);}}
这就是全部!
谨慎
基于时间的函数模拟遵循PHP名称空间解析规则因此,“完全限定函数调用”(例如\(时间)
)不能被嘲笑。
的@group时效性
注释相当于调用ClockMock:注册(MyTest::类)
.如果要模拟在不同类中使用的函数,请显式地使用ClockMock:注册(MyClass::类)
:
12 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
//使用time()函数被模拟的类名称空间应用程序;类MyClass{公共函数getTimeInHours(){返回时间()/3600;}}//显式模拟外部time()函数的测试名称空间应用程序\测试;使用应用程序\MyClass;使用PHPUnit)\框架\TestCase;使用ob娱乐下载\桥\PhpUnit)\ClockMock;/ * * *@group对时间敏感的* /类MyTest扩展TestCase{公共函数testGetTimeInHours(){ClockMock::注册(MyClass::类);$我的=新MyClass ();$结果=$我的->getTimeInHours ();$这->assertequal() /(时间3600,$结果);}}
提示
的额外好处ClockMock
阶级就是时间瞬间流逝。使用PHP的睡眠(10)
将使您的测试等待10秒(或多或少)。相比之下,ClockMock
类将内部时钟向前推进给定的秒数,而无需实际等待该时间,因此您的测试将快10秒执行。
DNS-sensitive测试
建立网络连接的测试(例如检查DNS记录的有效性)可能由于网络条件而执行缓慢且不可靠。因此,该组件还提供了以下PHP函数的模拟:
- checkdnsrr
- dns_check_record
- getmxrr
- dns_get_mx
- gethostbyaddr
- gethostbyname
- gethostbynamel
- dns_get_record
用例
考虑下面的示例,该示例测试名为DomainValidator
它定义了checkDnsRecord
选项来验证域是否关联到有效的主机:
12 3 4 5 6 7 8 9 10 11 12 13
使用应用程序\验证器\DomainValidator;使用PHPUnit)\框架\TestCase;类MyTest扩展TestCase{公共函数testEmail(){$验证器=新DomainValidator ([“checkDnsRecord”= >真正的]);$isValid=$验证器->validate (“example.com”);/ /……}}
为了避免进行真正的网络连接,请添加@dns-sensitive
类的注释,并使用DnsMock: withMockedHosts ()
要配置您希望获得的给定主机的数据:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
使用应用程序\验证器\DomainValidator;使用PHPUnit)\框架\TestCase;使用ob娱乐下载\桥\PhpUnit)\DnsMock;/ * * *@groupdns-sensitive * /类DomainValidatorTest扩展TestCase{公共函数testEmails(){DnsMock::withMockedHosts ([“example.com”= > [[“类型”= >“一个”,“知识产权”= >“为1.2.3.4”]]]);$验证器=新DomainValidator ([“checkDnsRecord”= >真正的]);$isValid=$验证器->validate (“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”,],],]);
基于类存在性的测试
根据现有类表现不同的测试,例如Composer的开发依赖项,通常很难测试备用情况。因此,该组件还提供了以下PHP函数的模拟:
用例
方法,考虑下面的示例供应商\ DependencyClass
切换一个行为:
12 3 4 5 6 7 8 9 10 11 12 13
使用供应商\DependencyClass;类MyClass{公共函数你好():字符串{如果(class_exists (DependencyClass::类)){返回“依赖行为。”;}返回“默认行为。”;}}
的常规测试用例MyClass
(假设在测试期间安装了开发依赖项)看起来像:
12 3 4 5 6 7 8 9 10 11 12 13
使用MyClass;使用PHPUnit)\框架\TestCase;类MyClassTest扩展TestCase{公共函数testHello(){$类=新MyClass ();$结果=$类->你好();// "依赖行为。"/ /……}}
为了测试默认行为而使用ClassExistsMock: withMockedClasses ()
为代码运行配置预期的类、接口和/或特征:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用MyClass;使用PHPUnit)\框架\TestCase;使用供应商\DependencyClass;类MyClassTest扩展TestCase{/ /……公共函数testHelloDefault(){ClassExistsMock::注册(MyClass::类);ClassExistsMock::withMockedClasses ([DependencyClass::类= >假]);$类=新MyClass ();$结果=$类->你好();// "默认行为。"/ /……}}
故障排除
的@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=“https://schema.phpunit.de/4.1/phpunit.xsd”><!——……--><听众><侦听器类=“ob娱乐下载Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”><参数><数组><元素关键=“时效性”><字符串>ob娱乐下载Symfony \ \ HttpFoundation组件字符串>元素>数组>参数>侦听器>听众>phpunit)>
在底层,PHPUnit侦听器将模拟函数注入测试类的名称空间。为了按预期工作,侦听器必须在被测试的类运行之前运行。默认情况下,当找到注释并运行相应的测试时,将创建模拟函数。这取决于您的测试是如何构造的,可能为时已晚。在这种情况下,您需要在您的数据库中声明测试类的名称空间phpunit.xml.dist
.
1 2 3 4 5 6 7 8 9 10 11
<!——phpunit.xml.dist——><!——……--><听众><侦听器类=“ob娱乐下载Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”><参数><数组><元素关键=“时效性”><字符串>Acme \ MyClassTest字符串>元素>数组>参数>侦听器>听众>
修改PHPUnit脚本
这个桥提供了PHPUnit的修改版本,您可以使用它来调用bin / simple-phpunit
命令。它具有以下特点:
- 使用独立的供应商目录,与您的目录不冲突;
- 不嵌入
预言
防止与其依赖项发生冲突; - 控件时收集并重放跳过的测试
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
如果没有提供。中也可以设置这个env变量phpunit.xml.dist
文件。
默认情况下,根据安装的PHP版本,这些是使用的PHPUnit版本:
安装的PHP版本 | 默认使用的PHPUnit版本 |
---|---|
PHP <= 5.5 | PHPUnit) 4.8 |
PHP 5.6 | PHPUnit) 5.7 |
PHP 7.0 | PHPUnit) 6.5 |
PHP 7.1 | PHPUnit) 7.5 |
PHP >= 7.2 | PHPUnit) 8.3 |
如果你已经通过Composer安装了桥接器,你可以调用e.g.来运行它:
1
$供应商/ bin / simple-phpunit
提示
属性可以改变PHPUnit的基本版本ob娱乐下载SYMFONY_PHPUNIT_VERSION
的Env varphpunit.xml.dist
文件(如。<服务器名="SYMFONYob娱乐下载_PHPUNIT_VERSION" value="5.5"/>
).这是首选的方法,因为它可以提交到您的版本控制存储库。
也可以设置ob娱乐下载SYMFONY_PHPUNIT_VERSION
作为一个真正的环境变量(没有定义在dotenv文件).
提示
如果你还需要的话预言
(但不ob娱乐下载symfony / yaml
),然后设置ob娱乐下载SYMFONY_PHPUNIT_REMOVE
环境变量ob娱乐下载symfony / yaml
.
中也可以设置这个env变量phpunit.xml.dist
文件。
代码覆盖侦听器
默认情况下,使用以下规则计算代码覆盖率:如果执行了一行代码,则将其标记为覆盖。因此,执行一行代码的测试被标记为“覆盖一行代码”。这可能会产生误导。
考虑下面的例子:
12 34 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=“https://schema.phpunit.de/6.0/phpunit.xsd”><!——……--><听众><侦听器类=“ob娱乐下载Symfony \ \ PhpUnit) \ CoverageListener桥”/>听众>phpunit)>
如果用于查找相关代码的逻辑太简单或不适合您的应用程序,您可以使用自己的SUT(系统测试)求解器:
1 2 3 4 5 6 7
<听众><侦听器类=“ob娱乐下载Symfony \ \ PhpUnit) \ CoverageListener桥”><参数><字符串>我的\ \ SutSolver:名称空间:解决字符串>参数>侦听器>听众>
的我的\ \ SutSolver:名称空间:解决
可以是任何PHP可调用对象,并接收当前测试作为其第一个参数。
最后,监听器还可以在SUT求解器没有找到SUT时显示警告消息:
1 2 3 4 5 6 7 8
<听众><侦听器类=“ob娱乐下载Symfony \ \ PhpUnit) \ CoverageListener桥”><参数><零/><布尔>真正的布尔>参数>侦听器>听众>