如何测试创建目录的函数?

vvv*_*vvv 5 python testing unit-testing

如何在 Python 中测试创建目录的函数?你能举一个例子make_directory_test()函数吗?

def make_directory(directory):
    if not os.path.exists(directory):
        os.makedirs(directory)
Run Code Online (Sandbox Code Playgroud)

hsp*_*her 7

只需测试该目录是否存在

def test_make_directory(self):
    directory_path = '...' # somepath

    make_directory(directory_path)

    self.assertTrue(os.path.exists(directory_path))
Run Code Online (Sandbox Code Playgroud)

并确保在tearDownor 中的每次测试后删除在单元测试中创建的任何目录setUp,以确保测试的独立性

  • 缺少 ) 断言为真。 (2认同)
  • 我认为在 `make_directory` 之前的 `self.assertFalse(os.path.exists(directory_path))` 会改善情况。 (2认同)

idj*_*jaw 5

这里的一个好做法是学习如何使用模拟flexmock等测试框架

此外,你应该使用Python的单元测试框架。

您在这里的目标不一定是确保创建某些东西,而是要调用它。所以你想要做的是模拟外部调用来帮助测试你的方法的正确流程。所以在这种情况下,你应该模拟存在和 makedirs。然后确保它被调用。那将是一个可以接受的单元测试。你会做这样的事情:

让我们假设您的主要代码位于名为 my_module.py 的模块中。所以你想创建一个测试文件,让我们称它为 test.py 以保持简单并在你的单元测试中做这样的事情:

from mock import patch
import my_module
import unittest


class MyTest(unittest.TestCase):
    @patch('my_module.exists')
    @patch('my_module.makedirs')
    def test_create_dir(self, mock_make_dirs, mock_exists):
        mock_exists.return_value = True

        make_directory('thing_to_create')

        mock_make_dirs.assert_called_with('thing_to_create')
Run Code Online (Sandbox Code Playgroud)

所以,这里发生的事情是你告诉模拟你想要模拟 makedirs 并存在。您正在使存在返回与指定的 True mock_exists.return_value。然后您进行实际调用,您的模拟将在该方法调用中生效。最后一行 withmock_make_dirs.assert_called_with将确保您创建目录的方法将被实际调用。

如果你仍然想测试某些东西确实被创建了

在这种情况下,您可以做的可能是冒险使用上下文管理器并创建一个临时文件夹进行测试,完成您的工作以测试您的方法以及您必须做的任何其他事情,一旦完成您的工作,上下文管理器将销毁自己。

有关上下文管理器的信息,请查看contextlib