【问题标题】:I'm lost with trying to write tests to my Flask application我在尝试向我的 Flask 应用程序编写测试时迷失了方向
【发布时间】:2015-02-12 21:17:39
【问题描述】:

所以几天来我已经尝试为我的 Flask 应用程序编写一些测试,但我无法让它运行。测试通过,但卡在 PASSED。

我已经克隆了 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-Testing 但我认为它有一些相关性,也许它没有:issue)并更改了我的测试配置,因此它包含PRESERVE_CONTEXT_ON_EXCEPTION = False 但它仍然只是挂起。

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

【问题讨论】:

  • 只是查看cookiecutter-flask 的源代码,他们似乎在使用webtest。在第一个测试中,您正在创建一个应用实例但没有使用它,这是有原因的吗?

标签: python testing flask python-unittest webtest


【解决方案1】:

flask-cookiecutter 提供的 db 固定装置很容易被锁定,这可能是你的测试挂起的原因(当我第一次开始为基于 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()

也可能是应用上下文的问题,但这不像 DB 会话那样容易完全挂起测试。

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

【讨论】:

    【解决方案2】:

    您需要使用正确的应用上下文

     def test_create_admin_user(db, testapp):
        with app.app_context():
          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'
    

    完整示例请参见https://github.com/Leo-G/Flask-Scaffold/blob/master/scaffold/app/tests.py

    【讨论】:

      猜你喜欢
      • 2014-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      相关资源
      最近更新 更多