我正在使用带有数百个测试用例的套接字的模块。这很好。除了现在我需要使用和不使用socket.setdefaulttimeout(60)来测试所有情况......请不要告诉我剪切和粘贴所有测试并在setup / teardown中设置/删除默认超时。
老实说,我认为每个测试用例都是好的做法,但我也不喜欢重复自己。这实际上只是在不同的测试环境中进行测试。
我看到unittest支持模块级设置/拆卸夹具,但对我来说,如何将我的一个测试模块转换为两次不同设置的测试本身并不明显。
任何帮助都会非常感激。
答案 0 :(得分:4)
我会这样做:
让您的所有测试都来自您自己的TestCase类,我们称之为SynapticTestCase。
在SynapticTestCase.setUp()中,检查环境变量以确定是否设置套接字超时。
运行整个测试套件两次,一次设置环境变量,然后再设置另一种方式。
编写一个小shell脚本以双向调用测试套件。
答案 1 :(得分:4)
关于这个问题的其他答案是有效的,因为它们可以在多种环境下实际执行测试,但是在玩这些选项时,我认为我喜欢一种更独立的方法。我正在使用套件和结果来组织和显示测试结果。为了使用两个环境而不是两个测试运行一个测试,我采用了这种方法 - 创建一个TestSuite子类。
class FixtureSuite(unittest.TestSuite):
def run(self, result, debug=False):
socket.setdefaulttimeout(30)
super().run(result, debug)
socket.setdefaulttimeout(None)
...
suite1 = unittest.TestSuite(testCases)
suite2 = FixtureSuite(testCases)
fullSuite = unittest.TestSuite([suite1,suite2])
unittest.TextTestRunner(verbosity=2).run(fullSuite)
答案 2 :(得分:4)
class TestCommon(unittest.TestCase):
def method_one(self):
# code for your first test
pass
def method_two(self):
# code for your second test
pass
class TestWithSetupA(TestCommon):
def SetUp(self):
# setup for context A
do_setup_a_stuff()
def test_method_one(self):
self.method_one()
def test_method_two(self):
self.method_two()
class TestWithSetupB(TestCommon):
def SetUp(self):
# setup for context B
do_setup_b_stuff()
def test_method_one(self):
self.method_one()
def test_method_two(self):
self.method_two()
答案 3 :(得分:1)
如果您的代码没有调用socket.setdefaulttimeout
,那么您可以通过以下方式运行测试:
import socket
socket.setdeaulttimeout(60)
old_setdefaulttimeout, socket.setdefaulttimeout = socket.setdefaulttimeout, None
unittest.main()
socket.setdefaulttimeout = old_setdefaulttimeout
这是一个黑客,但它可以工作
答案 4 :(得分:0)
您还可以继承并重新运行原始套件,但覆盖整个setUp或其中的一部分:
class TestOriginal(TestCommon):
def SetUp(self):
# common setUp here
self.current_setUp()
def current_setUp(self):
# your first setUp
pass
def test_one(self):
# your test
pass
def test_two(self):
# another test
pass
class TestWithNewSetup(TestOriginal):
def current_setUp(self):
# overwrite your first current_setUp