Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python(2.7)unittests中参数化setUpClass()_Python_Unit Testing_Python Unittest - Fatal编程技术网

如何在Python(2.7)unittests中参数化setUpClass()

如何在Python(2.7)unittests中参数化setUpClass(),python,unit-testing,python-unittest,Python,Unit Testing,Python Unittest,我目前正在实现一种具有值之间插值、边界处理等功能的表,并希望为其编写单元测试 有很多可能的情况,例如表格可能只有一行/多行/列和不同的边界条件。所有这些场景中的表都应该通过相同的单元测试集 现在,我正在为其中一种情况编写一个基类,并从中派生出重写setUpClass()方法的基类。然而,这对于测试所有的组合来说都是乏味的 可以生成TestCase类,并使用不同的参数动态运行它们 在谷歌搜索问题时,我发现最好的方法是重载load_tests(),并逐个添加所有测试方法(这意味着在运行每个测试方法之

我目前正在实现一种具有值之间插值、边界处理等功能的表,并希望为其编写单元测试

有很多可能的情况,例如表格可能只有一行/多行/列和不同的边界条件。所有这些场景中的表都应该通过相同的单元测试集

现在,我正在为其中一种情况编写一个基类,并从中派生出重写
setUpClass()
方法的基类。然而,这对于测试所有的组合来说都是乏味的

可以生成TestCase类,并使用不同的参数动态运行它们


在谷歌搜索问题时,我发现最好的方法是重载
load_tests()
,并逐个添加所有测试方法(这意味着在运行每个测试方法之前设置对象,而不是在每个场景中设置一次)。

多亏@jonrsharpe的提示,我成功地做到了这一点

我的解决方案是动态创建类,然后使用
load\u tests
将它们添加到TestSuite:

def create_test_case(testcase_name, scenario_data):
    class ScenarioTestCase(BaseTestCase):
        @classmethod
        def setUpClass(cls):
            cls.fillClassVariables(scenario_data)
    return_class = ScenarioTestCase
    return_class.__name__ = testcase_name #for separating the results
    return return_class


def load_tests(loader, tests, pattern):
    list_scenario_names = [...]
    list_scenario_data = [...]

    loader = unittest.TestLoader()
    tests = TestSuite()
    for scenario_name, scenario_data in zip(list_scenario_names, list_scenario_data):
        tests.addTests(loader.loadTestsFromTestCase(
            create_test_case(scenario_name, scenario_data)))
    return tests

通过这种方式,使用不同的参数动态创建测试用例,并在PyCharm的TestRunner选项卡中单独列出。

虽然这有一个公认的答案,但我想记录如何通过子类化来实现这一点,因为我花了很长时间才找到这种解决方案的细节。在我的例子中,目标是让一个具有多个方法的TestCase类拥有一个类固定装置(在文件系统上设置文件以测试cli工具),并在参数化方面稍微改变这一点

# Inherit from object to not run this abstract class
class TemporaryFolderClassSetup(object):

    @classmethod
    def setUpClass(cls):
        try:
            cls._root = tempfile.mkdtemp()
            # .. create some files here ...
            # allow subclasses to manipulate file tre
            cls.prepare_directory(cls._root)
        except Exception as e:
            cls.tearDownClass()
            raise

    @classmethod
    def tearDownClass(cls):
        shutil.rmtree(cls._root)

    @classmethod
    def prepare_directory(cls, root):
        pass

    # test methods that will run in each subclass
    def testX():
        pass

# scenariotest, must inherit from superclass first, before unittest.TestCase)
class ScenarioTests(TemporaryFolderClassSetup, unittest.TestCase):

    # ... called by parent class
    @classmethod
    def prepare_directory(cls, root):
        pass

    # test only for this scenario
    def testY(self):
        pass

为什么不编写一个类工厂,根据场景的特定要求,使用
setUpClass
创建主测试类的子类?您可以使用或创建参数化测试系列。@jornsharpe这很有效。我没有考虑它的主要原因是,我不知道如何让PyCharm(或
unittestdiscover
)知道所创建的类。我现在使用
load\u tests()
@Tim来实现这一点。如果你破解了它,你可以为自己的问题写一个答案。我可能倾向于使用一个元组列表
[(场景名称,场景数据),…]
,以保持名称和数据在一起,但在其他方面做得很好!