python单元测试多个设置?

时间:2012-07-22 23:39:39

标签: python unit-testing sockets fixtures

我正在使用带有数百个测试用例的套接字的模块。这很好。除了现在我需要使用和不使用socket.setdefaulttimeout(60)来测试所有情况......请不要告诉我剪切和粘贴所有测试并在setup / teardown中设置/删除默认超时。

老实说,我认为每个测试用例都是好的做法,但我也不喜欢重复自己。这实际上只是在不同的测试环境中进行测试。

我看到unittest支持模块级设置/拆卸夹具,但对我来说,如何将我的一个测试模块转换为两次不同设置的测试本身并不明显。

任何帮助都会非常感激。

5 个答案:

答案 0 :(得分:4)

我会这样做:

  1. 让您的所有测试都来自您自己的TestCase类,我们称之为SynapticTestCase。

  2. 在SynapticTestCase.setUp()中,检查环境变量以确定是否设置套接字超时。

  3. 运行整个测试套件两次,一次设置环境变量,然后再设置另一种方式。

  4. 编写一个小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