gpt4 book ai didi

python - 我迷失了尝试为我的 Flask 应用程序编写测试

转载 作者:行者123 更新时间:2023-11-28 18:39:21 25 4
gpt4 key购买 nike

因此,几天来我尝试为我的 Flask 应用程序编写一些测试,但我无法让它运行。测试通过,但卡在“通过”状态。

我克隆了 cookiecutter-flask ( cookiecutter-flask ) 并且它与 pytest 一起运行 webtest(我认为)。我的 conftest.py 看起来和它在 repo ( conftest.py ) 中一样

这些是我当前的测试:

def test_app(testapp):
app = create_app(TestConfig)
res = testapp.get('/')
res.status_code == 200

这一关继续。

def test_create_admin_user(db, testapp):
password = bcrypt.generate_password_hash('test')

User.create(
uid='00000000000000000000',
email='john@doe.com',
password=password,
active=1
)

user = User.query.filter_by(email='j@d.com').first()

assert user.email == 'j@d.com'

这是我迷路的地方,测试卡在 PASSED 上,什么也没做。当我强行中断这个过程时,我得到了这个:

Traceback (most recent call last):
File "manage.py", line 68, in <module>
manager.run()
File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask_script/__init__.py", line 412, in run
result = self.handle(sys.argv[0], sys.argv[1:])
File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask_script/__init__.py", line 383, in handle
res = handle(*args, **config)
File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask_script/commands.py", line 216, in __call__
return self.run(*args, **kwargs)
File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask/ctx.py", line 386, in __exit__
self.auto_pop(exc_value)
File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask/ctx.py", line 374, in auto_pop
self.pop(exc)
File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask/ctx.py", line 357, in pop
% (rv, self)
AssertionError: Popped wrong request context. (<RequestContext 'http://localhost/' [GET] of backend.app> instead of <RequestContext 'http://localhost/' [GET] of backend.app>)

我在 flask 中发现了以下关于测试的线程(当然,这是 Flask-Testing,但我认为它有一些相关性,也许它没有:issue)并更改了我的测试配置,因此它包含PRESERVE_CONTEXT_ON_EXCEPTION = False 但它仍然挂起。

任何人有任何想法我可以尝试吗?我对测试本身不是很熟悉,所以这可能是我做错了什么。

最佳答案

flask-cookiecutter 提供的 db fixture 容易锁定,这可能是挂起你的测试的原因(我刚开始时就是这种情况为基于 flask-cookiecutter 的应用编写测试)。

这是一个更好的 db 夹具(用于替换 tests/conftest.py 文件中的夹具):

@pytest.yield_fixture(scope='function')
def db(app):
_db.app = app
with app.app_context():
_db.session.remove()
_db.drop_all()
_db.create_all()

yield _db

_db.session.remove()
_db.drop_all()

## This dispose() call is needed to avoid the DB locking
## between tests.
## Thanks to:
## http://stackoverflow.com/a/18293157/2066849
_db.get_engine(_db.app).dispose()

也可能是应用程序上下文的问题,但这不像数据库 session 那样容易完全挂起测试。

您还应该考虑将此固定装置(以及大多数其他固定装置)更改为 scope='session',这样就不必为每个单独的测试重新创建数据库(并且所以应用程序不必重新实例化,尽管与数据库相比这是微不足道的开销)。但是在修改数据库记录的单独测试之后,您必须手动进行一些清理。

关于python - 我迷失了尝试为我的 Flask 应用程序编写测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28487950/

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