我有一个端点,该端点从数据库返回一个列表。如果在执行过程中出现问题,我将返回一个internal_server_error,其中包含500个status_code和一条消息作为参数。
def get_general_ranking():
try:
ranking_list = GamificationService.get_general_ranking()
return basic_response(ranking_list, 200)
except Exception as e:
logging.error(str(e))
cache.delete()
return internal_server_error_response('Could not get ranking. Check log for reasons.')
我正在为此端点实施单元测试。所以,现在,我有了这个实现:
class TestGamificationController(unittest.TestCase):
def setUp(self):
"""
Function called when the class is initialized.
"""
test_app = app.test_client()
self.general_ranking = test_app.get('/v1/gamification/general_ranking')
def test_endpoint_general_ranking(self):
"""
Testing the endpoint '/v1/gamification/general_ranking'.
"""
assert self.general_ranking.status_code == 200, "Wrong status code."
assert len(self.general_ranking.json) > 0, "/v1/gamification/general_ranking is returning an empty list."
assert self.general_ranking.content_type == 'application/json', "Wrong content_type"
但是,正如您在下面看到的那样,当我运行具有覆盖率的测试以检查我是否覆盖了100%的代码时,我得到了75%。缺少的行是例外行。
---------- coverage: platform darwin, python 3.8.0-final-0 -----------
Name Stmts Miss Cover Missing
------------------------------------------------------------------------
api/controller/GamificationController.py 16 4 75% 18-21
缺少行:
except Exception as e:
logging.error(str(e))
cache.delete()
return internal_server_error_response('Could not get ranking. Check log for reasons.')
我如何也可以使用pytest覆盖此异常?还是我应该使用其他东西?
答案 0 :(得分:1)
我看到了三个可能的修复方法:
现在个人而言,仅使用调试/开发环境检查(如果它关闭就抛出一条路由未找到错误)最容易实现1。
如果您使用Flask应用程序工厂来生成应用程序并在测试执行时全部生成自定义路由,则 2是可行的,尽管我不确定这是否足以通过Flask抛出的AssertionError
在收到第一个请求后 对其应用路由进行任何修改。在conftest.py
上实例化应用程序时通常是这种情况。
3我认为是一种作弊行为。
希望您能解决这个问题。想知道您如何解决这个问题。
更新:我发现最好的方法是使用在任何测试之前运行的pytest
的sessionstart钩子。我用它来初始化自定义错误端点。这种方法最有效,因为您不必使用测试专用逻辑来污染代码库。