我目前有一个与这些类似的项目和测试。
class mylib:
@classmethod
def get_a(cls):
return 'a'
@classmethod
def convert_a_to_b(cls, a):
return 'b'
@classmethod
def works_with(cls, a, b):
return True
class TestMyStuff(object):
def test_first(self):
self.a = mylib.get_a()
def test_conversion(self):
self.b = mylib.convert_a_to_b(self.a)
def test_a_works_with_b(self):
assert mylib.works_with(self.a, self.b)
使用 py.test 0.9.2,这些测试(或类似的测试)通过了。对于更高版本的 py.test,test_conversion 和 test_a_works_with_b 失败并显示“TestMyStuff 没有属性 a”。
我猜这是因为在后来的 py.test 构建中,为每个测试的方法创建了一个单独的 TestMyStuff 实例。
编写这些测试的正确方法是什么,以便可以为序列中的每个步骤给出结果,但可以(必须)使用先前(成功)测试的状态来执行后续测试?
最佳答案
我部分同意 Ned 的观点,因为最好避免随机共享测试状态。但我也认为在测试期间逐步积累状态有时是有用的。
使用 py.test,您实际上可以通过明确表示您想要共享测试状态来做到这一点。您的示例重写后可以正常工作:
class State:
""" holding (incremental) test state """
def pytest_funcarg__state(request):
return request.cached_setup(
setup=lambda: State(),
scope="module"
)
class mylib:
@classmethod
def get_a(cls):
return 'a'
@classmethod
def convert_a_to_b(cls, a):
return 'b'
@classmethod
def works_with(cls, a, b):
return True
class TestMyStuff(object):
def test_first(self, state):
state.a = mylib.get_a()
def test_conversion(self, state):
state.b = mylib.convert_a_to_b(state.a)
def test_a_works_with_b(self, state):
mylib.works_with(state.a, state.b)
您可以使用最新的 py.test 版本运行它。每个函数接收一个“状态”对象,“funcarg”工厂最初创建它并将其缓存在模块范围内。连同 py.test 保证测试按文件顺序运行,测试函数可以更确切地说它们将在测试“状态”上递增地工作。
但是,它有点脆弱,因为如果您通过例如仅选择运行“test_conversion” “py.test -k test_conversion” 那么您的测试将失败,因为第一个测试尚未运行。我认为进行增量测试的某种方法会很好,因此也许我们最终可以找到一个完全可靠的解决方案。
喂, 霍尔格
关于python - 如何在 py.test 中跨测试累积状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3145720/