繁体   English   中英

python unittests有多个设置?

[英]python unittests with multiple setups?

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

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

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

任何帮助将非常感激。

你可以这样做:

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()

我会这样做:

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

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

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

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

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

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

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

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

您也可以继承并重新运行原始套件,但会覆盖整个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM