【发布时间】:2015-06-24 02:24:56
【问题描述】:
我有一个场景,能够在 py.test 中对基础测试类进行子类化将使我们的测试环境非常可扩展。我遇到的问题是我无法覆盖基类的属性并在参数化装饰器中使用它们。
import pytest
class TestBase():
l = [2,3]
@pytest.mark.parametrize('p', l)
def testOne(self, p):
assert p == p
class TestSubClass(TestBase):
l = [1, 2, 3, 4]
class TestSubClass2(TestBase):
l = [3, 5]
在这种情况下,TestSubClass 和 TestSubClass2 始终使用来自TestBase 的列表l 运行,因为装饰器查找l 的范围是直接本地范围。
我不能使用self.l,因为在评估装饰器时self 不存在(没有实例)。
我可以解决这个问题并在测试用例中手动执行参数化,但是我会丢失来自 py.test 的单个报告。例如。
import pytest
class TestBase()
def testOne(self):
for p in self.l:
assert p == p
class TestSubClass(TestBase):
l = [1, 2, 3, 4]
class TestSubClass2(TestBase):
l = [3, 5]
如何对基类进行子类化并为每个子类自定义参数化?
【问题讨论】:
-
除了你的问题:避免使用名为
l的变量 - 在很多字体上它无法与1或I区分开来 - 即使它是不同的仍然难以阅读。