gpt4 book ai didi

python - 如何在pytest中每次测试后完全拆卸Flask App?

转载 作者:行者123 更新时间:2023-11-28 16:57:07 25 4
gpt4 key购买 nike

我正在使用 Pytest 测试我的 Flask 应用程序。我有 3 个文件

tests/
--conftest.py
--test_one.py
--test_two.py

如果我运行 test_one.py test_two.py使用以下命令,它将毫无问题地工作。

python -m pytest tests/test_one.py

当我尝试使用以下命令运行所有测试时出现问题:

python -m pytest tests

我收到这个错误:

AssertionError: View function mapping is overwriting an existing endpoint function: serve_static

init_app(app) 以来,我对这个错误并不感到惊讶。被调用两次(每个文件一次)而且我从不拆解实际的 app .

我的问题是,有没有办法完全拆解一个 Flask 应用程序并为每个单独的测试重建它?我正在寻找实际的命令来进行拆解(即 app.teardown() )

编辑:我愿意接受设置 Flask 应用程序测试环境的其他方法,只要它能解决这个问题(无需创建新问题)。

编辑 2: 我找到了 this问题。它很相似,可以解决我的问题,但它涉及在函数内部导入。我怀疑必须有更好的方法。

conftest.py

import os
import pytest

from app import app, init_app
from config import TestConfig


@pytest.fixture(scope='function')
def client():

app.config.from_object(TestConfig)

with app.test_client() as client:
with app.app_context():
init_app(app)
yield client

try:
os.remove('tests/testing.db')
except FileNotFoundError:
pass

app/__init__.py

app = Flask(__name__)
app.url_map._rules.clear()
db = SQLAlchemy(app)
migrate = Migrate(app, db)

def init_app(app):
...

最佳答案

我会在您的每个继承 TestCase 的文件中创建一个类。这样您就可以在每次测试之前使用函数 setup() 将您的测试客户端生成为实例变量。这样您就可以确保每个测试都具有相同的工作环境。

from unittest import TestCase
from app import app as application

class TestApplication(TestCase):
def setUp(self):
self.client = application.app.test_client()

def test_sth(self):
r = self.client.get('/approute2sth')
self.assertEqual(r.status_code, 200)

def test_sth_else(self):
r = self.client.get('/approute2sth_else')
self.assertEqual(r.status_code, 200)

关于python - 如何在pytest中每次测试后完全拆卸Flask App?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57312603/

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