Использование Pytest для тестирования программы на Python

0

Вопрос

Я довольно новичок в программировании на Python, и у меня есть вопрос о тестировании с использованием Pytest. На высоком уровне у меня есть программа, которая принимает 3 части пользовательского ввода и в конце генерирует текстовый файл. Для моих тестов я хочу в основном сравнить файлы, которые выводила моя программа, с тем, какими они должны быть.

Теперь я не знаю, как приступить к тестированию. Сама программа не принимает аргументов, а просто полагается на 3 части пользовательского ввода, для моделирования которых я буду использовать monkeypatch. Могу ли я создать новый файл python под названием program_test.py и есть ли здесь методы, которые вызывают исходную программу? Я пробовал это, но у меня возникли проблемы с вызовом исходной программы и отправкой смоделированных входных данных. Или у меня есть тесты в оригинальной программе (что для меня не имеет особого смысла).

Я хочу что-то вроде этого:

import my_program

def test_1():
    inputs = iter(['input1', 'input2', 'input3'])
    monkeypatch.setattr('builtins.input', lambda x: next(inputs))
    my_program
    # now do some assertion with some file comparison
    # pseudocode
    assert filecompare.cmp(expectedfile, actualfile)

Это просто кажется запуском исходной программы, и я думаю, что это связано с оператором импорта, т. Е. он никогда не запускает test_1 (), вероятно, потому, что я никогда его не вызываю? Любая помощь будет признательна!

monkeypatching pytest python python-3.x
2021-11-24 03:37:36
1

Лучший ответ

2

Без предоставления вашего my_program код трудно сказать, что происходит.

Поскольку вы упоминаете import проблемы, я думаю, вы не определяете main() и if __name__ == "__main__".

Вот небольшой пример того, как вы можете это проверить.

Во-первых, структурируйте свой my_program иметь main функция, которая содержит код, а затем добавляет if __name__ == "__main__" что позволит вам запустить main функция, если my_program выполняется напрямую, но также для импорта my_program в качестве модуля для других файлов (без его запуска, для получения дополнительной информации, пожалуйста, смотрите: Что делает, если имя == "основной": делать?).

моя программа:

def main():
    x = input()
    y = input()
    z = input()
    with open("test", "w") as f_out:
        f_out.write(f"{x}-{y}-{z}")


if __name__ == "__main__":
    main()

Теперь вы можете создать test.py запишите и протестируйте main функция my_program:

import os
import filecmp
import my_program


def test_success(monkeypatch):
    inputs = ["input1", "input2", "input3"]
    monkeypatch.setattr("builtins.input", lambda: next(iter(inputs)))
    my_program.main()
    with open("expected", "w") as f_out:
        f_out.write("-".join(inputs))
    assert filecmp.cmp("expected", "test")
    os.remove("test")
    os.remove("expected")


def test_fail(monkeypatch):
    inputs = ["input1", "input2", "input3"]
    monkeypatch.setattr("builtins.input", lambda: next(iter(inputs)))
    my_program.main()
    with open("expected", "w") as f_out:
        f_out.write("something-else-test")
    assert not filecmp.cmp("expected", "test")
    os.remove("test")
    os.remove("expected")

Это пример, поэтому я использовал os.remove чтобы удалить файлы. В идеале вы должны определить приспособления в своих тестах для использованияtempfile и создавайте случайные временные файлы, которые будут автоматически удалены после ваших тестов.

2021-11-27 23:57:25

Спасибо, что это очень помогло! Основной аспект, который я получил от этого, состоял в том, чтобы включить my_program с именем if == "main": и затем вызвать my_program.main() в моих тестовых функциях. Вызов .main() был довольно важным и чем-то, о чем я не мог думать.
Koonj Patel

@KoonjPatel Не за что. Я рад, что помог!
Vlad Siv

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................