【问题标题】:How to test for an error message with Pytest如何使用 Pytest 测试错误消息
【发布时间】:2020-02-02 13:52:35
【问题描述】:

我想找到一种方法来测试我的代码是否使用 pytest 针对给定错误返回正确的错误消息

我的代码适用于字典,在某些情况下,某些键可能未定义。在下面的示例中,tag 变量由用户提供,在某些情况下,该键可以是未定义的。然后我添加了一个 try/except 语句来捕获这个异常并向用户返回一条错误消息,解释问题。

try:
    species = self.species[tag]
except KeyError:
    print(f"Error: the species {tag} is not defined")

我的问题是在尝试为此代码编写单元测试时出现的。如何检查我的代码是否返回适当的错误消息?我可以编写一个自愿提供错误tag 的测试,然后检查标准输出,但如果我决定更改错误消息,我将不得不重写此测试。在“不要重复自己”的方法中似乎不太合适。

这个:How to properly assert that an exception gets raised in pytest? 没有回答我的问题,因为我没有提出异常。

也许我一开始就没有正确处理错误,但是有更好的方法来使用 Python。

【问题讨论】:

标签: python pytest


【解决方案1】:

我相信你应该改变你的代码结构来实现你想要的。

class Species:

    def myMethod(tag):
        try:
            species = self.species[tag]
        except KeyError:
            raise YourCustomError(f"Error: the species {tag} is not defined")

然后你可以编写你的 pytest 函数来检查当使用带有错误标签的 myMethod 时是否引发了 YourCustomError。请注意,代替 YourCustomError,您可以这样做:raise KeyError("custom message")

【讨论】:

  • 是的,我正在考虑使用我自己的异常。也许这是处理这个问题的更好方法。
  • 我尝试了您建议的 raise KeyError("custom message"),但我得到了一个非常丑陋的堆栈跟踪,第一个 KeyError,然后是一条消息说 During handling of the above exception, another exception occured,然后是第二个 KeyError 的另一个跟踪,带有我的自定义消息
  • 是的,堆栈跟踪不是很漂亮,但毕竟它很精确。不知道能不能改。。
猜你喜欢
  • 1970-01-01
  • 2011-01-29
  • 2014-10-06
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多