13

我在使用 pyDev 运行 pytest 单元测试时遇到问题。我尝试使用模块共享夹具和终结器运行单元测试,该终结器应在最后一次测试后执行。但是在 pyDev 中运行单元测试时,它不会使用相同的实例,而是创建两个不同的实例。该示例在控制台中或从 pydev 中的脚本启动时运行良好。

我在 Win7 上使用平台 Python 2.7.3、pytest-2.3.4、pyDev 2.7.3.2013031601、Eclipse 4.2。

我尝试了http://pytest.org/latest/fixture.html中的示例

pydev 的输出是:

============================= test session starts ==============================
platform win32 -- Python 2.7.3 -- pytest-2.3.4
__________________________________ test_ehlo ___________________________________
smtp = <smtplib.SMTP instance at 0x027F9080>
__________________________________ test_noop ___________________________________
smtp = <smtplib.SMTP instance at 0x027FF3C8>

控制台输出为:

============================= test session starts ==============================
platform win32 -- Python 2.7.3 -- pytest-2.3.4
__________________________________ test_ehlo ___________________________________
smtp = <smtplib.SMTP instance at 0x01E51288>
__________________________________ test_noop ___________________________________
smtp = <smtplib.SMTP instance at 0x01E51288>

这是预期的行为。我究竟做错了什么??

使用的代码是conftest.py:

import pytest
import smtplib

@pytest.fixture(scope="module")
def smtp():
return smtplib.SMTP("merlinux.eu")

test_smtplib.py 中的测试代码:

# content of test_module.py
def test_ehlo(smtp):
    response = smtp.ehlo()
    assert response[0] == 250
    assert "merlinux" in response[1]
    assert 0  # for demo purposes

def test_noop(smtp):
    response = smtp.noop()
    assert response[0] == 250
    assert 0  # for demo purposes

从脚本运行测试:

import pytest,os
os.chdir("[path_to_tests]/tests") #your file location
pytest.main(['-s', 'test_smtplib.py'])

任何建议,非常感谢您的帮助!

4

2 回答 2

1

似乎这是 pydev 方面长期存在的错误。我刚刚修复它并向 Pydev 提交了拉取请求,请参阅https://github.com/fabioz/Pydev/pull/120。同时,您可能会取出一点点更改并应用到您安装的 pydev 版本,从而启用正确的 pydev/pytest 运行范围。

于 2014-04-02T07:18:31.417 回答
1

我没有 Eclipse,但我一直在查看 Pydev 和 pytest 的源代码。pytest 默认情况下不使用多处理,但如果您安装了 xdist,它将使用。也许你有它?或者也许 Eclipse 已经安装了它?

如果您仍然有可用的系统,您可以尝试在您的 pytest 参数中设置以下选项吗?它只是告诉 pytest 在使用此处记录的xdist 时使用一个进程。

-n=1或者它会更喜欢-n 1

如果这不起作用,那么这也不应该起作用,但你能试试吗?像以前一样在pytest选项中使用下面的选项(而不是在 pydev 测试运行器选项中)来启用模块级测试。这是一个 pydev 测试运行器选项,所以我猜它会导致错误,但也许其他一些关闭该选项的代码会使用它。

--split_jobs=module或者也许再次--split_jobs module

于 2013-12-02T17:49:26.440 回答