30 votes

Écriture de tests unitaires dans Django / Python

Je n'ai pas utilisé les Tests Unitaires avant d'autre qu'une introduction rapide dans un Uni cours. Je suis actuellement à l'écriture d'une application bien et tiens à m'enseigner TDD dans le processus. Le problème c'est que j'ai aucune idée de ce à test ou vraiment comment.

Je suis en train d'écrire une application Django, et jusqu'à présent, ont créé les modèles (et personnalisée de l'application de l'administrateur). C'est la façon dont j'ai écrit les squelettes de mes tests jusqu'à présent:

class ModelTests(TestCase):
    fixtures = ['initial_data.json',]

    def setUp(self):
        pass

    def testSSA(self):
        ssa = SSA.objects.create(name="sdfsdf", cost_center=1111, street_num=8,
                street_name="dfsdfsf Street", suburb="sdfsdfsdf",
                post_code=3333)


    def testResident(self):
        pass

    def testSSA_Client(self):
        pass

J'ai prévu d'écrire une fonction pour tester chaque modèle dans le ModelTests classe. Est-ce une bonne façon d'écrire des tests? Aussi, exactement ce que dois-je tester pour? Que la création d'un modèle avec tous les champs des œuvres achevées? Que la moitié de ce modèle échoue? Que tous les cas particuliers sont testés (comme une nulle et is_required=False)? J'ai confiance en l'ORM, qui pour autant que je suis au courant, c'est largement testé, donc je ne devrais pas besoin de tester toutes les méthodes que je devrais?

De quoi ai-je besoin de le tester pour une application web écrite en Django/Python? Quelques exemples, ce serait bien.

37voto

S.Lott Points 207588

Est une fonction permettant de tester chaque modèle dans le ModelTests classe un bon moyen d'écrire des tests?

Pas de.

Exactement ce que dois-je tester pour?

  • Que la création d'un modèle avec tous les champs des œuvres achevées?

  • Que la moitié de ce modèle échoue?

  • Que tous les cas particuliers sont testés (comme une nulle et is_required=False)?

  • J'ai confiance en l'ORM, qui pour autant que je suis au courant, c'est largement testé, donc je ne devrais pas besoin de tester toutes les méthodes que je devrais?

Pas beaucoup de que.

Vous pouvez tester les règles de validation, mais ce n'est pas significative jusqu'à ce que vous avez défini une certaine Forme d'objets. Ensuite, vous avez quelque chose à tester, ne le formulaire d'appliquer toutes les règles. Vous aurez besoin d'au moins un cas de test de la classe pour chaque forme. Une fonction sera un scénario, avec différentes combinaisons d'entrées qui sont autorisés ou non.

Pour chaque classe du Modèle, vous aurez besoin d'au moins un cas de test définition de la classe. Cas de tests sont bon marché, définir beaucoup d'entre eux.

Votre modèle incarne votre "entité commerciale" définitions. Vos modèles ont des méthodes qui mettent en œuvre des règles d'affaires. Vos méthodes de faire des choses comme résumer, de filtrer, de calculer, d'agrégation, de réduire, toutes sortes de choses. Vous aurez fonctions pour chacune de ces fonctions d'une classe de modèle.

Vous n'êtes pas de tests de Django. Vous êtes à l'examen de vos règles d'entreprise dans Django.

Plus tard, quand vous avez plus de choses dans votre demande (formulaires, affichages, url, etc.) vous aurez envie d'utiliser le Django unittest client à l'exercice de chaque méthode pour chaque url. Encore une fois, un cas de test par

10voto

Daniel Nadasi Points 588

Je ne suis pas sûr de savoir exactement les détails de ce que vous êtes en train de tester, ici, j'ai besoin de plus d'extraits de code pour cela, mais je peux vous donner quelques conseils généraux.

Tout d'abord, lisez les tests unitaires chapitre de "Dive into Python" (c'est gratuit en ligne! http://diveintopython3.ep.io/unit-testing.html), c'est une bonne explication de tests unitaires en général, ce que vous devez faire, et pourquoi.

Deuxièmement, en ce qui concerne TDD, c'est une pratique utile, mais attention devenir trop dépendant d'elle que j'ai trouvé, il peut conduire à une sur-spécification de logiciel et d'autres à avoir des logiciels qui peuvent ne pas être re-développé et adapté à de nouvelles tâches. C'est juste mon expérience, de l'esprit. Aussi, vous ne l'utilisez pas de façon dogmatique TDD est précieux.

Troisièmement, il me semble que le meilleur morceau de conseils pour votre situation spécifique est de s'efforcer de tester votre logique, mais non pas la logique de cadres dont vous dépendez. Cela signifie que, souvent, les tests de demi-complète de modèles échec etc. etc. peut-être pas approprié, puisque ce n'est pas votre logique, mais de django reinhardt, et donc devrait déjà être testé. Plus utile serait de tester quelques cas attendus, les instanciations que vous attendez, les exceptions que vous attendez etc. pour vous assurer que votre modèle de spécification est solide, et de passer ensuite à la plus importante de la logique de votre application.

4voto

Jeff Bauer Points 6598

Je suppose que vous avez déjà lu les Tests de Django Applications.

Démarrer le test de la normale des cas d'utilisation de votre application, la création d'un nouvel utilisateur, l'ajout d'une entrée de blog, etc. Juste votre typique opérations CRUD d'abord, puis déplacer vers le bord de cas. Pour l'essentiel le renforcement de la confiance dans votre demande que tout ce que vous plus tard, le changement ne se cassera pas comment je attendre l'application pour se comporter.

Simuler GET/POST demandes sur votre Url et d'observer les réponses (en-têtes, les codes d'état et le contenu). A votre demande le rendu de la vue correcte? En utilisant le bon modèle? Dans les sections où votre application génère des exceptions, tenter de les déclencher (par exemple, afficher/modifier un enregistrement inexistant pour élever ObjectDoesNotExist).

Il est généralement vaut le coup d'investir dans un système de suivi (par exemple, Trac), de sorte que vous pouvez ajouter un nouveau test pour chaque connecté à un défaut.

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