带有继承的pytest参数化夹具-子类没有属性

时间:2019-02-20 16:02:58

标签: python inheritance pytest

我遇到了我无法理解的带有pytest参数化夹具的奇怪行为。

给出此sample.py:

import pytest
import requests
import conftest

@pytest.mark.parametrize('handler_class', [conftest.Child])
def test_simple(my_fixture):
    try:
        requests.get("http://localhost:8000")
    except:
        pass

和以下conftest.py在同一目录中:

class Base(http.server.SimpleHTTPRequestHandler):
    def __init__(self, request, client_address, server):
        super().__init__(request, client_address, server)
        self.value = 0

    def do_GET(self):
        print(self.value)   # AttributeError: 'Child' object has no attribute 'value'
        self.send_error(500)

class Child(Base):
    def __init__(self, request, client_address, server):
        super().__init__(request, client_address, server)
        self.value = 1

@pytest.fixture
def my_fixture(handler_class):
    handler = handler_class
    httpd = http.server.HTTPServer(('', 8000), handler)
    http_thread = threading.Thread(target=httpd.serve_forever)
    http_thread.start()
    yield
    httpd.shutdown()

如果您运行

  

pytest -s sample.py

有一个例外,“ AttributeError:'Child'对象没有属性'value'”为什么? Base和Child这两个类都具有value属性。

1 个答案:

答案 0 :(得分:0)

我的建议是在其他线程中的行print(self.value)之前到达行self.value = 0,这就是为什么会发生这种错误的原因。您需要像这样重构代码:

class Base(http.server.SimpleHTTPRequestHandler):
    def __init__(self, request, client_address, server, value=0):
        self.value = value
        super().__init__(request, client_address, server)

    def do_GET(self):
        print(self.value)  # 1 when doing pytest -s sample.py
        self.send_error(500)

class Child(Base):
    def __init__(self, request, client_address, server):
        super().__init__(request, client_address, server, value=1)