如何测试我的Flask开发服务器是否已启动?

时间:2013-08-30 18:26:58

标签: python unit-testing flask

我的Flask应用程序上有一个测试夹具,它启动开发服务器来测试一些用户交互。对于第一次测试,我想确保服务器正常运行。一般来说(不测试特定的响应代码)最好的方法是什么?我希望我可以使用self.assertTrue(response),但即使我改变了端口,这似乎也会通过。

以下是有问题的测试用例:

class TestAuth(TestCase):

    def create_app(self):
        db.init_app(app)
        return app

    @classmethod
    def setUpClass(cls):
        cls.server_proc = subprocess.Popen(
            [sys.executable, 'run.py'],
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT)
        time.sleep(5)

    @classmethod
    def TearDownLcass(cls):
        os.kill(cls.server_proc.pid, signal.SIGINT)

    def setUp(self):
        selenium_logger = logging.getLogger(
            'selenium.webdriver.remote.remote_connection')
        selenium_logger.setLevel(logging.WARN)
        self.browser = webdriver.Firefox()

        db.create_all()

    def tearDown(self):
        db.session.remove()
        db.drop_all()
        self.browser.quit()

    def test_server_up(self):
        response = self.client.get('http://localhost:5000/')
        self.assertTrue(response)

2 个答案:

答案 0 :(得分:1)

您可以使用Requests向自己,甚至urllib2发送请求。启动您的开发服务器并从指向您的ip:port的另一个实例发出请求。

答案 1 :(得分:1)

您正在混合使用两种不同的方法进行测试。

Flask-Testing公开的测试样式不需要启动单独的服务器。 self.client.get调用并不真正从服务器请求URL,它只是将请求内部路由到运行测试的同一进程。

如果您想使用单独的服务器,则无法使用self.client来请求URL,在这种情况下,您必须使用正确的HTTP客户端。您似乎已经实例化了Selenium浏览器,因此可以正常工作。将self.client.get()替换为self.browser.get()

另一方面,如果您没有特别想要启动单独的Web服务器并且可以使用Flask和Flask-Testing提供的默认工具测试您的应用程序,那么请删除所有服务器进程启动代码和Selenium的东西,只需使用self.client来发出请求。但请注意self.client不是真正的Web客户端,因此测试服务器是否启动没有意义,因为在测试时没有服务器。