Utilizzando Pytest il test di un Programma in Python

0

Domanda

TI sono abbastanza nuovo di Programmazione Python e ho una domanda sul test utilizzando Pytest. In una di alto livello, ho un programma che si prende 3 pezzi di input dell'utente e genera un file di testo alla fine. Per i miei test, voglio confrontare il mio programma riprodotto, con quello che dovrebbe essere.

Ora, io non sono sicuro di come andare a questo proposito il test. Il programma di per sé privo di argomenti, ma appena si basa su 3 pezzi di input dell'utente, che utilizzerò monkeypatch per simulare. Posso creare un nuovo file chiamato python program_test.py e hanno metodi di qui che di chiamare il programma originale? Ho provato questo, ma ho problemi a chiamare effettivamente il programma originale e l'invio in simulato ingressi. O, non ho prove in programma originale (che non ha molto senso per me).

Voglio qualcosa di simile a questo:

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)

Questo sembra proprio essere in esecuzione del programma originale, e credo proprio che a che fare con l'istruzione import cioè non è mai in esecuzione test_1(), probabilmente perché non mi chiami? Qualsiasi aiuto sarebbe apprezzato!

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

Migliore risposta

2

Senza fornire il proprio my_program il codice è difficile capire cosa sta succedendo.

Dal momento che si citano import problemi, credo che la non definizione main() e if __name__ == "__main__".

Ecco un piccolo esempio di come è possibile verificare che.

Primo, la struttura del vostro my_program per avere main funzione che contiene il codice e poi aggiungere if __name__ == "__main__" che vi permetterà di eseguire main se la funzione my_program viene eseguito direttamente, ma anche per l'importazione di my_program come modulo ad altri file (senza correre, per ulteriori informazioni, si prega di vedere: che Cosa se nome == "main": che fare?).

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

Ora è possibile creare un test.py file e verificare l' main funzione di 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")

Questo è un esempio, così ho usato os.remove per eliminare i file. Idealmente si dovrebbe definire infissi in test da usare tempfile e la generazione casuale di file temporanei che verranno automaticamente eliminati dopo i test.

2021-11-27 23:57:25

Grazie a questo ha aiutato un sacco! L'aspetto principale che ho avuto da questo stato per comprendere my_program con se nome == "main": e quindi chiamare my_program.main() nelle funzioni di test. La chiamata .main() è stata molto importante e qualcosa che io non riuscivo a pensare.
Koonj Patel

@KoonjPatel sei il benvenuto. Sono felice di aver aiutato!
Vlad Siv

In altre lingue

Questa pagina è in altre lingue

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