Выполнить код после 'assert' в случае AssertionError - PullRequest
0 голосов
/ 08 июля 2019

Я тестирую функцию, основное назначение которой - разместить файл в папке, полученной в параметрах этой функции.Для этого я создаю пустой файл в своей корневой папке и проверяю некоторые параметры для пути.Чтобы быть более точным, вот пример:

alocate_file('folder1','folder2','folder3', 'file.txt')

Эта строка приведет к этому расположению:

root / Downloads / folder1 / folder2 / folder3 / file.txt

Некоторые дополнительные характеристики моей функции: папка «Загрузки» неявная, она получает список в качестве параметра и предполагает, что последней строкой в ​​списке является файл.

Моя проблема

После того, как япротестировав эту функцию, я удаляю пустой файл (созданный только для целей тестирования) и все папки, которые создает моя функция.Это делается с помощью shutil.rmtree после подтверждения, и здесь кроется проблема. Когда тест не пройден, вызывает AssertionError , и эти папки и файлы не удаляются, поскольку код после подтверждения не выполняется.Это также саботирует другие тесты, потому что я использую одинаковые имена файлов и папок для всех них.Затем я должен вручную удалить все эти файлы, чтобы иметь возможность снова провести правильное тестирование.

Я думал об использовании осветителей, но не думаю, что это хорошее решение, потому что, как я уже сказал, он тестирует разные путисоздание, это действительно общий случай.Я должен был бы создать отдельные приборы для каждого теста, и этот тест кажется лучшим подходом к этому.

Вот один из моих тестов, которые имеют эту проблему:

def test_alocate_file_three_level_path(root_path):
    # creates files in root
    file_path1 = os.path.join(root_path, 'test1.pdf')
    Path(file_path1).touch()
    # creates path for test
    test_path = os.path.join(root_path, 'Downloads', 'path1', 'path2','path3','test1.pdf')
    # function alocate the file to folders
    func_aux.alocate_file('path1', 'path2', 'path3', 'test1.pdf')
    # check if the file is there
    assert os.path.isfile(test_path) == True
    # remove the created file and folders
    remove_path = os.path.join(root_path, 'Downloads', 'path1')
    shutil.rmtree(remove_path)

Iхочу знать, могу ли я гарантировать единственный способ, что все мои папки и файлы, созданные для целей тестирования, удаляются с помощью специальных приспособлений для каждого теста или есть способ, которым я всегда могу выполнить код после подтверждения даже с ошибкой AssertionError

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Как предположил @hoefling, я реализовал приспособление, которое создает временный каталог.Изменение кода, который я предоставил в посте, закончилось так:

@pytest.fixture(scope="module")
def temp_dir(root_path):
    down_path = os.path.join(root_path, 'Downloads', 'temp_dir')
    os.makedirs(down_path)
    yield down_path
    shutil.rmtree(down_path)


def test_alocate_file_three_level_path(root_path, temp_dir):
    # creates files in root
    file_path1 = os.path.join(root_path, 'test1.pdf')
    Path(file_path1).touch()
    # creates path for test
    test_path = os.path.join(temp_dir, 'path1', 'path2','path3','test1.pdf')
    # function alocate the file to folders
    func_aux.alocate_file('temp_dir', 'path1', 'path2', 'path3', 'test1.pdf')
    # check if the file is there
    assert os.path.isfile(test_path) == True

Эта гарантия, в конце тестов, что все вспомогательные файлы были удалены.Для тех, кто не понимает, что происходит, крепление выполняется до выхода.После этого тесты получают свою ценность и выполняют свою работу.Независимо от AssertionError , когда тест завершается, он возвращается к устройству и запускает код после yield.

0 голосов
/ 08 июля 2019

Вы можете управлять этим с помощью простого блока try... except, поскольку assert вызывает ошибку AssertionError, если условие равно False:

x = 1

try:
    assert x == 0
    print("x is equal to 0")
except AssertionError:
    print("x is not equal to 0")
finally:
    print("always run")

Однако, как упомянул @roganjosh, использование простого блока if else представляется более логичным ...

...