单元测试输入验证(python)



我进行以下输入验证检查:

self.path = kwargs.get('path', default_path) 
if not os.path.isdir(self.path): 
raise ValueError(msg1)
if not os.access(self.path, os.W_OK):
raise ValueError(msg2)

测试它的最佳方式是什么(在单元测试中(?

澄清:我想检查以下内容:

如果路径不是目录,
  • 函数应引发ValueError
  • 如果路径是不可写的目录,则函数应引发ValueError

测试此功能的最简单方法是模拟相应的os函数。假设你的函数是这样的:

class MyClass:
def __init__(self):
self.path = None
def get_path(self, *args, **kwargs):
self.path = kwargs.get('path', 'default_path')
if not os.path.isdir(self.path):
raise ValueError('message 1')
if not os.access(self.path, os.W_OK):
raise ValueError('message 2')

如果使用unittest,那么您的测试可以如下所示:

class TestPath(unittest.TestCase):
@mock.patch('os.path.isdir', return_value=False)
def test_path_is_not_dir(self, mocked_isdir):
with self.assertRaises(ValueError, msg="message 1"):
inst = MyClass()
inst.get_path(path="foo")
@mock.patch('os.path.isdir', return_value=True)
@mock.patch('os.access', return_value=False)
def test_path_not_accessible(self, mocked_access, mocked_isdir):
with self.assertRaises(ValueError, msg="msg2"):
inst = MyClass()
inst.get_path(path="foo")
@mock.patch('os.path.isdir', return_value=True)
@mock.patch('os.access', return_value=True)
def test_valid_path(self, mocked_access, mocked_isdir):
inst = MyClass()
inst.get_path(path="foo")
self.assertEqual("foo", inst.path)

通过这种方式,您可以在不需要提供任何真实文件的情况下测试功能。

除此之外,将参数解析功能与测试代码中的测试功能分离也是有意义的。

最新更新