Php 如何创建总是超时的测试资源
我正在对一个URL获取程序进行单元测试,我需要一个总是导致Php 如何创建总是超时的测试资源,php,python,apache,url,timeout,Php,Python,Apache,Url,Timeout,我正在对一个URL获取程序进行单元测试,我需要一个总是导致urlib2.urlopen()(Python)超时的测试URL。我曾尝试创建一个只包含睡眠(10000)的php页面,但这会导致500个内部服务器错误 如何使资源在请求时在客户端中导致连接超时?连接超时?使用,例如,netcat。侦听某个端口(nc-l),然后尝试从该端口下载数据http://localhost:port/。它将打开连接,该连接将永远不会应答。在PHP中,您可以发送状态代码为408的标头 header("HTTP/1.0
urlib2.urlopen()
(Python)超时的测试URL。我曾尝试创建一个只包含睡眠(10000)的php页面,但这会导致500个内部服务器错误
如何使资源在请求时在客户端中导致连接超时?连接超时?使用,例如,
netcat
。侦听某个端口(nc-l
),然后尝试从该端口下载数据<代码>http://localhost:port/。它将打开连接,该连接将永远不会应答。在PHP中,您可以发送状态代码为408的标头
header("HTTP/1.0 408 Request Timeout");
您是否尝试过的/delay
httpbin是一个HTTP请求和响应服务用Python编写(我认为Kenneth Reitz开发它是为了在编写模块时测试模块),源代码已打开。实际上,我不确定/delay
是否会延迟接受请求连接或发送响应。但是,如果它不完全符合您的需要,那么应该很容易修改或扩展它
编辑:我看到了[php]标记,并假设这是php代码--
但是,如果您使用的是Python语言,那么同样的原则也可以应用于Python
成功的单元测试要求您在完全隔离所有外部影响的情况下测试代码单元。这意味着,如果您的测试依赖于文件系统(或者在本例中是某个外部web服务器)之类的东西来正常工作,那么您就做错了。当您的测试依赖于外部web服务器时,您给测试代码增加了很大的复杂性,并且引入了误报和其他错误测试结果的可能性
听起来当前的测试实现需要一个成熟的模拟web服务器来提供特定的、可测试的响应。事实不应如此。这种影响深远的测试依赖性只会导致上述问题
更好的方法
但是如何测试本机PHP功能及其与远程数据(如HTTP或FTP)的交互?答案是在代码中添加测试“接缝”。考虑下面的简单例子:
<?php
class UrlRetriever {
public function retrieve($uri) {
$response = $this->doRetrieve($uri);
if (false !== $response) {
return $response;
} else {
throw new RuntimeException(
'Retrieval failed for ' . $uri
);
}
}
/**
* A test seam to allow mocking of `file_get_contents` results
*/
protected function doRetrieve($uri) {
// suppress the warning from a failure since we're testing against the
// return value (FALSE on failure)
return @file_get_contents($uri);
}
}
虽然这里有一些很好的答案,但我发现我只需要一个简单的php sleep()调用,并覆盖Apache的超时
我知道单元测试应该是隔离的,但是这个端点所在的服务器是不会去任何地方的。哦,你应该完全测试超时。你不应该打开一个实际的URL然后等待一个超时,就像你不应该在测试其他任何东西时点击网络一样。所有这些假设我们谈论的是单元测试,集成测试中也有一些真正的价值。@delnan,你完全正确。我可能工作过度了,我删除了“单元测试”部分。@dimo414谢谢=)我对python一无所知,所以这是我最好的猜测。这不会导致连接超时。TCP连接将立即建立,但HTTP响应将为408
。该状态意味着服务器断开了客户端为传输HTTP请求而打开的连接,因为客户端停止发送的时间过长。这与连接超时完全不同,在连接超时中,客户机尝试建立TCP连接以进行HTTP over,但由于服务器没有响应而放弃。
<?php
class UrlRetrieverTest extends PHPUnit_Framework_TestCase {
/**
* @covers UrlRetriever::retrieve
* @expectedException RuntimeException
*/
public function testRetrieveThrowsExceptionOnFailure() {
$retriever = $this->getMock('UrlRetriever', array('doRetrieve'));
$retriever->expects($this->once())
->method('doRetrieve')
->will($this->returnValue(false));
$retriever->retrieve('http://someurl');
}
/**
* @covers UrlRetriever::retrieve
*/
public function testSomeSpecificOutputIsHandledCorrectly() {
$expectedValue = 'Some value I want to manipulate';
$retriever = $this->getMock('UrlRetriever', array('doRetrieve'));
$retriever->expects($this->once())
->method('doRetrieve')
->will($this->returnValue($expectedValue));
$response = $retriever->retrieve('http://someurl');
$this->assertEquals($response, $expectedValue);
}
}