用Python对“重新命名文件”进行单元测试

时间:2019-06-25 19:00:31

标签: python python-3.x unit-testing

假设我具有以下功能,并且需要对其进行单元测试:

def move_files_to(files, path):
for file in files:
    os.rename(file, path + "/" + file)

我对此主题的看法:

模拟os.rename将不会导致任何结果,另一方面,拥有文件并重命名它们将是“正在执行I / O”,在单元测试中应避免使用。如果我错了,请纠正我。在这里进行测试有意义吗?

3 个答案:

答案 0 :(得分:2)

我的建议是

创建一个DirectoryTestCase(unittest.TestCase)

  1. 以下设置:i)删除(未跟踪的)目录(如果存在)(例如_tests下的tests/)ii)创建一个空目录,并iii)将文件复制(测试)到该目录。
  2. 删除目录的拆解

第二,在该测试用例下创建测试。您可以测试将符号链接等移动到同一目录(重命名),移动到新目录(在测试目录下,如果不存在或失败,是否应该创建?),等等,所有都在现有目录的封装下进行。

如果要并行运行测试,请为目录指定一个唯一的(随机但有效)名称。

示例代码:

import unittest
import shutil
import os
import string
import random


class DirectoryTestCase(unittest.TestCase):
    test_files = ['file.txt']

    def setUp(self) -> None:
        unique_string = ''.join(random.choices(string.digits, k=10))

        self.path = os.path.join(os.path.dirname(__file__), '_temp' + unique_string)

        shutil.rmtree(self.path, ignore_errors=True)

        os.makedirs(self.path, exist_ok=True)

        for file in self.test_files:
            shutil.copy(file, self.path)

    def tearDown(self) -> None:
        shutil.rmtree(self.path, ignore_errors=True)

    def test_basic(self):
        # validate the existence of the file, not an actual test.
        self.assertTrue(os.path.exists(os.path.join(self.path, 'file.txt')))

答案 1 :(得分:1)

不需要测试os.rename,但是需要测试您的代码。在您的特定情况下,最简单的方法是修补os.rename

from unittest.mock import patch

def test_move_files():
    files = ['a.txt', 'b.txt']
    path = 'old'
    expected = [(('a.txt', 'old/a.txt'),),
                (('b.txt', 'old/b.txt'),)]
    with patch('os.rename') as rename:
        move_files_to(files, path)
        assert rename.call_args_list == expected

答案 2 :(得分:0)

  1. 由于在python中模拟OS模块很困难,因此可以忽略编写unitest

  2. 但是单元测试意味着在某些可能的情况下验证您的单一方法,因此如果您认为必须始终进行验证。那么必须进行单元测试。