13

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

老实说,我知道将每个测试用例单独布置是一种很好的做法,但我也不喜欢重复自己。这实际上只是在不同的上下文中进行测试,而不是不同的测试。

我看到 unittest 支持模块级设置/拆卸装置,但对我来说,如何将我的一个测试模块转换为使用两种不同设置进行两次测试对我来说并不明显。

任何帮助将非常感激。

4

5 回答 5

9

你可以这样做:

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()
于 2018-03-26T20:40:42.637 回答
5

关于这个问题的其他答案是有效的,因为它们可以在多种环境下实际执行测试,但在玩弄这些选项时,我认为我更喜欢一种更独立的方法。我正在使用套件和结果来组织和显示测试结果。为了使用两个环境而不是两个测试运行一个测试,我采用了这种方法 - 创建一个 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)
于 2012-07-24T13:58:50.483 回答
4

我会这样做:

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

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

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

  4. 编写一个小的 shell 脚本来双向调用测试套件。

于 2012-07-22T23:42:53.083 回答
1

如果您的代码没有调用socket.setdefaulttimeout,那么您可以通过以下方式运行测试:

import socket
socket.setdeaulttimeout(60)
old_setdefaulttimeout, socket.setdefaulttimeout = socket.setdefaulttimeout, None
unittest.main()
socket.setdefaulttimeout = old_setdefaulttimeout

这是一个黑客,但它可以工作

于 2012-07-23T00:00:01.723 回答
1

您还可以继承并重新运行原始套件,但覆盖整个 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
于 2019-06-14T09:03:26.950 回答