测试后清理文件的最有效方法?

时间:2018-08-28 11:30:02

标签: python unit-testing testing

我已经编写了一些测试用例来测试我编写的功能。该功能是简单地计算特定目录中的文件数。最终,我将拥有另一个函数,该函数将以某种方式运行,具体取决于每个目录中有多少个文件。在这种情况下,我正在使用两个目录。这是我的功能:
dir_handler.py

from pathlib import Path

def count_files_in_dir(dirpath):
    assert(dirpath.is_dir())
    file_list = []
    for file in dirpath.iterdir():
        if file.is_file():
            file_list.append(file)
    return len(file_list)  

这是我的测试用例:
test_dir_handler.py

from imports import *
import os
from main.dir_handler import count_files_in_dir


class DirHandlerTests(unittest.TestCase):

def test_return_count_of_zero_when_no_file_exists_in_input_dir(self):
    self.assertEqual(0, count_files_in_dir(INPUT_FILE_PATH))

def test_return_count_of_zero_when_no_file_exists_in_output_dir(self):
    self.assertEqual(0, count_files_in_dir(OUTPUT_FILE_PATH))

def test_return_count_of_one_when_one_file_exists_in_input_dir(self):
    with open(str(INPUT_FILE_PATH)+ "/"+"input.csv", "w") as file:
        self.assertEqual(1, count_files_in_dir(INPUT_FILE_PATH))

def test_return_count_of_one_when_one_file_exists_in_output_dir(self):
    with open(str(OUTPUT_FILE_PATH)+ "/"+"output.csv", "w") as file:
        self.assertEqual(1, count_files_in_dir(OUTPUT_FILE_PATH))

def test_return_count_of_two_when_two_files_exists_in_output_dir(self):
    with open(str(OUTPUT_FILE_PATH)+ "/"+"output.csv", "w") as file:
        with open(str(OUTPUT_FILE_PATH)+ "/"+"output2.csv", "w") as file:
            self.assertEqual(2, count_files_in_dir(OUTPUT_FILE_PATH))

#clearing up testing files at the end of test
def tearDown(self):
    try:
        os.remove(str(INPUT_FILE_PATH)+ "/"+"input.csv")
    except FileNotFoundError as e:
        pass
    try:
        os.remove(str(OUTPUT_FILE_PATH)+ "/"+"output.csv")
    except FileNotFoundError as e:
        pass

    try:
        os.remove(str(OUTPUT_FILE_PATH)+ "/"+"output2.csv")
    except FileNotFoundError as e:
        pass

if __name__ == '__main__':
    unittest.main()

如您所见,我不得不分别删除效率不高的“ input2.csv”和“ output2.csv”。 INPUT_FILE_PATH和OUTPUT_FILE_PATH都在同一目录“文件”下。所有测试都通过了,但是在测试结束时,我想提出有关清除INPUT_FILE_PATH和OUTPUT_FILE_PATH目录的最佳方法的建议。谢谢

编辑:
使用@rockport的建议,我已经实现了setUp / tearDown方法。该代码可以按需工作,但仍然很混乱。在测试结束时,它将清除output_file文件夹和input_file文件夹。另外,我已经实现了pathlib而不是os,因为我将在mac和Windows上运行并编辑代码。这是我的代码中的一些更改

def setUp(self):
        self.input_file = INPUT_FILE_PATH.joinpath("input.csv")
        self.output_file = OUTPUT_FILE_PATH.joinpath("output.csv")
        self.output_file2 = OUTPUT_FILE_PATH.joinpath("output2.csv")

def test_return_count_of_one_when_one_file_exists_in_output_dir(self):
    with self.output_file.open(mode='w') as file:
        self.assertEqual(1, count_files_in_dir(OUTPUT_FILE_PATH))

def test_return_count_of_two_when_two_files_exist_in_output_dir(self):
    with self.output_file.open(mode='w') as file:
            with self.output_file2.open(mode='w') as file:
                self.assertEqual(2, count_files_in_dir(OUTPUT_FILE_PATH))

def tearDown(self):
    for file in INPUT_FILE_PATH.iterdir():
        try:
            file.unlink()
        except FileNotFoundError as e:
            pass
    for file in OUTPUT_FILE_PATH.iterdir():
        try:
            file.unlink()
        except FileNotFoundError as e:
            pass

3 个答案:

答案 0 :(得分:0)

您需要的是shutil.rmtree,它将删除整个目录,包括其中的所有子目录和文件。之后,您可以使用os.mkdiros.makedirs重新创建目录。这是一个示例:

import os
import shutil

shutil.rmtree(INPUT_FILE_PATH)
os.mkdir(INPUT_FILE_PATH)

答案 1 :(得分:0)

最佳做法是实施setUp方法,在此方法中,您可以在临时文件夹中创建文件。然后,您在此文件夹上运行实际测试。最后没有必要移除。

单元测试不应依赖环境,例如测试文件夹外部的文件。这就是为什么我们在测试中使用固定装置的原因。


您要求的简化可能是

def tearDown(self):

    for p, f in ((INPUT_FILE_PATH, "input.csv"),
                 (OUTPUT_FILE_PATH, "output.csv"),
                 (OUTPUT_FILE_PATH, "output2.csv")):
        try:
            os.remove(str(p) + "/" + f)
        except FileNotFoundError:
            pass

为您进行编辑,为什么不这样做:

def test_return_count_of_one_when_one_file_exists_in_output_dir(self):
    self.assertEqual(1, count_files_in_dir(OUTPUT_FILE_PATH))

答案 2 :(得分:0)

如果您不想删除整个树,则可以简单地将路径附加到列表中,然后遍历列表以删除其中的所有路径

pathlist = []

def test_return_count_of_one_when_one_file_exists_in_output_dir(self):
    path = str(OUTPUT_FILE_PATH) + "/output.csv"
    pathlist.append(path)
    with open(path, "w") as file:
        self.assertEqual(1, count_files_in_dir(OUTPUT_FILE_PATH))

然后:

for path in pathlist:
    try:
        os.remove(path)
    except FileNotFoundError:
        pass