使用模块共享夹具运行pytest单元测试的PyDev失败

时间:2013-04-08 08:56:46

标签: python unit-testing pydev pytest

我在使用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'])

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

2 个答案:

答案 0 :(得分:1)

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

如果您仍然可以使用该系统,可以尝试在pytest参数中设置以下选项吗?它只是告诉pytest在使用xdist as documented here时使用一个进程。

-n=1或者它可能更喜欢-n 1

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

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

答案 1 :(得分:1)

似乎这是pydev方面的一个长期存在的错误。我刚修好并向Pydev提交了拉取请求,请参阅https://github.com/fabioz/Pydev/pull/120。同时,您可能会稍微改变一下并应用于已安装的pydev版本,启用适当的pydev / pytest运行并使用作用域。