86 votes

Comment exécuter unittest discover à partir de "python setup.py test" ?

J'essaie de comprendre comment obtenir python setup.py test pour exécuter l'équivalent de python -m unittest discover . Je ne veux pas utiliser un script run_tests.py script et je ne veux pas utiliser d'outils de test externes (comme nose o py.test ). Il n'y a pas de problème si la solution ne fonctionne que sur python 2.7.

En setup.py Je pense que je dois ajouter quelque chose à la rubrique test_suite et/ou test_loader dans la configuration, mais je n'arrive pas à trouver une combinaison qui fonctionne correctement :

config = {
    'name': name,
    'version': version,
    'url': url,
    'test_suite': '???',
    'test_loader': '???',
}

Est-ce possible en utilisant uniquement unittest intégré dans Python 2.7 ?

Pour information, la structure de mon projet est la suivante :

project/
  package/
    __init__.py
    module.py
  tests/
    __init__.py
    test_module.py
  run_tests.py <- I want to delete this
  setup.py

Mise à jour : C'est possible avec unittest2 mais je veux trouver quelque chose d'équivalent en utilisant seulement unittest

De https://pypi.python.org/pypi/unittest2

unittest2 inclut un collecteur de tests très basique compatible avec setuptools. Spécifiez test_suite = 'unittest2.collector' dans votre setup.py. Ceci démarre la découverte des tests avec les paramètres par défaut du répertoire contenant setup.py, et est donc plus utile en tant qu'exemple (voir unittest2/collector.py).

Pour l'instant, j'utilise simplement un script appelé run_tests.py mais j'espère pouvoir m'en débarrasser en passant à une solution qui n'utilise que des python setup.py test .

Voici le run_tests.py J'espère pouvoir le retirer :

import unittest

if __name__ == '__main__':

    # use the default shared TestLoader instance
    test_loader = unittest.defaultTestLoader

    # use the basic test runner that outputs to sys.stderr
    test_runner = unittest.TextTestRunner()

    # automatically discover all tests in the current dir of the form test*.py
    # NOTE: only works for python 2.7 and later
    test_suite = test_loader.discover('.')

    # run the test suite
    test_runner.run(test_suite)

3voto

Manganeez Points 647

La bibliothèque standard de Python unittest prend en charge la découverte (dans Python 2.7 et plus, et Python 3.2 et plus). Si vous pouvez supposer ces versions minimales, vous pouvez simplement ajouter l'option discover à l'argument de ligne de commande unittest commandement.

Seule une petite modification est nécessaire pour setup.py :

import setuptools.command.test
from setuptools import (find_packages, setup)

class TestCommand(setuptools.command.test.test):
    """ Setuptools test command explicitly using test discovery. """

    def _test_args(self):
        yield 'discover'
        for arg in super(TestCommand, self)._test_args():
            yield arg

setup(
    ...
    cmdclass={
        'test': TestCommand,
    },
)

0voto

jwelsh Points 268

Cela ne supprimera pas run_tests.py, mais le fera fonctionner avec setuptools. Ajouter :

class Loader(unittest.TestLoader):
    def loadTestsFromNames(self, names, _=None):
        return self.discover(names[0])

Puis dans setup.py : (je suppose que vous faites quelque chose comme setup(**config) )

config = {
    ...
    'test_loader': 'run_tests:Loader',
    'test_suite': '.', # your start_dir for discover()
}

Le seul inconvénient que je vois est que cela modifie la sémantique de loadTestsFromNames mais la commande setuptools test est le seul consommateur, et l'appelle dans un fichier manière spécifiée .

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