单元测试输入验证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,msg="msg2"):
            inst = MyClass()
            inst.get_path(path="foo")

    @mock.patch('os.path.isdir',return_value=True)
    def test_valid_path(self,mocked_isdir):
        inst = MyClass()
        inst.get_path(path="foo")
        self.assertEqual("foo",inst.path)

通过这种方法,您无需提供任何实际文件即可测试功能。

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