Pomocou Pytest na testovanie Python Program

0

Otázka

TI am, celkom nový Python Programovanie a mám otázku na testovanie pomocou Pytest. V high-level, mám program, ktorý trvá 3 kusy vstup užívateľa a vytvorí textový súbor, v konci. Pre moje testy, chcem v podstate porovnávať súbory môj program výstup, s tým, čo by to malo byť.

Teraz, nie som si istý, ako ísť o testovaní. Samotný program trvá žiadne argumenty, ale len spolieha na 3 kusy vstup užívateľa, ktorý budem používať monkeypatch simulovať. Môžem vytvoriť nový python súbor s názvom program_test.py a majú metódy v tu, že hovor pôvodný program? Snažil som sa na to, ale mám problém vlastne volá pôvodný program a odosielanie v simulovanom vstupy. Alebo, mám skúšky v pôvodnom programe (ktorý nemá veľmi zmysel pre mňa).

Chcem niečo ako toto:

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 len zdá byť spustený pôvodného programu, a myslím, že jeho robiť s dovozom vyhlásenie, t. j. nikdy nie je spustený test_1(), pravdepodobne preto, že nikdy som to nazvať? Akúkoľvek pomoc, chcel by som byť ocenil!

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

Najlepšiu odpoveď

2

Bez toho, že poskytuje svoje my_program kód je ťažké povedať, čo sa deje.

Keďže si spomenúť import problémy, myslím, že vaše nie definovanie main() a if __name__ == "__main__".

Tu je malý príklad toho, ako si môžete vyskúšať to.

Najprv, vytvorte si my_program mať main funkcia, ktorá obsahuje kód a potom pridať if __name__ == "__main__" čo vám umožní spustiť main funkcie, ak my_program je vykonaný priamo, ale aj import my_program ako modul na iné súbory (bez beží, pre viac informácií nájdete na: Čo znamená, ak meno == "hlavné": robiť?).

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()

Teraz si môžete vytvoriť test.py súbor a test main funkcia 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")

Toto je príklad, tak som použil os.remove ak chcete odstrániť súbory. V ideálnom prípade by ste definovať zariadenia v testov na použitie tempfile a vygenerovať náhodné dočasné súbory, ktoré budú automaticky zmazané po testoch.

2021-11-27 23:57:25

Vďaka tejto pomohol veľa! Hlavným aspektom, som sa dostal z tohto bolo, aby zahŕňal my_program s ak meno == "hlavné": a potom hovor my_program.main() v mojom testovacích funkcií. Telefonovanie .main() bolo veľmi dôležité, a niečo, čo som nemohol myslieť.
Koonj Patel

@KoonjPatel Ste vítaní. Som rád, že som pomohol!
Vlad Siv

V iných jazykoch

Táto stránka je v iných jazykoch

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