Écrire des tests unitaires en Python: comment commencer? [fermé]

534

J'ai terminé mon premier projet en Python et maintenant ma tâche est d'écrire des tests pour cela.

Puisque c'est la première fois que je fais un projet, c'est la première fois que j'écris des tests pour lui.

La question est: comment commencer? Je n'ai absolument aucune idée. Quelqu'un peut-il m'indiquer une documentation / un tutoriel / un lien / un livre que je peux utiliser pour commencer à écrire des tests (et je suppose que les tests unitaires en particulier)

Tout conseil sera le bienvenu sur ce sujet.

user225312
la source
4
Il n'est jamais trop tard pour écrire des tests si c'est votre intention. Mieux vaut en avoir que rien pour tous ceux qui se plaignent ...
Asken
1
Voici un bon livre de développement piloté par les tests qui est disponible gratuitement en ligne: chimera.labs.oreilly.com/books/1234000000754/index.html
Will
4
bonne ressource que je suis tombé sur https://www.jeffknupp.com/blog/2013/12/09/improve-your-python-understanding-unit-testing/ . En tant que débutant en python, je l'ai trouvé compréhensible.
ferry du
2
Le Guide de l'auto-stoppeur de Python présente un bref aperçu des outils de test unitaire: python-guide-pt-br.readthedocs.io/en/latest/writing/tests
Anton Tarasenko
Le commentaire précédent devrait être mieux noté, car le guide contient également un exemple de référentiel de code sur github.com/kennethreitz/samplemod, qui est également un excellent point de départ.
setempler

Réponses:

101

Si vous êtes novice dans l'utilisation des tests unitaires, l'approche la plus simple pour apprendre est souvent la meilleure. Sur cette base, je recommande d'utiliser py.testplutôt que le unittestmodule par défaut .

Considérez ces deux exemples, qui font la même chose:

Exemple 1 (unittest):

import unittest

class LearningCase(unittest.TestCase):
    def test_starting_out(self):
        self.assertEqual(1, 1)

def main():
    unittest.main()

if __name__ == "__main__":
    main()

Exemple 2 (pytest):

def test_starting_out():
    assert 1 == 1

En supposant que les deux fichiers sont nommés test_unittesting.py, comment exécuter les tests?

Exemple 1 (unittest):

cd /path/to/dir/
python test_unittesting.py

Exemple 2 (pytest):

cd /path/to/dir/
py.test
Tim McNamara
la source
7
J'ai entendu parler de la simplicité de py.test à plusieurs endroits ( docs.python-guide.org/en/latest/writing/tests/#py-test , docs.python.org/3.5/library/unittest.html#module -unittest , jeffknupp.com/blog/2013/12/09/… ) Pourquoi est-il unit-testtoujours inclus dans la bibliothèque standard, si py.testet nosefournit la même fonctionnalité avec une interface beaucoup plus simple? Est-ce juste pour fournir une compatibilité descendante, ou a-t unittest-il des avantages py.testet nosetestne peut pas fournir?
alpha_989
@ alpha_989 La bibliothèque Python standard n'est pas destinée à contenir les meilleurs outils disponibles. C'est à cela que sert PyPI. L' unittestemballage standard est toujours assez bon. Il est standard, ce qui signifie qu'il est en quelque sorte garanti de bien fonctionner. Enfin, quiconque utilise votre code n'a pas besoin d'installer de packages supplémentaires.
Jeyekomon
72

Le livre gratuit Python Dive Into Python contient un chapitre sur les tests unitaires qui pourrait vous être utile.

Si vous suivez des pratiques modernes, vous devriez probablement passer les tests pendant que vous rédigez votre projet et ne pas attendre que votre projet soit presque terminé.

Un peu en retard maintenant, mais maintenant vous savez pour la prochaine fois. :)

