Самый эффективный способ очистки файлов после теста? - PullRequest
0 голосов
/ 28 августа 2018

Я написал несколько тестов, которые проверяют написанную мной функцию. Функция состоит в том, чтобы просто посчитать количество файлов в определенном каталоге. В конце концов у меня будет другая функция, которая будет вести себя определенным образом в зависимости от того, сколько файлов в каждом каталоге В этом случае я работаю с двумя каталогами. Это моя функция:
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 в конце моих тестов. Спасибо

EDIT:
Используя предложение @ 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 голосов
/ 28 августа 2018

Рекомендуется применять метод 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))
0 голосов
/ 28 августа 2018

Если вы не хотите удалять все дерево, вы можете просто добавить пути к списку и выполнить итерацию по списку, чтобы удалить все пути в нем

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
0 голосов
/ 28 августа 2018

То, что вы хотите, это shutil.rmtree, который удалит весь каталог, включая все подкаталоги и файлы в нем. После этого вы можете восстановить каталог с помощью os.mkdir или os.makedirs. Вот пример:

import os
import shutil

shutil.rmtree(INPUT_FILE_PATH)
os.mkdir(INPUT_FILE_PATH)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...