相关疑难解决方法(0)

通过 PyCharm 启动测试时在 pytest 中使用辅助方法时出现断言问题

如果assert的第二个参数正常使用,它会打印出调试信息。例如使用以下代码:

class TestTest:
    def test_test(self):
        assert 1 == 2, "TEST"
Run Code Online (Sandbox Code Playgroud)

打印如下调试信息:

tests\test_test.py:1 (TestTest.test_test)
1 != 2

Expected :2
Actual   :1
<Click to see difference>

self = <tests.test_test.TestTest object at 0x000002147E5B1B08>

    def test_test(self):
>       assert 1 == 2, "TEST"
E       AssertionError: TEST
E       assert 1 == 2
E         +1
E         -2

test_test.py:3: AssertionError
Run Code Online (Sandbox Code Playgroud)

但是,如果断言发生在辅助函数中,则不会打印:

class TestTest:
    def test_test(self):
        self.verify(1)

    def verify(self, parameter):
        assert 1 == 2, "TEST"
Run Code Online (Sandbox Code Playgroud)

结果是:

tests\test_test.py:1 (TestTest.test_test)
1 != 2

Expected :2
Actual   :1
<Click to see difference> …
Run Code Online (Sandbox Code Playgroud)

python pytest pycharm

9
推荐指数
1
解决办法
751
查看次数

如何让pytest在非测试模块中重写assert

我们在一个单独的python文件中定义了所有自定义断言,该文件不是测试模块.

例如: custom_asserts.py

class CustomAsserts(object):
    def silly_assert(self, foo, bar):
        assert foo == bar , 'some error message'
Run Code Online (Sandbox Code Playgroud)

如果我们assert直接在测试中使用,我们将获得有关AssertionError的额外信息,这非常有用.

在测试中直接使用断言的输出:

>       assert 'foo' == 'bar', 'some error message'
E       AssertionError: some error message
E       assert 'foo' == 'bar'
E         - foo
E         + bar
Run Code Online (Sandbox Code Playgroud)

但我们发现,如果我们调用我们在单独模块中定义的断言方法,则不会显示额外信息.

from custom_asserts import CustomAsserts
asserts = CustomAsserts()
def test_silly():
    asserts.silly_assert('foo', 'bar')
Run Code Online (Sandbox Code Playgroud)

运行测试后输出:

>       assert 'foo' == 'bar', 'some error message'
E       AssertionError: some error message
Run Code Online (Sandbox Code Playgroud)

我们还在pytest docs中发现了这一点:高级断言内省

pytest只重写由其测试收集过程直接发现的测试模块,因此在支持模块中断言,这些模块本身不是测试模块,不会被重写.

所以我的问题是,有没有办法让pytest像测试模块那样对其他模块执行相同的断言重写?或者有任何hacky方式来实现这一目标?

python pytest

6
推荐指数
1
解决办法
1384
查看次数

Pytest 断言在 AssertionError 上没有显示差异

我最近学习了使用Pytest在 Python 中进行单元测试。我在Repl.it 中通过对两个应该失败的不同字符串做一个简单的断言来玩弄它。

import pytest
assert 'a' == 'b'
Run Code Online (Sandbox Code Playgroud)

哪个失败并出现错误 Traceback (most recent call last): File "python", line 2, in <module> AssertionError

但是 Pytest 不打印 'a' 或 'b'。这对调试非常有帮助,因为我可以比较 2 个不同字符串之间的差异。该单元测试模块在默认情况下此功能。Pytest 有这个功能吗?如果不是我如何启用它?我正在将 Pytest 用于一个更大的项目,并希望在继续工作之前弄清楚这一点。

python pytest

5
推荐指数
1
解决办法
2773
查看次数

标签 统计

pytest ×3

python ×3

pycharm ×1