Pytest 触发 AssertionError:

Posted

技术标签:

【中文标题】Pytest 触发 AssertionError:【英文标题】:Pytest Triggers AssertionError: 【发布时间】:2022-01-21 15:39:11 【问题描述】:

我正在关注 Zed Shaw 的 Learn Python the Hardway 中的 ex47,但是,在书中他使用的是过时的软件 (Nose)。我已将他的代码/我的代码转换为 pytest,但我遇到了一些问题。

    def test_room():
    gold = Room("GoldRoom",
        """This room has gold in it you can grab.
        There's a door to the north.""")
#    assert_equal(gold.name, "GoldRoom")
#    assert_equal(gold.paths, )
    assert gold.name, "GoldRoom"
    assert gold.paths, 

我将 Nose 测试函数 asser_equal(a, b) 转换为 Pytest 等效函数:断言 a, b。但是,当我运行它时,仅此一项测试就会出错。其他两个测试以相同的格式通过。此外,错误只是指向“assert gold.paths, ”这一行。

>       assert gold.paths, 
E       AssertionError: 
E       assert 
E        +  where  = <ex47.game.Room object at 0x7fd136193be0>.paths

Pytest 告诉我,如果我将“assert gold.paths, ”更改为“assert gold.paths == ”,它就会通过。 这是误报吗?对我来说,它读起来是一样的,我断言 gold.paths 等于字典。

有人可以解释为什么“==”符号必须在那里吗?

【问题讨论】:

【参考方案1】:

使用带逗号的断言是告诉断言语句进行多个断言。例如assert 1==1, 2==2

assert gold.name, "GoldRoom" 的情况下,您要求python 断言gold.name"GoldRoom" 是非空的——它们是。 不是实际上是在测试它们之间的相等性。

例如试试

num1 = 10
num2 =11
assert num1, num2
assert num1 == num2

第一个断言将通过,因为数字大于 0(因此作为 bool true)。第二个将失败,因为数字不相等。

我断言 gold.paths 等于字典

您是在断言 value,而不是 type。要断言gold.paths 是一个字典,正确的断言是assert type(gold.paths) == dict

更多信息here

【讨论】:

以上是关于Pytest 触发 AssertionError:的主要内容,如果未能解决你的问题,请参考以下文章

[接口测试_B] 03 Pytest断言处理_assert和异常断言

8pytest -- 捕获告警信息

iOS自动化探索自动化测试框架pytest - fixtures

AssertionError: PORT 不是数字(在 Python 中)

AssertionError:内部:未指定默认项目

为啥我在 Selenium 中收到 AssertionError?