Unittest - 使用对象进行数据驱动的边缘案例测试?

时间:2016-12-27 23:50:46

标签: python unit-testing data-driven-tests data-driven

请考虑以下事项:

import unittest

class MyClass:
    def __init__(self, dict: {}):
        try:
            if self.validate_dict(dict):
                self.data = dict
        except Exception as e:
            raise Exception('Unable to create MyClass: {}'.format(str(e)))

    def validate_dict(self, dict: {}):
        if 'special_key' not in dict:
            raise Exception('Missing Key: special_key')

        # ... perhaps more complicated validation code...
        return True

class MyTests(unittest.TestCase):
    def test_bad_validation(self):
        with self.assertRaises(Exception) as context:
            test_dict = {}
            test_class = MyClass(test_dict)

        self.assertTrue('Unable to create' in str(context.exception))

...假设这不是单元测试此函数的可靠方法,除了{}之外,我如何向unittest添加更多测试用例?

我觉得查看特定测试的所有测试用例的一个很好的列表并快速添加新的列表会很有用。

我找到了一个库DDT来解决这个问题,但似乎没有任何方法可以将整个对象(如dict)作为测试参数传递而无需解压缩它。在这种情况下,我想测试密钥的存在(并且可能有很多),因此将它们解压缩到像DDT这样的单个算法中似乎是一个糟糕的解决方案。

unittest是否支持此类内容?我知道pytest确实如此,但我希望首先看一下unittest是否可能。

对此代码进行单元测试的其他方法也很受欢迎。

1 个答案:

答案 0 :(得分:1)

我相信您正在寻找subTest方法(在3.4中添加)。

import unittest

class MyClass:
    def __init__(self, dic: {}):
        try:
            if self.validate_dict(dic):
                self.data = dic
        except KeyError as e:
            raise ValueError('Unable to create MyClass: {}'.format(e))

    def validate_dict(self, dic):
        if 'special_key' not in dic:
            raise KeyError('Missing Key: special_key')

        # ... perhaps more complicated validation code...
        return True

class MyTests(unittest.TestCase):
    def test_bad_validation(self):
        for test_dict in (
                {},
                {'a':1},
                {'b':2, 'else':3},
                {'special_key':4},
                ):
            with self.subTest(test_dict=test_dict):
                with self.assertRaises(Exception) as context:
                    MyClass(test_dict)
                self.assertTrue('Unable to create' in str(context.exception))

unittest.main()

在3.6中,对于通过验证检查失败的情况打印:

======================================================================
FAIL: test_bad_validation (__main__.MyTests) (test_dict={'special_key': 4})
----------------------------------------------------------------------
Traceback (most recent call last):
  File "F:\Python\mypy\tem2.py", line 23, in test_bad_validation
    MyClass(test_dict)
AssertionError: Exception not raised

----------------------------------------------------------------------
Ran 1 test in 0.014s

FAILED (failures=1)