Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pytest+;皮查姆_Python_Pycharm_Pytest - Fatal编程技术网

Python 使用pytest+;皮查姆

Python 使用pytest+;皮查姆,python,pycharm,pytest,Python,Pycharm,Pytest,嗨,我有一个非常基本的测试: def test_long_diff(): long_str1=“ABCDEFGHIJ”*10 long_str2=“ABCDEFGHIJ”*5+“*”+“ABCDEFGHIJ”*5 断言long\u str1==long\u str2 使用:Python 3.8.5、pytest-6.2.1、PyCharm 2020.2、MacOs 从shell运行pytest时,输出为“可用”,错误消息将指出长字符串中的错误字符: (venv)~/dev/testdiff/>

嗨,我有一个非常基本的测试:

def test_long_diff():
long_str1=“ABCDEFGHIJ”*10
long_str2=“ABCDEFGHIJ”*5+“*”+“ABCDEFGHIJ”*5
断言long\u str1==long\u str2
使用:Python 3.8.5、pytest-6.2.1、PyCharm 2020.2、MacOs

从shell运行pytest时,输出为“可用”,错误消息将指出长字符串中的错误字符:

(venv)~/dev/testdiff/>pytest longdiff.py
==========测试会话开始===========
平台darwin——Python 3.8.5、pytest-6.2.1、py-1.10.0、Plugy-0.13.1
[...]
>断言long\u str1==long\u str2
断言错误:断言'ABCDEFGHIJ A…J ABCDEFGHIJ'='ABCDEFGHIJ A…J ABCDEFGHIJ'
E跳过差异中45个相同的前导字符,使用-v显示
E-BCDEFGHIJ*ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ
E--
E+BCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ
使用pytest clearity和
-vv
选项,我可以得到彩色的diff(不在下面渲染)和不同的细节:

E左:“ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ”
右图:“ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ*ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ”
E
E左侧和右侧具有不同的长度:
镜头(左)==110,镜头(右)==112
但是如果我让Pycharm运行测试(相同的Python版本,相同的.venv,我只需右键单击测试并选择“run'pytest for…”),运行控制台中的输出几乎是不可用的,因为在应用差异之前,“something沿途”将长字符串转换为短字符串的元组:

失败[100%]
longdiff.py:0(测试长度差异)
(“ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ”
‘ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ’!=('ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ*ABCDEFGHIJ'
‘ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ ABCDEFGHIJ’)
单击
基本上会在较大的窗口中显示相同的乱码输出


是什么导致了这个Pycharm输出?有没有办法防止这种行为?理想情况下,我希望在运行控制台中看到pytest clarity的输出。

因此,这是PyCharm使用的pytest插件的硬编码行为。将插件
pprint.pformat()
添加到左侧和右侧的值

当字符串长度超过80个字符且包含空格时,就会出现问题中描述的行为

一种可能的解决方法是覆盖插件的
pytest\u assertrepr\u compare
hook。这是一个适合我的版本。只需将其粘贴到您的
conftest.py
中即可

导入pprint
导入pytest
@pytest.hookimpl(tryfirst=True)
def pytest_assertrepr_compare(配置、操作、左、右):
如果在(“==”,“!=”)中进行运算:
返回['{0}{1}{2}'。格式(pprint.pformat(左,宽度=999),op,pprint.pformat(右,宽度=999))]
另一个可能的黑客攻击是monkeypatch
pprint.pformat

导入pytest
导入pprint
从functools导入部分
@fixture(scope='function',autouse=True)
def修复长字符串差异(monkeypatch):
setattr(pprint,'pformat',partial(pprint.pformat,width=999))

PyCharm bundles拥有的
pytest
插件无法立即关闭。我对PyCharm中的pytest没有任何问题。所以我会检查你的设置(运行配置)。也许在过去你会做一些特别的设置,你能更具体一点吗@GiacomoCatenazzi?我已经考虑过所有可能的设置。如果在PyCharm中运行我的示例测试,您会得到不同的输出吗?你使用的是什么操作系统/版本?事实上@hoefling,我发现PyCharm使用的是一个插件,这行代码无条件地将pprint应用到左侧和右侧。第一行肯定是正确的。这让我想起,;我想我是第一个提出assertrepr hook的人:-)