El uso de Pytest para probar un Programa en Python

0

Pregunta

TI soy bastante nuevo en Programación Python y tengo una pregunta en la prueba con Pytest. En un alto nivel, tengo un programa que tarda de 3 piezas de la entrada del usuario y genera un archivo de texto en la final. Para mis pruebas, quiero básicamente comparar los archivos de mi programa se emite, con lo que debería ser.

Ahora, no estoy seguro de cómo ir sobre la prueba. El programa en sí no tiene argumentos, pero sólo se basa en 3 piezas de la entrada del usuario, que voy a utilizar monkeypatch a simular. ¿Puedo crear un nuevo archivo de python llamado program_test.py y han métodos de aquí que se llame el programa original? He intentado hacer esto, pero estoy teniendo problemas en realidad, se llama el programa original y el envío en la simulación de las entradas. O, ¿tengo pruebas en el programa original (que no tiene mucho sentido para mí).

Quiero algo como esto:

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)

Esto sólo parece estar ejecutando el programa original y creo que ver con la declaración de importación, es decir, nunca se ejecuta test_1(), probablemente porque nunca me llaman? Cualquier ayuda se agradece!

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

Mejor respuesta

2

Sin proporcionar su my_program el código es difícil saber lo que está pasando.

Puesto que usted está mencionando import problemas, supongo que tu no definir main() y if __name__ == "__main__".

He aquí un pequeño ejemplo de cómo se puede probar que.

En primer lugar, la estructura de su my_program tener main la función que contiene el código y, a continuación, agregue if __name__ == "__main__" que le permitirá ejecutar main función de si el my_program se ejecuta directamente, sino también a la importación de my_program como módulo a otros archivos (sin ejecutarlo, para más información por favor consulte: ¿Qué si nombre == "principal": ¿?).

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

Ahora usted puede crear un test.py archivo y prueba de la main la función de 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")

Este es un ejemplo de lo que he usado os.remove para eliminar los archivos. Lo ideal sería definir las bases en las pruebas para el uso de tempfile y generar al azar de los archivos temporales que se eliminan automáticamente después de sus pruebas.

2021-11-27 23:57:25

Gracias esto me ayudó mucho! El principal aspecto que obtuve de este era para abarcar my_program con si nombre == "principal": y, a continuación, llamar a my_program.main() en mis funciones de prueba. Llamamiento .main() fue muy importante y algo que no podía pensar.
Koonj Patel

@KoonjPatel eres bienvenido. Me alegro de haber ayudado!
Vlad Siv

En otros idiomas

Esta página está en otros idiomas

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