Django tests unitaires pour modifier la forme
Quelqu'un a probablement déjà développé une technique pour soulager l'ennui pour la suite idiomatiques de l'unité de test:
- OBTENIR une url avec des données de formulaire déjà rempli
- Publier une version révisée du formulaire avec un ou plusieurs champs modifiés
- Case réponse (bénéfice!)
L'étape 2 est le plus fastidieux, randonnée à vélo à travers les champs de formulaire. Il n'existe aucun gain de temps hacks pour les tests de Django formes?
[Mise à jour: je ne suis pas de tests de Django la manipulation de formes. Je vais vérifier que mon application produit de réponses correctes lorsqu'un utilisateur apporte des modifications à un formulaire. C'est une application qui traite de l'information clinique, donc beaucoup de réponses possibles à tester.]
- Êtes-vous écrire des tests qui ont ces trois étapes pour chaque champ du formulaire? Et de vos formes ont beaucoup de champs? Vous avez beaucoup de champs pour tester? Est-ce que vous êtes en train de dire?
- Beaucoup de formes, beaucoup de champs. Mais chaque test est un test pour un résultat particulier (par exemple, l'application correctement informer l'utilisateur qui ne parvient pas à obtenir un diagnostic), pas un test de chaque champ.
Vous devez vous connecter pour publier un commentaire.
Cela dépend de ce que vous êtes en train de tester. Je voudrais cibler vos tests un peu plus finement que cela sonne comme vous êtes en train de faire.
Si le code que vous avez besoin de tester est la forme logique de validation, alors je voudrais simplement créer une instance de la classe de formulaire directement dans vos tests, passer les différents dictionnaires de données et d'appel .is_valid(), vérifiez le bon d'erreurs ou d'absence de celle-ci. Pas besoin d'impliquer HTML ou des requêtes HTTP.
Si c'est la vue de la logique (qui l'OMI devrait être réduite au minimum) que vous testez, vous aurez probablement besoin d'utiliser le client de test, mais vous ne devriez pas besoin de faire du multi-phase de tests ou de très nombreux tests à ce niveau. Dans les essais de vue logique, que je n'aurais pas gratter HTML (c'est d'essais de modèles), j'aimerais utiliser la réponse.contexte de sortir de la forme de l'objet à partir du contexte.
Si ce que vous voulez tester, c'est que les modèles contiennent du HTML propre à rendre le formulaire fonctionnent réellement (dans l'ordre d'intercepter les erreurs comme d'oublier d'inclure le formulaire de gestion pour un formset dans le modèle), j'utilise WebTest et django-webtest qui analyse votre code HTML et de le rendre facile à remplir dans le champ des valeurs et soumettre le formulaire comme un navigateur.
Vous pouvez utiliser
response.context
etform.initial
pour obtenir les valeurs que vous avez besoin de poster:django-webtest est parfait pour ce genre de tests:
À mon avis c'est mieux que de sergé pour django les tests, car il donne accès à django entrailles si natif de django reinhardt,
response.context
,response.templates
,self.assertTemplateUsed
etself.assertFormError
API est prise en charge.Sur d'autres part, il est mieux que le natif de django client de test, car il est beaucoup plus puissant et facile d'API.
Je suis un peu biaisé 😉 mais je crois que django-webtest est maintenant la meilleure façon de les écrire django tests.
Il n'est pas clair, mais on peut le supposer, c'est que vous avez des tests de ce genre.
Tout d'abord, vous êtes en train de faire trop. Simplifier.
Ci-dessus prouve que le défaut de remplir les formulaires.
Ne perdez pas de temps à faire un "get" pour chaque "post". Vous pouvez prouver, séparément, que le de lancer des opérations de travail. Une fois que vous avez la preuve, il suffit de faire les Poteaux.
Si vous les POSTES sont très de la session spécifique et dynamiques, vous pouvez toujours faire un GET, mais ne vous embêtez pas à l'analyse de la réponse. Vous pouvez prouver (séparément) qu'il a exactement les champs.
Pour optimiser votre repos, pensez à ceci.
La ci-dessus sera bien évidemment le travail, mais cela rend le nombre de tests semblent petits.
setUp
ou une super-classe ou d'une fonction distincte. Il ya un million de techniques de programmation pour réduire la redondance, qui peuvent être utilisés dans des tests unitaires. Pourquoi n'êtes-vous pas tout simplement le refactoring, la fastidieuse pièces? Je ne comprends pas ce qui est difficile à concevoir une classe de test qui est d'une certaine manière optimale.Réfléchir sur pourquoi vous avez besoin d'unité-test. Les formes font partie du noyau de Django fonctionnalité, et sont très bien couverts par Django propres tests unitaires. Si tout ce que vous faites est de base, créer/mettre à jour, à partir de laquelle votre question, il sonne comme c'est le cas, je ne vois pas de raison d'écrire des tests unitaires pour que.
Je ne vois pas comment ou pourquoi vous avez besoin de tests unitaires pour cela. Me semble que vous faites des tests (et corriger) possible la saisie de l'utilisateur, qui est couvert de manière très simple avec de Django reinhardt, de la validation du formulaire (et la validation du modèle 1.2)
J'avais recommed vous de prendre un coup d'oeil dans les tests d'acceptation des outils comme le robot framework de test ou letucce qui sont pensés pour vous voulez faire "je vais vérifier que mon application produit de réponses correctes lorsqu'un utilisateur apporte des modifications à la forme", qui sonne plus comme une acceptation (boîte noire) test de tests unitaires.
Pour instace, Robot vous permettent de définir vos tests sous forme de tableau, vous pouvez définir le flux de travail une fois et puis vous pouvez définir facilement un tas de tests que l'exercice les flux de travail avec des données différentes.
Vous êtes peut-être à la recherche d'outils permettant de le faire avant la fin des tests comme twill ou le sélénium
À la fois de ces de générer le code python, qui peuvent être inclus dans les tests de django, de sorte que lorsque vous exécutez des tests, il ouvre l'url, publie les données et inspecte tout ce que vous voulez!
Il devrait vous aider à voir ces tests écrit pour le sélénium, pour un open source réutilisables django app.