猴子补丁由TON文件导入的模块(单元测试)

时间:2014-10-28 20:36:04

标签: python monkeypatching unit-testing

我可能在这里有一个XY problem,所以对于我的实际问题提供更好解决方案的答案,以及建议如何做我想做的愚蠢事情的答案都是受欢迎的。

X问题是,我有一个非常大的测试套件使用Python's unittest module。让我们说几百个单独的test_<foo>.py个文件。我知道如何使用unittest.discover()发现它们。但是,这将它们放在一个大的测试套件中。我想要三个(或四个或五个)子集:例如frontend测试套件和backend测试套件。为简单起见,您可以假设子集是互斥的。

我不想在一个大的&#34;目录中手动列出所有frontend个测试&#34 ;;我想继续使用discover()(以便自动选择新添加的前端测试,并且#34;内容和#34;永远不会过时)。

所以我的想法是以某种方式使用装饰器。例如,我现有的测试用例模块

import unittest

class TestButtons(unittest.TestCase):

    def test_simple(self):
        self.assertTrue(True)

会变成

import unittest
import MySuites

@MySuites.FrontEndTest
class TestButtons(unittest.TestCase):

    def test_simple(self):
        self.assertTrue(True)

然后,在discover()编辑所有测试用例的情况下,我可以通过检查类和#39;来将大套件过滤到我的小套件中。属性以适当的方式。

Y问题是,这个解决方案要求我import MySuites进入我的数百个测试文件中的每一个。如果可能的话,我想避免这种差异。事实上,理想情况下我可以写

import unittest

@unittest.FrontEndTest
class TestButtons(unittest.TestCase):

    def test_simple(self):
        self.assertTrue(True)

使用某种猴子修补。但是,我再也不想在数百个文件中使用import其他模块;我只想unittest来做我想要的事情&#34;没有我必须告诉它数百次。

这可能吗?本地Python演讲者如何解决我的问题?

1 个答案:

答案 0 :(得分:1)

我将unittest.TestCase子类化,然后让我的测试代码导入带有子类的模块。

# module: quuxunittest.py
import unittest

class FrontEndCase(unittest.TestCase):
    pass

class BackEndCase(unittest.TestCase):
    pass

然后你就可以像往常一样编写测试,并依靠测试发现来忽略它不应该运行的测试。

import quuxunittest

class TestButtons(quuxunittest.FrontEndCase):
    def test_simple(self):
        self.assertTrue(True)

然后,您希望将unittest发现代码子类化以利用此功能。