如何在python3中模拟http.server以获得更快的单元测试?

时间:2013-06-28 18:19:26

标签: python unit-testing http request python-3.3

我试图在localhost上模拟一个http服务器,以便更快地进行测试。

例如:

import my_module

class RequestsTestCase(unittest.TestCase):
    def setUp(self):
        # ...
        html = 'hello, world'
        my_server = MyServer(html, 8888)
        my_server.run()
        ...

    def test_my_module_request_phrase(self):
        response = my_module.get_phrase('http://localhost:8888/')
        self.assertEqual(response, 'hello, world')

使用python 3可以实现这样吗?

2 个答案:

答案 0 :(得分:2)

  

我只想测试请求的响应,而不需要互联网(...)

没问题。您可以在运行测试的同一主机上运行测试http服务器。如果你在同一个进程中运行它,你的测试正在运行(在使用unittest并从setUp()方法中运行测试服务器的情况就是如此),那么服务器必须在一个单独的线程中运行,这样它就不会阻止你的测试。您可以在urllib3 here中了解它是如何完成的。

答案 1 :(得分:1)

首先,请考虑以下几个方面:

  • 查看是否可以将I / O(例如Web请求)拉到程序的外层(Google for Clean Architecture)。这将使测试变得更加简单。
  • 确保您已准备好集成测试,以便在最终上下文中测试您的应用程序,包括实时Web服务。

如果您仍在寻找可轻松对剩余网络I / O进行单元测试的工具,请考虑使用图书馆httprettyresponses。使用这些工具,可以轻松指定虚假响应,包括标题字段,返回代码等。生成的测试代码将比单独使用Python mock(或者在其他线程中同时运行的自定义真实Web服务器)更清晰,更短。