【问题标题】:How to test an endpoint exception using flask and pytest?如何使用flask和pytest测试端点异常?
【发布时间】:2020-03-15 07:16:02
【问题描述】:

我有一个端点,它从我的数据库中返回一个列表。如果在此过程中出现问题,我会返回一个 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 也解决这个异常?还是我应该使用其他东西?

【问题讨论】:

  • 您的问题中没有任何pytest 测试。
  • @TheIncorrigible1 我可能不得不使用 pytest 来解决这个问题。但我会将这个添加到问题中。谢谢。

标签: python unit-testing exception flask pytest


【解决方案1】:

我看到了三个可能的解决方法:

  1. 在您的应用中创建一个自定义路由,该路由只会引发上述异常。
  2. 开始测试时,以编程方式在您的应用中添加此自定义路由。
  3. 将您的全局错误处理函数移到其自己的文件中,并从您的覆盖范围中忽略它。

现在个人 1 是最简单的,只需应用调试/开发环境检查,如果它关闭就会抛出找不到路由的错误。

如果您使用 Flask 应用程序工厂生成应用程序并在测试执行中生成自定义路由,则 2 是可行的,尽管我不确定这是否足以通过 Flask 抛出的 AssertionError在收到第一个请求之后修改其应用程序路由。当您在 conftest.py 上实例化您的应用时,通常会出现这种情况。

我想3有点作弊。

希望你能解决这个问题。想知道你是如何解决这个问题的。

更新:我发现这样做的最佳方法是使用在任何测试之前运行的pytest 的 sessionstart 挂钩。我用它来初始化自定义错误端点。这种方法效果最好,因为您不必使用特定于测试的逻辑污染代码库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    相关资源
    最近更新 更多