【问题标题】:nosetests/unittest still shows error when test passes?测试通过时,nosetests/unittest 仍然显示错误?
【发布时间】:2014-07-05 07:19:26
【问题描述】:

我有一个单元测试,如果没有像这样进行身份验证,则测试一个 api 点是否不可访问:

def test_endpoint_get_unauth(self):
    r = self.get('/api/endpoint/1')
    self.assertStatusCode(r, 401)

测试通过,但nosetests/unittest 仍然向我显示一个错误,即引发异常说“未授权”。有没有办法阻止这一切?

完整日志:

ERROR in views [/myenv/lib/python2.7/site-packages/flask_restless/views.py:115]:
Not Authorized
--------------------------------------------------------------------------------
Traceback (most recent call last):
  File "/myapp/myenv/lib/python2.7/site-packages/flask_restless/views.py", line 113, in decorator
    return func(*args, **kw)
  File "/myapp/myenv/lib/python2.7/site-packages/flask/views.py", line 84, in view
    return self.dispatch_request(*args, **kwargs)
  File "/myapp/myenv/lib/python2.7/site-packages/flask/views.py", line 149, in dispatch_request
    return meth(*args, **kwargs)
  File "/myapp/myenv/lib/python2.7/site-packages/flask_restless/views.py", line 989, in get
    preprocessor(instance_id=instid)
  File "/myapp/app/api/api.py", line 16, in check_auth
    raise ProcessingException(message='Not Authorized', status_code=401)
ProcessingException
................
----------------------------------------------------------------------
Ran 16 tests in 15.788s

OK

【问题讨论】:

  • 您的信息自相矛盾 - 您的测试通过了,但失败了。您没有提供足够的信息,这里是引发异常的代码吗?
  • @JanVlcinsky 我相信OP是说这个测试期望endpont抛出未授权的状态代码,所以当被测端点失败时,测试应该通过。问题是,虽然端点正确地抛出了未授权的错误,但测试并不将其视为预期的情况,而是将其视为错误(与测试失败不同)。
  • @PatricYan 你能告诉我们测试的输出吗?是关于这个测试用例,还是关于另一个?
  • @JanVlcinsky,上面的 J0HN 是对的。测试通过(并且没有失败),因为状态码是 401(assertStatusCode 正在测试的内容)。但是,在终端中,我仍然会收到 error 的日志,表明端点在未经授权的情况下被访问。
  • @PatrickYan 你在谈论终端。打印到它的过程是什么?鼻测?还是烧瓶?或两者?如果 Flask 也在那里抛出日志行,那么很自然,它会报告未经授权的访问,因为这正是您的测试用例所做的。

标签: python nosetests python-unittest flask-restless


【解决方案1】:

您看到的消息可能来自应用程序日志记录。

"ERROR" 是事件的记录级别,您需要将记录器阈值设置为更高的值。

假设您的测试用例对象在测试客户端应用程序中具有app 属性, 如果您不想看到该测试的错误消息,请编写:

def test_endpoint_get_unauth(self):
    import logging
    self.app.logger.setlevel(logging.CRITICAL)

    r = self.get('/api/endpoint/1')
    self.assertStatusCode(r, 401)

详情见https://docs.python.org/2/library/logging.html

【讨论】:

    【解决方案2】:

    您也可以使用鼻子选项--logging-level=ERROR 来设置每次运行的日志记录级别。

    【讨论】:

      【解决方案3】:

      错误不是来自失败的测试用例,而是来自被测试的应用程序,它抱怨未经授权的访问。

      这是很自然的,因为您的测试用例只是试图进行未经授权的访问。

      由于测试的应用程序和测试套件都使用标准输出进行输出,这会让您感到困惑。您可以尝试配置应用程序和测试套件的日志记录以将其保存到不同的文件中,然后您会看到,谁在说什么。

      【讨论】:

      • 对不起,但这并不能回答我的问题。我的问题是如何我可以抑制成功测试的错误输出。我已经知道我的测试用例没有失败,并且我无法在鼻子测试中找到我想要的东西。
      • @PatrickYan 我添加了一条建议,以配置从您的应用程序和从测试联合到不同流/文件的日志记录。这将解决您的问题。我想,最简单的方法是将 Flask 应用程序配置为仅登录文件。
      猜你喜欢
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多