gpt4 book ai didi

python - 每种测试方法都有不同的设置/拆卸

转载 作者:行者123 更新时间:2023-11-28 20:42:53 32 4
gpt4 key购买 nike

我正在测试一个类,有很多测试方法。但是,每种方法都有一个独特的上下文。然后我编写如下代码:

class TestSomeClass(unittest.TestCase):
def test_a():
with a_context() as c:
pass

def test_b():
with b_context() as c:
pass

def test_c():
with c_context() as c:
pass

但是,上下文管理器与测试用例无关,并且会生成临时文件。为了在测试失败时不污染文件系统,我想在设置/拆卸场景中使用每个上下文管理器。

我查看了 nose 的 with_setup,但文档说它仅适用于函数,不适用于方法。另一种方法是将测试方法移动到单独的类中,每个类都具有设置/拆卸功能。执行此操作的好方法是什么?

最佳答案

首先,我不确定您所拥有的为什么不起作用。我写了一些测试代码,它表明 exit 代码总是在 unittest.main() 执行环境下被调用。 (请注意,我没有测试 nose,所以也许这就是我无法复制您的失败的原因。)也许您的上下文管理器已损坏?

这是我的测试:

import unittest
import contextlib
import sys

@contextlib.contextmanager
def context_mgr():
print "setting up context"
try:
yield
finally:
print "tearing down context"

class TestSomeClass(unittest.TestCase):
def test_normal(self):
with context_mgr() as c:
print "normal task"

def test_raise(self):
with context_mgr() as c:
print "raise task"
raise RuntimeError

def test_exit(self):
with context_mgr() as c:
print "exit task"
sys.exit(1)

if __name__ == '__main__':
unittest.main()

通过使用 $ python test_test.py 运行它,我看到 tearing down context 用于所有 3 个测试。

无论如何,要回答你的问题,如果你想为每个测试单独设置和拆卸,那么你需要将每个测试放在它自己的类中。您可以设置一个父类来为您完成大部分工作,因此没有太多额外的样板文件:

class TestClassParent(unittest.TestCase):
context_guard = context_mgr()
def setUp(self):
#do common setup tasks here
self.c = self.context_guard.__enter__()
def tearDown(self):
#do common teardown tasks here
self.context_guard.__exit__(None,None,None)

class TestA(TestClassParent):
context_guard = context_mgr('A')
def test_normal(self):
print "task A"

class TestB(TestClassParent):
context_guard = context_mgr('B')
def test_normal(self):
print "task B"

这会产生输出:

$ python test_test.py 
setting up context: A
task A
tearing down context: A
.setting up context: B
task B
tearing down context: B
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

关于python - 每种测试方法都有不同的设置/拆卸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25233619/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com