gpt4 book ai didi

python - 使用特定设置启动 Flask 应用程序,运行查询并存储测试响应

转载 作者:行者123 更新时间:2023-12-01 08:10:55 25 4
gpt4 key购买 nike

我已经为我的 Flask 应用程序实现了单元测试。我用的是pytest。我的目标是确保多个预定义查询始终返回相同的输出(一些 json)。

为了做到这一点,我使用固定装置来启动具有测试设置的应用程序:

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

os.environ["FLASK_ENV"] = "development"
os.environ["TEST_SETTINGS"] = os.path.join(
ds.WORK_DIR, "..", "tests", "settings.py"
)

app = create_app()

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

return app

然后我使用 pytest 运行一个测试函数,这并不是真正的测试函数:

# Freeze time for consistent output
@pytest.mark.usefixtures("live_server")
@pytest.mark.freeze_time("2018-01-01")
class TestLiveServer:

@pytest.mark.skip(reason="should only be used to update the test data")
def test_export(self):
"""Not a test function.

Used to export questions outputs in json file to freeze the expected output

"""

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

filename = (
"".join(filter(lambda c: str.isalnum(c) or c == " ", q))
.lower()
.replace(" ", "_")
+ ".json"
)
export_path = os.path.join("tests", "fake_responses", filename)

data = {"query": q, "response": r.json()}

with open(export_path, "w") as outfile:
json.dump(data, outfile, indent=4, sort_keys=True)
outfile.write("\n")

为了生成卡住的输出,我取消注释 pytest 标记并运行这个特定的测试。正如您所看到的,它不是很优雅并且容易出错。有时我忘记重新启用标记,如果我一次运行所有测试,它首先会重新生成假输出,然后再对它们运行单元测试。如果发生这种情况,我的测试不会失败,也不会发现潜在的错误(这会破坏这些测试的意义)。

有没有办法单独运行这个特定的函数,也许可以使用一些 pytest 标志或其他东西?

最佳答案

这可能应该是一个独立的东西,而不是 pytest 测试套件的一部分(因为它不是测试),但您可以通过利用 pytest 的 skipping facilities 来绕过它。 .

# redefine test_export to feature a conditional skip
@pytest.mark.skipif(not os.getenv('FREEZE_OUTPUTS'), reason='')
def test_export(self):

这里我们跳过此测试,除非设置了 FREEZE_OUTPUTS 环境变量。

然后,您可以通过从命令行调用以下命令来运行此测试(仅为此调用定义环境变量):

$ FREEZE_OUTPUTS=1 py.test <your_test_file>::TestLiveServer::test_export

这只会运行该测试。在所有其他情况下,它将被跳过。

您甚至可以按照上述方法并将其声明为包含在 session level 上的固定装置。与 autouse=True so it's always included然后在装置本身中添加一些逻辑来检查您是否已定义FREEZE_OUTPUTS,如果是,则运行有问题的逻辑。像这样的东西:

@pytest.fixture(scope='session', autouse=True)
def frozen_outputs():
if os.getenv('FREEZE_OUTPUTS'):
# logic for generating the outputs goes here
return # do nothing otherwise

关于python - 使用特定设置启动 Flask 应用程序,运行查询并存储测试响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55259149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com