PHPUnit)大桥

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 5.2,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

PHPUnit)大桥

PHPUnit)大桥提供了实用程序来报告遗留测试和使用废弃的代码和助手嘲笑本机函数相关,DNS和阶级存在。

它有以下特点:

  • 力测试使用一致的语言环境(C)(如果你创建语言环境敏感的测试,用PHPUnit)setLocale ()方法);
  • Auto-registerclass_exists加载教义注释(使用时);
  • 它显示整个弃用功能列表应用程序中使用;
  • 弃用按需显示堆栈跟踪;
  • 提供了一个ClockMock,DnsMockClassExistsMock类测试敏感时间,网络或类的存在;
  • 提供了一个PHPUnit),允许1的修改版本。分离应用程序的依赖项的phpunit),以防止任何不必要的约束应用;2。并行运行测试的测试套件时分裂成几个phpunit)。xml文件;3所示。记录和重放跳过测试;
  • 它允许创建测试兼容多个PHPUnit)版本(因为它提供polyfills失踪的方法,为没有名称空间的名称空间别名类,等等)。

安装

1
美元作曲家要求- dev symfony / phob娱乐下载punit-bridge

请注意

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

请注意

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)>

使用

另请参阅

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

一旦安装组件,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。ob娱乐下载使用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。区域- - >< !——……- - ><听众><侦听器=“ob娱乐下载Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”/ >< /听众>

并行运行测试

修改后的PHPUnit)脚本允许并行运行测试通过提供一个与自己的目录中包含多个测试套件phpunit.xml.dist

1 2 3 4 5 6 7
├──测试/│├──功能/││├──……││└──phpunit.xml.dist│ ├── Unit/ │ │ ├── ... │ │ └── phpunit.xml.dist< /code>
1
美元/ /供应商/ bin / simple-phpunit测试

修改后的PHPUnit)脚本将提供目录递归地穿过,深度3子目录或指定的环境变量的值ob娱乐下载SYMFONY_PHPUNIT_MAX_DEPTH,寻找phpunit.xml.dist文件,然后运行并行每个套件它发现,收集他们的输出和显示每个测试套件的结果在自己的部分。

触发的通知

弃用可以通过使用触发通知trigger_deprecationob娱乐下载symfony / deprecation-contracts包:

1 2 3 4 5
/ /显示是1.3版本的商家名称/ packagename以来弃用trigger_deprecation (“商家名称/包名称”,“1.3”,“你的弃用信息”);/ /还可以使用printf格式(所有参数后,消息将使用)trigger_deprecation (“……”,“1.3”,“价值“% s”弃用,使用…相反。”,美元价值);

马克测试遗留

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

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

请注意

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

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

配置

以防你需要检查一个特定的堆栈跟踪弃用触发你的单元测试,您可以设置ob娱乐下载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=“https://schema.phpunit.de/6.0/phpunit.xsd”>< !——……- - ><php><服务器的名字=“KERNEL_CLASS”价值=“应用程序\内核”/ ><env的名字=“ob娱乐下载SYMFONY_DEPRECATIONS_HELPER”价值=“foobar /”/ >< /php>< /phpunit)>

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

使测试失败

默认情况下,任何non-legacy-tagged或任何非@-silenced < @-silencing操作符> ' _弃用通知将使测试失败。或者,您可以配置一个任意的阈值设置ob娱乐下载SYMFONY_DEPRECATIONS_HELPER马克斯(总)= 320例如。它将使测试失败只有达到更高数量的通知(0是默认值)。

你甚至可以使用的其他键更细粒度的控制马克斯数组,自我,直接,间接。的ob娱乐下载SYMFONY_DEPRECATIONS_HELPER环境变量接受一个url编码的字符串,这意味着你可以结合阈值和任何其他配置设置,如下:ob娱乐下载SYMFONY_DEPRECATIONS_HELPER = '马克斯(总)= 42马克斯(自我)= 0 verbose = 0 '

内部的用法

当你保持一个图书馆,在测试套件失败一旦依赖引入了一个新的弃用不可取,因为它变化的负担修理,弃用任何贡献者提交拉请求一个新的供应商发布后不久,弃用。

减轻,可以使用更严格的要求,希望依赖不会介绍不支持在一个补丁版本,甚至提交composer.lock文件,这将创建另一个类的问题。库通常会使用ob娱乐下载SYMFONY_DEPRECATIONS_HELPER = max(总)= 999999因为这个。这允许贡献的缺点,不支持但介绍:

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

