Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用SimpleHTTPServer进行单元测试_Python_Unit Testing_Simplehttpserver - Fatal编程技术网

Python 使用SimpleHTTPServer进行单元测试

Python 使用SimpleHTTPServer进行单元测试,python,unit-testing,simplehttpserver,Python,Unit Testing,Simplehttpserver,我正在编写一个Python模块,它封装了一个特定的web服务API。这都是REST,所以实现起来相对简单 然而,当涉及到单元测试时,我发现了一个问题:由于我不运行我为其创建此模块的服务,我不想重击它们,但同时,我需要检索数据来运行测试。我查看了SimpleHTTPServer,这样就可以了 我解决了部分问题,但现在,因为我似乎无法终止线程,所以在多次启动测试应用程序时,我遇到了“地址已在使用”的问题 下面是一些示例代码 PORT = 8001 handler = SimpleHTTPServe

我正在编写一个Python模块,它封装了一个特定的web服务API。这都是REST,所以实现起来相对简单

然而,当涉及到单元测试时,我发现了一个问题:由于我不运行我为其创建此模块的服务,我不想重击它们,但同时,我需要检索数据来运行测试。我查看了SimpleHTTPServer,这样就可以了

我解决了部分问题,但现在,因为我似乎无法终止线程,所以在多次启动测试应用程序时,我遇到了“地址已在使用”的问题

下面是一些示例代码

PORT = 8001

handler = SimpleHTTPServer.SimpleHTTPRequestHandler

httpd = SocketServer.TCPServer(("", PORT), handler)

httpd_thread = threading.Thread(target=httpd.serve_forever)
httpd_thread.setDaemon(True)
httpd_thread.start()

api_data = urllib.urlopen("http://localhost:8001/post/index.json")
print "Data start:"
print json.load(api_data)

其中“index.json”是我制作的模拟json文件,它替代了真实的json文件。程序终止后,我如何才能优雅地清理东西?

我们使用的服务器是基于
wsgiref
构建的

当我们添加单元测试时,向该服务器添加功能非常容易

我们使用
子进程启动服务器

我们不使用线程进行此类测试。为什么?(1) 我们的单元测试服务器相当复杂,我们希望将其与客户端应用程序完全隔离。(2) 我们的客户端应用程序将是独立硬件上的独立进程,我们需要确保我们对该配置有现实的性能期望。(3) 更简单。(4) 它可以跨所有平台移植。(5) 从独立的单元测试转变为与已经运行的生产服务器类似的服务器进行集成测试是很简单的

实际上,我们有一个小型WSGI应用程序,它可以以合理控制的方式关闭服务器,以便正确关闭日志。

尝试使用:


旧线程,但这里的答案对我没有帮助,我正在使用HTTPServer,并在每次单元测试后关闭(默认情况下,HTTPServer有allow\u reuse\u address=1集)。然而,我仍然得到了地址已经在使用问题后,呼吁关机。我固定使用:

from BaseHTTPServer import HTTPServer

class MyHTTPServer(HTTPServer):
    def shutdown(self):
        self.socket.close()
        HTTPServer.shutdown(self)

不知道为什么默认情况下不会发生这种情况?可能这不是最佳的吗?

SimpleHTTPServer应该是最简单的方法。您遇到了什么样的问题?我重新编写了内容,希望现在更清楚。实际上,似乎子流程可能是一个不错的选择。将进一步调查。太棒了!这对我来说不起作用,但我能够通过在setUpClass方法而不是setUp方法中设置SocketServer来解决这个问题。地址使用中错误似乎发生在第二次调用安装方法时(在第二次测试运行时发生)。虽然这对我有效,但它避免了在测试中打开URL时地址重复使用的问题,我在关闭服务器时遇到:select error(9,“坏文件描述符”)。仍然在寻找一个不会产生此异常的解决方案,尽管我的测试看起来确实有效。Python 2.7.10。
from BaseHTTPServer import HTTPServer

class MyHTTPServer(HTTPServer):
    def shutdown(self):
        self.socket.close()
        HTTPServer.shutdown(self)