831 votes

Exécution d'unittest avec une structure de répertoire de test typique

La très commune de la structure de répertoire, même pour un simple module Python semble être de séparer les tests unitaires dans leur propre test annuaire:

new_project/
    antigravity/
        antigravity.py
    test/
        test_antigravity.py
    setup.py
    etc.

voir, par exemple, ce projet de Python howto.

Ma question est simple Quelle est la manière habituelle de réellement exécuter les tests? Je suppose que c'est évident pour tout le monde sauf moi, mais vous ne pouvez pas exécuter python test_antigravity.py à partir du répertoire test comme sa import antigravity échouera car le module n'est pas sur le chemin.

Je sais que je pourrais modifier PYTHONPATH et d'autres le chemin de recherche liés trucs, mais je ne peux pas croire que c'est la façon la plus simple - c'est très bien si vous êtes le développeur, mais pas réaliste de s'attendre à ce que vos utilisateurs à utiliser si ils veulent juste pour vérifier les tests sont de passage.

L'autre alternative, c'est juste pour copier le fichier de test dans l'autre répertoire, mais il semble un peu stupide et rate le point de les avoir dans un répertoire distinct pour commencer.

Donc, si vous aviez téléchargé la source de mon nouveau projet, comment voulez-vous exécuter les tests unitaires? Je préfère une réponse qui s'permettez-moi de dire à mes utilisateurs: "Pour exécuter les tests unitaires ne X."

774voto

Peter Points 381

La meilleure solution à mon avis est d'utiliser l' unittest interface de ligne de commande qui va ajouter le répertoire à l' sys.path de sorte que vous n'avez pas à (fait en TestLoader de la classe).

Par exemple pour une structure de répertoire comme ceci:

new_project/
    antigravity.py
    test_antigravity.py

Il vous suffit d'exécuter:

$ cd new_project
$ python -m unittest test_antigravity

Pour une structure de répertoire comme la vôtre:

new_project/
    antigravity/
        __init__.py            # make it a package
        antigravity.py
    test/
        __init__.py            # also make test a package
        test_antigravity.py

Maintenant dans la console, nous pouvons exécuter test_antigravity.py:

$ cd new_project
$ python -m unittest test.test_antigravity

Juste référence le module de test de la même manière que vous l'importer.

Aussi, vous pouvez exécuter une seule TestCase ou une seule méthode de test:

$ python -m unittest test.test_antigravity.GravityTestCase
$ python -m unittest test.test_antigravity.GravityTestCase.test_method

Vous pouvez également utiliser le test de la découverte qui permettra de découvrir et d'exécuter tous les tests pour vous, ils doivent être des modules ou des paquets nommé test*.py (peut être changé avec l' -p, --pattern flag):

$ cd new_project
$ python -m unittest discover

Cela permettra d'exécuter tous les test*.py modules à l'intérieur de l' test package.

50voto

Carl Meyer Points 30736

La solution la plus simple pour vos utilisateurs est de fournir un script exécutable (runtests.py ou quelque chose du genre) qui amorce le nécessaire, environnement de test, y compris, si nécessaire, ajouter la racine de votre répertoire de projet pour sys.chemin d'accès temporaire. Cela ne nécessite pas les utilisateurs à définir des variables d'environnement, quelque chose comme cela fonctionne bien dans un script bootstrap:

import sys, os

sys.path.insert(0, os.path.dirname(__file__))

Alors vos instructions à vos utilisateurs peut être aussi simple que "python runtests.py".

Bien sûr, si le chemin que vous avez vraiment besoin est - os.path.dirname(__file__), alors vous n'avez pas besoin de l'ajouter à sys.path ; Python met toujours le répertoire du script en cours d'exécution au début de l' sys.path, donc, en fonction de votre structure de répertoire, juste à l'emplacement de votre runtests.py , au bon endroit, peut-être tout ce qui est nécessaire.

Aussi, le module unittest en Python 2.7+ (qui est pris comme unittest2 pour Python 2.6 et antérieures) a maintenant tester la découverte intégré, de sorte que le nez n'est plus nécessaire si vous voulez test automatisé découverte: votre manuel d'utilisateur peut être aussi simple que "python -m unittest découvrir".

23voto

stw_dev Points 506

J'ai en général de créer une "exécution de tests de script" dans le répertoire du projet (celui qui est commun à la fois le répertoire source et test) que les charges de mon "Tous les Tests" de la suite. C'est généralement le code réutilisable, donc, je peux la réutiliser dans d'autres projets.

run_tests.py:

import unittest
import test.all_tests
testSuite = test.all_tests.create_test_suite()
text_runner = unittest.TextTestRunner().run(testSuite)

test/all_tests.py (à partir de http://stackoverflow.com/questions/1732438)

import glob
import unittest

def create_test_suite():
    test_file_strings = glob.glob('test/test_*.py')
    module_strings = ['test.'+str[5:len(str)-3] for str in test_file_strings]
    suites = [unittest.defaultTestLoader.loadTestsFromName(name) \
              for name in module_strings]
    testSuite = unittest.TestSuite(suites)
    return testSuite

Avec cette configuration, vous pouvez en effet tout juste d' include antigravity dans vos modules de test. L'inconvénient est que vous auriez besoin de plus de soutien de code à exécuter un test particulier... je viens de courir à chaque fois.

18voto

Mark Byers Points 318575

De l'article que vous avez lié à:

Créer un test_modulename.py fichier et mettez votre unittest tests. Depuis les modules de test sont dans un autre répertoire à partir de votre code, vous pouvez avoir besoin pour ajouter votre module du répertoire parent pour votre PYTHONPATH afin d'exécuter eux:

$ cd /path/to/googlemaps

$ export PYTHONPATH=$PYTHONPATH:/path/to/googlemaps/googlemaps

$ python test/test_googlemaps.py

Enfin, il est l'un de plus populaires framework de test unitaire pour Python (c'est important!), nez. nez permet de simplifier et d'étendre la builtin unittest cadre (il peut, par exemple, automatiquement trouver votre test le code et la configuration de votre PYTHONPATH pour vous), mais il n'est pas inclus avec la la distribution standard de Python.

Peut-être vous devriez regarder le nez comme il le suggère?

5voto

Ned Batchelder Points 128913

Utilisez setup.py develop pour que votre répertoire de travail fasse partie de l'environnement Python installé, puis exécutez les tests.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X