通过使用ob娱乐下载SYMFONY_DEPRECATIONS_HELPER = max(自我)= 0外,与此同时触发供应商目录将分别核算,而与此同时从图书馆里面不会触发(除非你达到999999),给你最好的两个世界。

直接和间接的用法

当工作在一个项目,你可能更感兴趣马克斯(直接)。假设你想修复的用法就出现。一个问题,很多开发人员的经验是,依赖与他们往往落后于自己的依赖性,这意味着他们不尽快修复的用法,这意味着你应该创建一个拉请求过时的供应商,而忽略这些用法,直到你把请求合并。

马克斯(直接)配置允许您将一个阈值直接的用法,让你注意到什么时候你的代码利用废弃的api,并跟上变化。你仍然可以使用马克斯(间接)如果你想保持间接不支持在一个给定的阈值。

这是一个总结,可以帮助您选择正确的配置:

价值 推荐情况
马克斯(总)= 0 建议积极维护项目与健壮的/不依赖
马克斯(直接)= 0 推荐项目依赖项未能跟上新的用法。
马克斯(自我)= 0 推荐使用弃用的库系统自己和不能使用上面的模式之一。

基本的用法

如果您的应用程序有一些用法,你不能解决基于某些原因,您可以告诉Symfony忽略它们。ob娱乐下载关键是要创建一个文件允许的用法和定义它为“弃用基线”。不支持内部文件忽视但是其他不支持仍报道。

首先,生成的文件允许的用法(无论何时你想要运行相同的命令来更新现有的文件):

1
美元ob娱乐下载SYMFONY_DEPRECATIONS_HELPER =“generateBaseline = true&baselineFile = /测试/ allowed.json。”/供应商/ bin / simple-phpunit

这个命令存储所有与此报告在运行测试编码的文件路径和JSON。

然后,您可以运行下面的命令来使用文件和忽略那些不支持:

1
美元ob娱乐下载SYMFONY_DEPRECATIONS_HELPER =“baselineFile = /测试/ allowed.json。”/供应商/ bin / simple-phpunit

5.2

baselineFilegenerateBaseline选择在Symfony 5.2中引入的。ob娱乐下载

禁用详细输出

默认情况下,这座桥将显示详细的输出的数量随着他们出现的地方。如果这对你太多,你可以使用ob娱乐下载SYMFONY_DEPRECATIONS_HELPER = verbose = 0把详细的输出。

它也可以改变每弃用冗长的类型。例如,使用安静的[]= indirect&quiet [] =将隐藏细节类型不支持“间接”和“其他”。

5.1

安静的选项是在Symfony 5.1中引入的。ob娱乐下载

禁用弃用的助手

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

弃用半自动的时候通知

默认情况下,PHPUnit)桥使用DebugClassLoaderErrorHandler组件扔弃用在类加载时通知。这可以被禁用debug-class-loader选择。

1 2 3 4 5 6 7 8 9 10 11 12
< !——phpunit.xml。区域- - >< !——……- - ><听众><侦听器=“ob娱乐下载Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”><参数><数组>< !——此选项设置为0禁用DebugClassLoader集成- - ><元素关键=“debug-class-loader”><整数>0< /整数>< /元素>< /数组>< /参数>< /侦听器>< /听众>

编译时的用法

使用调试:容器命令来编译过程中生成的用法以及变暖的容器:

1
美元php bin /控制台调试:容器——不支持

5.1

与此同时,选项是在Symfony 5.1中引入的。ob娱乐下载

写断言的用法

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

1 2 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(“商家名称/包名称”,“5.1”,“这“Foo”方法是不赞成的。”);美元- >expectDeprecation (“既然商家名称/包名5.1:这“% s”方法是过时的);/ /……/ /测试代码触发以下弃用:/ / trigger_deprecation(“商家名称/包名称”,“4.4”,“酒吧”的第二个参数方法是弃用。”);美元- >expectDeprecation (“既然商家名称/ 4.4包名:“% s”方法的第二个参数是弃用。);}}

5.1

ob娱乐下载Symfony版本5.1还包括之前@expectedDeprecation注释要测试的用法,但这是弃用的方法。

显示完整的堆栈跟踪