Mark Byers
la source
13
Je dirais quand même que si vous voulez refactoriser du code qui n'a pas de tests unitaires, vous devez d'abord écrire des tests unitaires pour cela
Hubert Kario
9
Oui, beaucoup de gens qui viennent pour la première fois à unittests entendent ce qui ressemble à "bien, c'est un peu trop tard pour votre projet actuel" de vieilles mains: même si ce n'est pas ce qu'ils voulaient dire, c'est ce que les débutants entendent . C'est comme le proverbe chinois sur la plantation d'un arbre: le meilleur moment pour commencer les tests est au début d'un projet; le deuxième meilleur moment pour commencer les tests est maintenant!
JP
4
Plonger dans le lien Python est cassé ... :-(
Scott Skiles
40

Il y a, à mon avis, trois excellents cadres de test python qui sont bons à vérifier.
unittest - le module est livré en standard avec toutes les distributions python
nose - peut exécuter des tests unittest, et a moins de passe-partout.
pytest - exécute également des tests les plus simples, a moins de passe-partout, de meilleurs rapports, beaucoup de fonctionnalités supplémentaires intéressantes

Pour obtenir une bonne comparaison de tous ces éléments, lisez les introductions de chacun à http://pythontesting.net/start-here .
Il y a aussi des articles étendus sur les luminaires, et plus encore.

Okken
la source
35

Les docs pour unittest seraient un bon point de départ.

De plus, il est un peu tard maintenant, mais à l'avenir, pensez à écrire des tests unitaires avant ou pendant le projet lui-même. De cette façon, vous pouvez les utiliser pour tester au fur et à mesure et (en théorie), vous pouvez les utiliser comme tests de régression, pour vérifier que vos modifications de code n'ont cassé aucun code existant. Cela vous donnerait tous les avantages d'écrire des cas de test :)

Justin Ethier
la source
C'est si vous voulez un développement piloté par les tests, ce qui n'est pas une mauvaise chose. Dans mon cas, je regarde le code existant et j'essaie de le comprendre en écrivant et en ajustant les tests pour réussir, et cela m'a permis de commencer unittest. Une fois que je maîtriserai les choses, je l'utiliserai davantage pour le développement, ainsi que pour augmenter le nombre de cas de test pour chaque unité.
icedwater le
27

unittest est livré avec la bibliothèque standard, mais je vous recommanderais nosetest .

"le nez se prolonge pour rendre les tests plus faciles. "

Je vous recommanderais également pylint

" analyse le code source de Python à la recherche de bogues et de signes de mauvaise qualité. "

ssoler
la source
8

Comme d'autres l'ont déjà répondu, il est tard pour écrire des tests unitaires, mais pas trop tard. La question est de savoir si votre code est testable ou non. En effet, il n'est pas facile de tester le code existant, il existe même un livre à ce sujet: Travailler efficacement avec le code hérité (voir points clés ou PDF précurseur ).

Maintenant, écrire les tests unitaires est votre appel. Vous devez juste être conscient que cela pourrait être une tâche fastidieuse. Vous pouvez vous attaquer à cela pour apprendre les tests unitaires ou envisager d'écrire des tests d'acceptation (de bout en bout) en premier, et commencer à écrire des tests unitaires lorsque vous modifierez le code ou ajouterez une nouvelle fonctionnalité au projet.

philant
la source
2
+1 pour "Travailler efficacement avec le code hérité". Il s'agit de code qui n'a pas de tests.
David
3

nosetests est une solution brillante pour les tests unitaires en python. Il prend en charge les cas de test et les doctests les plus bas, et vous permet de commencer avec un fichier de configuration simple.

Daniel Kluev
la source
Votre lien nosetestests est obsolète. Il semble que le nouvel emplacement soit: nose.readthedocs.org/en/latest
odigity
1
Selon la documentation sur github et le site Web nosetest, noseet nose2sont en mode maintenance. Il vaut mieux commencer py.testcar il a beaucoup plus de support
alpha_989