我已经编写了一些测试用例来测试我编写的功能。该功能是简单地计算特定目录中的文件数。最终,我将拥有另一个函数,该函数将以某种方式运行,具体取决于每个目录中有多少个文件。在这种情况下,我正在使用两个目录。这是我的功能:
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
答案 0 :(得分:0)
您需要的是shutil.rmtree
,它将删除整个目录,包括其中的所有子目录和文件。之后,您可以使用os.mkdir
或os.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