À l'aide de Pytest pour tester un Programme en Python

0

La question

TI suis tout à fait nouveau à la Programmation Python et avez une question sur les tests à l'aide de Pytest. À un haut niveau, j'ai un programme qui prend 3 pièces de saisie de l'utilisateur et génère un fichier texte à la fin. Pour mes tests, je veux en gros de comparer les fichiers de mon programme achera, avec ce qu'elle devrait être.

Maintenant, je ne suis pas sûr de savoir comment aller sur le test. Le programme lui-même ne prend pas d'arguments, mais tout repose sur 3 morceaux de la saisie de l'utilisateur, sur lequel je vais utiliser monkeypatch à simuler. Dois-je créer un nouveau fichier appelé python program_test.py et ont méthodes ici que d'appeler le programme d'origine? J'ai essayé ceci, mais je vais avoir de la difficulté à réellement appeler le programme d'origine et l'envoi dans la simulation des entrées. Ou, dois-je avoir des tests dans le programme d'origine (qui n'a pas beaucoup de sens pour moi).

Je veux quelque chose comme ceci:

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)

Cela semble juste pour être en cours d'exécution le programme d'origine et je pense que sa à faire avec l'instruction import-dire qu'il n'est jamais à cours d'exécution test_1(), probablement parce que je n'ai jamais l'appeler? Toute aide serait appréciée!

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

La meilleure réponse

2

Sans fournir d' my_program le code c'est difficile de dire ce qui se passe.

Puisque vous êtes, de mentionner import des problèmes, je suppose que votre ne pas définir main() et if __name__ == "__main__".

Voici un petit exemple de la façon dont vous pouvez le tester.

Tout d'abord, la structure de votre my_program avoir main fonction qui contient le code, puis sur ajouter if __name__ == "__main__" qui va vous permettre de courir main si la fonction my_program est exécuté directement, mais aussi à l'importation my_program en tant que module à d'autres fichiers (sans l'exécuter, pour plus d'informations, veuillez consulter: Qu'est-si nom == "principal": le faire?).

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

Maintenant, vous pouvez créer un test.py fichier et le test de la main la fonction 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")

C'est un exemple j'ai donc utilisé os.remove pour supprimer les fichiers. L'idéal serait de définir des rencontres dans votre tests tempfile et de générer des fichiers temporaires qui seront automatiquement supprimés au bout de vos tests.

2021-11-27 23:57:25

Merci cela m'a beaucoup aidé! Le principal aspect que j'ai reçu de cette porte my_program avec if nom == "principal": et alors appel my_program.main() dans mes fonctions de test. De l'appelant .main() a été très important et quelque chose que je ne pouvais pas penser.
Koonj Patel

@KoonjPatel Vous êtes les bienvenus. Je suis content d'avoir aidé!
Vlad Siv

Dans d'autres langues

Cette page est dans d'autres langues

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