pytest异常无类型对象不可调用

时间:2016-05-03 16:28:35

标签: python request pytest python-unittest pytest-django

test1.py我有以下代码

@pytest.fixture(scope="session")
def moduleSetup(request):
    module_setup = Module_Setup()
    request.addfinalizer(module_setup.teardown())
    return module_setup

def test_1(moduleSetup):
    print moduleSetup
    print '...'
    #assert 0

# def test_2(moduleSetup):
#     print moduleSetup
#     print '...'
#     #assert 0

conftest.py我有

class Module_Setup:
    def __init__(self):
        self.driver = webdriver.Firefox()

    def teardown(self):
        self.driver.close()

当我运行它时启动并关闭浏览器。

但我也得到错误self = <CallInfo when='teardown' exception: 'NoneType' object is not callable>, func = <function <lambda> at 0x104580488>, when = 'teardown'

此外,如果我想同时运行具有相同驱动程序对象的测试test_1test_2,我需要使用范围modulesession

1 个答案:

答案 0 :(得分:4)

关于例外

使用request.addfinalizer()时,您应该传递对函数的引用。

您的代码正在传递调用该​​函数的结果。

request.addfinalizer(module_setup.teardown())

你应该这样称呼它:

request.addfinalizer(module_setup.teardown)

关于夹具范围

如果您的灯具允许在多个测试呼叫中重复使用,请使用"session" 范围。如果它只允许在一个模块中重复使用,请使用"module"范围。

替代夹具解决方案

你使用灯具的方式不是pytest风格,它更像是单元测试。

从您显示的代码来看,您需要的唯一想法是运行带驱动程序的Firefox,允许在测试中使用它,完成后,您需要关闭它。

这可以通过单一装置完成:

@pytest.fixture(scope="session")
def firefox(request):
    driver = webdriver.Firefox()
    def fin():
        driver.close()
    request.addfinalizer(fin)

甚至更好地使用@pytest.yield_fixture

@pytest.yield_fixture(scope="session")
def firefox(request):
    driver = webdriver.Firefox()
    yield driver
    driver.close()

yield是夹具停止执行的位置,产生创建的值(驱动程序)给测试用例。

测试结束后(或更好,当我们的灯具范围结束时),它 继续运行yield之后的指令并进行清理 工作

在所有情况下,您可以按如下方式修改测试用例:

def test_1(firefox):
    print moduleSetup
    print '...'

并且moduleSetup夹具变得完全过时了。