Pomocí Pytest vyzkoušet v Python Programu

0

Otázka

TI jsem docela nový Python Programování a máte dotaz na testování pomocí Pytest. V high-level, mám program, který trvá 3 kusy vstup uživatele a generuje textový soubor na konci. Pro mé testy, já chci v podstatě porovnat soubory, které svůj program shrnuje, co by to mělo být.

Teď, nejsem si jistý, jak jít o testování. Samotný program trvá žádné argumenty, ale jen spoléhá na 3 kusy vstup uživatele, který budu používat monkeypatch simulovat. Vytvořit nový soubor s názvem python program_test.py a metody v tu, která hovor původní program? Zkoušel jsem to, ale mám problémy vlastně volá původní program a odesílání v simulované vstupy. Nebo, mám testy v původní program (což nedává moc smysl).

Chci něco jako 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 jen se zdá být běží původní program a myslím, že s dovozní prohlášení, tj. je nikdy běží test_1(), asi proto, že jsem nikdy říkat? Jakýkoliv pomoci chtěl bych být ocenil!

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

Nejlepší odpověď

2

Aniž by vaše my_program kód je těžké říct, co se děje.

Vzhledem k tomu, jste zmínku import problémy, myslím, že si není určující main() a if __name__ == "__main__".

Tady je malý příklad toho, jak si můžete vyzkoušet, že.

Za prvé, struktura my_program mít main funkce, která obsahuje kód, a pak přidat if __name__ == "__main__" což vám umožní spustit main funkce pokud my_program je proveden přímo, ale také importovat my_program jako modul do jiných souborů (bez spuštění to, pro více informací, prosím, viz: Co znamená-li jméno == "hlavní":?).

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

Nyní si můžete vytvořit test.py soubor a otestovat main funkce 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 příklad, takže jsem použil os.remove chcete-li odstranit soubory. V ideálním případě byste definovat svítidla ve vaší testy k použití tempfile a generovat náhodné dočasné soubory, které budou automaticky odstraněny po vaší zkoušky.

2021-11-27 23:57:25

Díky to mi hodně pomohlo! Hlavním aspektem, dostal jsem z toho měla zahrnovat my_program s pokud jméno == "hlavní": a pak volat my_program.main() v mé testovací funkce. Volání .main() bylo velmi důležité a něco, co jsem nemohl myslet.
Koonj Patel

@KoonjPatel Jste vítáni. Jsem rád, že jsem pomohl!
Vlad Siv

V jiných jazycích

Tato stránka je v jiných jazycích

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