Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Tester un message d'erreur avec PyTest

0 votes

J'ai un code dans lequel je travaille sur un dictionnaire et il peut arriver qu'une clé de ce dictionnaire ne soit pas défini. Donc, j'ai ajouté un try/except qui attrape l'exception si la clé n'existe pas et je retourne un joli message d'erreur pour expliquer à l'utilisateur ce qui se passe (tout se passe dans une méthode d'une classe, où tag est passé par l'utilisateur).

try:
    species = self.species[tag]
except KeyError:
    print(f"Error: the species {tag} is not defined")

Mon problème vient au moment d'écrire un test unitaire sur ce bout de code. Comment vérifier que mon code retourne bien mon message d'erreur ? Je pourrais écrire un test qui fourni volontairement un tag erroné et vérifie stdout, mais il faudrait alors le réécrire si je décide de changer mon message d'erreur... Ce qui ne me semble pas être la meilleure manière de faire.

demandé 15-Oct par Rowin (104 points)

2 Réponses

0 votes

Pourquoi pas utiliser la lib logging pour les logs, et juste vérifier qu'un warning est passé ?

répondu 15-Oct par ptank (370 points)
0 votes

pytest gère bien cette situation : https://docs.pytest.org/en/latest/capture.html#accessing-captured-output-from-a-test-function

Un exemple qu'on trouve dans le lien ci-dessus:

def test_myoutput(capsys):  # or use "capfd" for fd-level
    print("hello")
    sys.stderr.write("world\n")
    captured = capsys.readouterr()
    assert captured.out == "hello\n"
    assert captured.err == "world\n"
    print("next")
    captured = capsys.readouterr()
    assert captured.out == "next\n"
répondu 17-Oct par bubulle (2,248 points)
...