Je teste l' intégration d' un système, en utilisant uniquement les API publiques. J'ai un test qui ressemble à ceci:
def testAllTheThings():
email = create_random_email()
password = create_random_password()
ok = account_signup(email, password)
assert ok
url = wait_for_confirmation_email()
assert url
ok = account_verify(url)
assert ok
token = get_auth_token(email, password)
a = do_A(token)
assert a
b = do_B(token, a)
assert b
c = do_C(token, b)
# ...and so on...
Fondamentalement, j'essaie de tester l'ensemble du "flux" d'une seule transaction. Chaque étape du flux dépend de la réussite de l'étape précédente. Parce que je me limite à l'API externe, je ne peux pas simplement piquer des valeurs dans la base de données.
Donc, soit j'ai une très longue méthode de test qui fait `A; affirmer; B; affirmer; C; affirmer ... ", ou je le décompose en méthodes de test distinctes, où chaque méthode de test a besoin des résultats du test précédent avant de pouvoir faire son travail:
def testAccountSignup():
# etc.
return email, password
def testAuthToken():
email, password = testAccountSignup()
token = get_auth_token(email, password)
assert token
return token
def testA():
token = testAuthToken()
a = do_A(token)
# etc.
Je pense que ça sent. Existe-t-il une meilleure façon d'écrire ces tests?
Je séparerais le code de test du code d'installation. Peut-être:
N'oubliez pas que toutes les informations aléatoires générées doivent être incluses dans l'assertion en cas d'échec, sinon votre test risque de ne pas être reproductible. Je pourrais même enregistrer la graine aléatoire utilisée. De plus, chaque fois qu'un cas aléatoire échoue, ajoutez cette entrée spécifique en tant que test codé en dur pour empêcher la régression.
la source
Pas beaucoup mieux, mais vous pouvez au moins séparer le code de configuration du code d’affirmation. Écrivez une méthode distincte qui raconte toute l'histoire étape par étape, et prenez un paramètre contrôlant le nombre d'étapes à effectuer. Ensuite, chaque test peut dire quelque chose comme
simulate 4
ousimulate 10
puis affirmer tout ce qu'il teste.la source
Eh bien, je ne pourrais pas obtenir la syntaxe Python ici par "codage aérien", mais je suppose que vous avez l'idée: vous pouvez implémenter une fonction générale comme celle-ci:
ce qui vous permettra d'écrire vos tests comme ceci:
Bien sûr, il est discutable si la perte de lisibilité de cette approche vaut la peine de l'utiliser, mais elle réduit un peu le code passe-partout.
la source