Korzystanie z Pytest do testowania programu w Pythonie

0

Pytanie

Jestem dość początkujący w programowaniu w Pythonie, i mam pytanie dotyczące testów z użyciem Pytest. Na wysokim poziomie mam program, który ma 3 części użytkownika i w końcu generuje plik tekstowy. Dla moich testów chcę w zasadzie porównać pliki, które wyświetlał mój program, z tym, jakimi powinny być.

Teraz nie wiem, jak zabrać się do testowania. Sam program nie przyjmuje argumentów, a po prostu opiera się na 3 części wejściowe użytkownika, do modelowania których będę używać monkeypatch. Czy mogę utworzyć nowy plik o nazwie python program_test.py i czy tu metody, które powodują oryginalny program? Próbowałem tego, ale mam problemy z połączeniem oryginalnego programu i wysłaniem symulowanych danych wejściowych. Czy mam testy w oryginalnym programie (co dla mnie nie ma większego sensu).

Chcę coś takiego:

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)

To po prostu wydaje się uruchomieniem programu źródłowego, i myślę, że jest to związane z operatorem importu, Czyli nigdy się nie uruchamia test_1 (), prawdopodobnie dlatego, że nigdy go nie halo? Każda pomoc będzie wdzięczna!

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

Najlepsza odpowiedź

2

Bez podawania swojego my_program kod trudno powiedzieć, co się dzieje.

Ponieważ można wymienić import problemy, myślę, że nie określamy main() i if __name__ == "__main__".

Oto mały przykład tego, jak można to sprawdzić.

Po pierwsze, organizuj swój my_program mieć main funkcja, która zawiera kod, a następnie dodaje if __name__ == "__main__" co pozwoli ci uruchomić main funkcja, jeśli my_program odbywa się bezpośrednio, ale również do importu my_program jako modułu do innych plików (bez jego uruchamiania, aby uzyskać więcej informacji, patrz: co sprawia, Że, jeśli nazwa == "podstawowa": robić?).

mój 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()

Możesz teraz utworzyć test.py zapisz i przetestuj main funkcja 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")

To jest przykład, więc użyłem os.remove aby usunąć pliki. Idealnie należy określić narzędzia w swoich testach do użytkutempfile i tworzyć losowe pliki tymczasowe, które zostaną automatycznie usunięte po twoich testów.

2021-11-27 23:57:25

Dziękuję, że to bardzo pomogło! Główny aspekt, który otrzymałem od tego, polegała na tym, aby włączyć my_program z nazwą if == "main": i następnie wywołać my_program.main() w moich funkcjach testowych. Wyzwanie .main() był bardzo ważnym i czymś, o czym nie mogłem myśleć.
Koonj Patel

@KoonjPatel Nie ma za co. Cieszę się, że pomogłem!
Vlad Siv

W innych językach

Ta strona jest w innych językach

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