Pytest flask live_server:无法冻结时间

时间:2019-03-04 08:28:45

标签: python flask pytest freezegun

我正在尝试使用pytest-flask为Flask应用程序实施单元测试。查询的输出取决于当前时间。

对于一致的单元测试,我正在尝试冻结时间。我习惯于冻结枪,所以这是我尝试过的:

# Session for scope, otherwise server is reloaded everytime
@pytest.fixture(scope="session")
@freeze_time("2018-04-15")
def app():

    os.environ["FLASK_ENV"] = "development"

    app = create_app()

    # http://flask.pocoo.org/docs/1.0/api/#flask.Flask.test_client
    app.testing = True

    return app

@pytest.mark.usefixtures("live_server")
class TestLiveServer:

    # Freeze time to get consistent output.
    @freeze_time("2018-04-15")
    def test_export(self):

        q = "Chocapic"

        r = requests.post(
            url_for("query_direct", _external=True), json={"query": q}
        )
        print(r.text)

        export_path = os.path.join("tests", "fake_responses", q)

        with open(export_path, "w") as outfile:
            json.dump(r.json(), outfile, indent=4)

        with open(export_path, "r") as infile:
            data = json.load(infile)

        assert r.json() == data

我在日志中看到我的应用已在适当的冻结时间下启动。但是,当测试运行时,我可以看到对端点的查询是使用实际当前时间完成的。夹具live_server似乎重置了当前时间。

您遇到过此问题吗?

1 个答案:

答案 0 :(得分:0)

根据the documentation liver_server固定装置在单独的进程中运行应用程序。 Freezegun可能无法在其他进程中发挥作用,只能在当前进程中发挥作用。

您真的需要实时服务器吗?我在没有实时服务器的情况下运行了所有测试。

也许您可以将测试分为两组?使用Freezegun可以在没有实时服务器的情况下获得可重现的响应,并且仅使用实时服务器来测试您需要的实时服务器(Javascript?Selenium?)。