新在Symfoob娱乐下载ny 2.8:时钟嘲弄和时间敏感测试
警告:这篇文章是关于一个不受支持的Symfony的版本。ob娱乐下载其中一些信息可能是过时了。阅读最近的Symfony文档ob娱乐下载。
提供的
尼古拉斯Grekas
在# 16194。
瞬态随机测试是那些失败取决于寄生和外部环境,如底层的系统负载。这些测试是非常危险的,因为他们使你的测试套件不可靠。
测试,处理时间相关函数是最常见的一种瞬态测试。考虑例如以下测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用ob娱乐下载\组件\秒表\秒表;类MyTest扩展\PHPUnit_Framework_TestCase{公共函数testSomething(){美元秒表=新秒表();美元秒表- >开始(“事件”);睡眠(10);美元持续时间=美元秒表- >stop ()- >getDuration ();美元这- >assertequal (10,美元持续时间);}}
这段代码非常简单,似乎不可能失败。然而,根据服务器的负载,美元的持续时间
能举个例子10.00000023
无缘无故和测试会失败。
这种错误经常发生在使用公共持续集成服务像特拉维斯CI。我们甚至有一个长时间运行的问题来亨特所有这些瞬态测试。
时钟嘲笑
为了解决所有的与时间相关的测试错误,PHPUnit)桥现在包括一个ClockMock
类可用于PHPUnit)测试。这个类取代了PHP的内置时间()
,()
,睡眠()
和usleep ()
功能的实现。
这意味着,你不需要做一个改变你的原始代码,当使用除外新的DateTime ()
,必须更换DateTime: createFromFormat (“U”,时间())
使用嘲笑时间()
函数。
时钟上启用了嘲笑的需求测试需要它。的推荐使它的方法是添加一个特殊的@group
注释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ * * *@group对时间敏感的* /类MyTest扩展\PHPUnit_Framework_TestCase{公共函数testSomething(){美元秒表=新秒表();美元秒表- >开始(“事件”);睡眠(10);美元持续时间=美元秒表- >stop ()- >getDuration ();美元这- >assertequal (10,美元持续时间);}}
这就是一切!这个测试将永远不会再次失败,因为错误的与时间相关的结果。的睡眠(10)
调用将使时钟推进10精确秒,你总是会通过测试。
使用一个额外的好处ClockMock
类是时间的流逝。使用PHP的睡眠(10)
会使你的实际测试等待10秒(或多或少)。相比之下,ClockMock
类进步的内部时钟的秒数没有实际等待时间,因此您的测试将执行10秒更快。
替代方式,使时钟嘲笑
的@group时效性
“按照惯例”工作,假设测试类的名称空间可以获得的\ \测试
部分的测试名称空间。
如果本公约不工作为您的应用程序,您还可以配置的嘲笑名称空间phpunit.xml
文件,如做例如HttpKernel组件:
1 2 3 4 5 6 7 8 9
<听众><侦听器类=“ob娱乐下载Symfony \ \ PhpUnit) \ SymfonyTestsListener桥”><参数><数组><元素><字符串>ob娱乐下载Symfony \ \ HttpFoundation组件< /字符串>< /元素>< /数组>< /参数>< /侦听器>< /听众>
最后,你也可以让时钟显式地嘲笑。电话就可以了
方法从setupBeforeClass ()
并通过的FQCN公约解释之前应该被应用。然后,通过一个布尔参数ClockMock: withClockMock ()
启用/禁用时钟模拟的方法。
评论
$秒表- >开始(' a ');
睡眠(1);
$ = $秒表时间- >停止(a) - > getDuration ();
$ this - > assertequal(1000,持续时间);“
我用@group时间敏感的类和函数和睡眠()真的花了一秒钟。
在官方文档(http://sym欧宝官网下载appfony.com/doc/ob娱乐下载current/book/testing.html功能测试),测试类的名称以“测试”结束。兼容这一事实”测试类的名称空间可以通过删除测试\ \测试名称空间的一部分。”?
谁能请更新这个职位?看起来有错误的例子:$秒表- >开始()需要一个参数:https://github.com/symfony/symfony/blob/c0e4495b66751984125122ab4093b70521102c93/sob娱乐下载rc/Symfony/Component/Stopwatch/Stopwatch.php L87-L98秒表- >美元停止()不返回一个整数。谢谢。
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。
Tobias Nyholm is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now