默认情况下,PHPUnit)桥只显示弃用的信息。显示完整的堆栈跟踪相关弃用,设置的值ob娱乐下载SYMFONY_DEPRECATIONS_HELPER一个正则表达式匹配弃用消息。

例如,如果抛出弃用通知如下:

1 2
1 x:学说\常见\类加载器是弃用。1 xEntityTypeTest:安装Symfony \桥ob娱乐下载\学说\测试\ \类型形式

运行以下命令将显示完整的堆栈跟踪:

1
美元ob娱乐下载SYMFONY_DEPRECATIONS_HELPER =' /学说\ \常见的弃用\ \ \的类加载器。/”/供应商/ bin / simple-phpunit

与多个PHPUnit)测试版本

当测试库,必须兼容多个版本的PHP,测试套件不能使用PHPUnit)的最新版本,因为:

  • PHPUnit) 8弃用几种方法的其他方法不可用的旧版本(例如PHPUnit) 4);
  • PHPUnit) 8补充道无效返回类型为设置()方法,该方法用PHP 5.5不兼容;
  • PHPUnit)转换为名称空间类从PHPUnit) 6,所以测试必须使用,没有名称空间。

Polyfills不可用的方法

当使用simple-phpunit脚本,PHPUnit)桥注入polyfills对大多数的方法TestCase断言类(如。expectException (),expectExceptionMessage (),assertContainsEquals ()等)。这允许写测试用例使用最新的最佳实践的同时仍与旧PHPUnit)版本兼容。

删除Void返回类型

运行时的simple-phpunit脚本的ob娱乐下载SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT环境变量设置为1PHPUnit)桥将改变PHPUnit)删除的代码返回类型(引入PHPUnit) 8)设置(),tearDown (),setUpBeforeClass ()tearDownAfterClass ()方法。这允许您编写一个测试兼容PHP 5和PHPUnit) 8。

或者,您可以使用特征SetUpTearDownTrait,它提供了正确的签名设置(),tearDown (),setUpBeforeClass ()tearDownAfterClass ()调用方法和代表doSetUp (),doTearDown (),doSetUpBeforeClass ()doTearDownAfterClass ()方法:

1 2 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 ()/ /定义和没有空隙的返回类型,如你所愿使用SetUpTearDownTrait;私人函数doSetUp(){/ /……}受保护的函数doSetUp():无效{/ /……}}

使用名称空间PHPUnit)类

PHPUnit)大桥添加名称空间类别名的大部分PHPUnit)类声明没有名称空间(如。PHPUnit_Framework_Assert),允许你总是使用名称空间类声明甚至在执行测试时PHPUnit) 4。

对时间敏感的测试

用例

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

1 2 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。区域- - >< !——……- - ><听众><侦听器=“\ob娱乐下载 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;使用ob娱乐下载\组件\秒表\秒表;/ * * *@group对时间敏感的* /MyTest扩展TestCase{公共函数testSomething(){美元秒表=秒表();美元秒表- >开始(“event_name”);睡眠(10);美元持续时间=美元秒表- >停止(“event_name”)- >getDuration ();美元- >assertequal (10000年,美元持续时间);}}

这就是一切!

谨慎

嘲笑是基于时间的函数PHP名称空间分辨率的规则所以“完全限定的函数调用(如\(时间)不能嘲笑)。

@group时效性注释是相当于调用ClockMock:注册(MyTest::类)。如果你想模拟一个函数中使用一个不同的类,它显式地使用ClockMock:注册(MyClass::类):

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
/ /使用时间()函数的类被嘲笑了名称空间应用程序;MyClass{公共函数getTimeInHours(){返回时间()/3600年;}}/ /测试,模拟外部时间()函数显式地名称空间应用程序\测试;使用应用程序\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函数:

用例

考虑下面的例子来测试一个自定义类DomainValidator它定义了一个checkDnsRecord选项也验证域相关联到一个有效的主持人:

1 2 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 ()配置数据能够得到给定主机:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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,所以你可以模拟不同网络条件:

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

基于类存在的测试

测试不同取决于现有的类,例如作曲家的发展依赖关系,往往是难以测试的备用情况。出于这个原因,该组件还提供了模拟这些PHP函数:

用例

考虑下面的例子,依赖于供应商\ DependencyClass切换行为:

