17

我正在编写一个包含特定 Web 服务 API 的 Python 模块。这都是 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 文件,它替代了真实的东西。程序终止后如何优雅地清理东西?

4

3 回答 3

12

尝试使用设置 True的 TCPServer 的子类allow_reuse_address

class TestServer(SocketServer.TCPServer):
    allow_reuse_address = True

...
httpd = TestServer(("", PORT), handler)
于 2009-12-31T13:57:26.037 回答
5

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

from BaseHTTPServer import HTTPServer

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

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

于 2012-10-30T10:17:09.990 回答
4

我们使用基于wsgiref. http://docs.python.org/library/wsgiref.html

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

我们用 启动服务器subprocesshttp://docs.python.org/library/subprocess.html?highlight=subprocess#module-subprocess

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

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

于 2009-12-31T12:46:38.037 回答