1 2 3 4 5 6 7 8 9 10 11 12 13
使用供应商\DependencyClass;MyClass{公共函数你好():字符串{如果(class_exists (DependencyClass::类)){返回“依赖的行为。”;}返回默认的行为。;}}

常规的测试用例MyClass(假设的发展依赖安装在测试)看起来像:

1 2 3 4 5 6 7 8 9 10 11 12 13
使用MyClass;使用PHPUnit)\框架\TestCase;MyClassTest扩展TestCase{公共函数testHello(){美元=MyClass ();美元结果=美元- >你好();/ /“依赖的行为。”/ /……}}

为了测试而不是使用默认行为ClassExistsMock: withMockedClasses ()配置将类、接口和/或代码运行的特征:

1 2 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注释工作“按照惯例”和假设测试类的名称空间可以获得的测试\部分的测试名称空间。也就是说如果你的测试用例完全限定类名(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=“https://schema.phpunit.de/4.1/phpunit.xsd”>< !——……- - ><听众><侦听器=“ob娱乐下载Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”><参数><数组><元素关键=“时效性”><字符串>ob娱乐下载Symfony \ \ HttpFoundation组件< /字符串>< /元素>< /数组>< /参数>< /侦听器>< /听众>< /phpunit)>

在引擎盖下,PHPUnit)侦听器注入嘲笑函数的测试类的名称空间。为了正常工作,听者必须在测试之前运行类运行。

默认情况下,嘲笑函数时创建的注释和相应的运行测试。根据您的测试是如何构造的,这可能是太迟了。

你可以:

  • 声明的名称空间在您的测试类phpunit.xml.dist;
  • 注册名称空间的尽头配置/ bootstrap.php文件。
1 2 3 4 5 6 7 8 9 10 11
< !——phpunit.xml。区域- - >< !——……- - ><听众><侦听器=“ob娱乐下载Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”><参数><数组><元素关键=“时效性”><字符串>Acme \ MyClassTest< /字符串>< /元素>< /数组>< /参数>< /侦听器>< /听众>
1 2 3 4 5 6 7
/ /配置/ bootstrap.php使用ob娱乐下载\\PhpUnit)\ClockMock;/ /……如果(“测试”= = =美元_SERVER(“APP_ENV”){ClockMock::注册(“Acme \ \ MyClassTest \ \”);}

PHPUnit)修改脚本

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

  • 与一个独立的供应商目录,不与你发生冲突;
  • 不嵌入预言与其依赖关系,以防止任何冲突;
  • 收集和回放时跳过测试ob娱乐下载SYMFONY_PHPUNIT_SKIPPED_TESTSenv var定义:env var应该指定一个文件名,将用于存储在第一次运行跳过测试,然后重复它们在第二次运行;
  • 对测试套件执行当给定一个目录作为参数,扫描该目录phpunit.xml.dist文件到ob娱乐下载SYMFONY_PHPUNIT_MAX_DEPTH水平(env var,指定默认值3);

脚本编写修改PHPUnit)它构建在一个可配置的目录ob娱乐下载SYMFONY_PHPUNIT_DIRenv var,或在相同的目录中simple-phpunit如果不提供。也可以设置这个env varphpunit.xml.dist文件。

默认情况下,这些PHPUnit)版本使用取决于安装的PHP版本:

安装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

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

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

提示

可以改变PHPUnit)的基本版本通过设置ob娱乐下载SYMFONY_PHPUNIT_VERSIONenv var的phpunit.xml.dist文件(如。< server name ob娱乐下载= " SYMFONY_PHPUNIT_VERSION " value = " 5.5 " / >)。这是首选方法,因为它可以致力于您的版本控制存储库。

也可以设置ob娱乐下载SYMFONY_PHPUNIT_VERSION作为一个真正的env var(未定义dotenv文件)。

同样的,ob娱乐下载SYMFONY_MAX_PHPUNIT_VERSION将最大的版本PHPUnit)被认为是。这是非常有用的在测试框架,不支持PHPUnit)的最新版本(s)。

5.2

ob娱乐下载SYMFONY_MAX_PHPUNIT_VERSIONenv变量是在Symfony 5.2中引入的。ob娱乐下载

提示

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

也可以设置这个env varphpunit.xml.dist文件。

代码覆盖率侦听器

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

考虑下面的例子:

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=“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桥”><参数></ ><布尔>真正的< /布尔>< /参数>< /侦听器>< /听众>
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。