Le test unitaire est-il en cours de développement ou de test?

24

J'ai eu une discussion avec un responsable des tests sur le rôle des tests unitaires et d'intégration. Elle a demandé aux développeurs de signaler ce qu'ils ont testé et comment l'unité a été testée. Mon point de vue est que les tests unitaires et d'intégration font partie du processus de développement, pas du processus de test. Au-delà de la sémantique, je veux dire que les tests unitaires et d'intégration ne devraient pas être inclus dans les rapports de test et que les testeurs de systèmes ne devraient pas s'en préoccuper. Mon raisonnement repose sur deux choses.

  1. Les tests unitaires et d'intégration sont planifiés et réalisés contre une interface et un contrat, toujours. Que vous utilisiez ou non des contrats formalisés, vous testez toujours ce que, par exemple, une méthode est censée faire, c'est-à-dire un contrat.

    Lors des tests d'intégration, vous testez l'interface entre deux modules distincts. L'interface et le contrat déterminent quand le test réussit. Mais vous testez toujours une partie limitée de l'ensemble du système. En revanche, les tests des systèmes sont planifiés et exécutés en fonction des spécifications du système. La spécification détermine quand le test réussit.

  2. Je ne vois aucune valeur à communiquer l'ampleur et la profondeur des tests unitaires et d'intégration au testeur (systèmes). Supposons que j'écrive un rapport qui répertorie les types de tests unitaires qui sont effectués sur une classe de couche métier particulière. Que doit-il retirer de cela?

    Juger de ce qui devrait et ne devrait pas être testé à partir de cela est une fausse conclusion car le système peut toujours ne pas fonctionner comme l'exigent les spécifications, même si tous les tests unitaires et d'intégration réussissent.

Cela peut sembler une discussion académique inutile, mais si vous travaillez dans un environnement strictement formel comme moi, c'est en fait important pour déterminer comment nous faisons les choses. Quoi qu'il en soit, je me trompe totalement?

Rubio
la source
9
Est-ce que ça importe?
yannis
5
@YannisRizos D'après le titre, non. De toute la question, il semble certainement que la personne qui le demande
Ludwig Magnusson
2
@Rubio De votre question, je suis d'accord que les rapports sur les tests unitaires sont inutiles pour le testeur de système. Les tests unitaires sont un outil utile pour le développeur. Comment votre responsable des tests motive-t-il la nécessité de ces rapports?
Ludwig Magnusson
2
@LudwigMagnusson Vrai, cependant, si cela ne concerne que la personne qui pose la question, c'est trop localisé.
yannis
5
les développeurs rapportant au gestionnaire de test sont faux, quoi qu'il arrive. Si elle a transmis cette demande via votre ( gestionnaire de développement ), vous n'auriez qu'à faire ce que votre patron vous a dit. "Parlez à mon manager" est l'arme qu'il faut savoir utiliser dans un "environnement strictement formel" comme le vôtre
gnat

Réponses:

30

La rédaction de tests automatisés est le travail d'un développeur; les tests font partie de la base de code et doivent être traités comme tels - ils doivent être soumis aux mêmes révisions de code, normes de codage, discipline de contrôle des sources, etc., que le reste du projet.

L'exécution desdits tests se fait pour deux raisons: Premièrement, comme outil pour guider les développeurs. Vous exécutez des tests pour vérifier que le code que vous venez d'écrire fait ce qu'il est censé faire, vous les utilisez comme documentation supplémentaire et pour vérifier que les modifications ne rompent aucune fonctionnalité existante. Si vous faites du vrai TDD, les tests sont également une source de spécifications techniques faisant autorité. La deuxième raison d'utiliser les tests est lors de l'AQ et du déploiement. L'exécution de tous les tests automatisés devrait être l'une des premières étapes de chaque cycle de tests; exécuter des tests automatisés est bon marché (pratiquement aucune main-d'œuvre requise) et il n'est pas très logique de passer à des tests manuels si les tests automatisés échouent.

Cela signifie que les responsabilités devraient être les suivantes:

  • Les développeurs écrivent des tests automatisés
  • Les développeurs exécutent des tests automatisés individuels selon les besoins, dans le cadre de leur flux de travail de développement
  • L'AQ exécute tous les tests automatisés comme l'une des premières étapes des tests

Si vous avez un serveur de build, la tâche de QA (concernant les tests automatisés) se résume à "ouvrir le rapport du serveur de build et vérifier que tout est vert".

tdammers
la source
Excellent post, exactement dans le sens que j'allais poster. Seul Qualm s'appuie trop sur les tests unitaires ainsi que les tests d'intégration peuvent conduire à des problèmes sur la route. Je ne suis pas d'accord avec le fait que la tâche de QA se résume à vérifier le serveur de build (je suppose que vous voulez dire quelque chose comme Hudson). Cela met tout le fardeau des tests sur les développeurs pour écrire des tests qui couvrent TOUTE la logique métier, tout le temps, ce qui semble donner trop de poids aux développeurs.
dardo
4
@dardo: Bien sûr, les tests automatisés ne sont pas les seuls tests que vous devez exécuter, sinon vous pourriez tout simplement vous débarrasser de l'AQ. Ce serait ridicule - de nombreux aspects très cruciaux de tout produit logiciel ne peuvent tout simplement pas être testés automatiquement. Ce que je veux dire, c'est qu'étant donné l'existence de tests automatisés, le contrôle qualité ne devrait pas avoir à s'en préoccuper au-delà de la vérification de la sortie du serveur de build; après cela, ils font leur travail normal - des tests manuels et semi-automatisés sur la version terminée.
tdammers
Ah oui, d'accord à 100% Un peu comme un point de contrôle, sont-ils là, passent-ils, etc.
dardo
@tdammers - Les tests ne sont qu'une petite partie de l'assurance qualité.
Matthew Flynn
2
Excellente réponse, mais je ne pense pas que les tests doivent être considérés comme tels an authoritative source of technical specifications. Les tests doivent être une confirmation des spécifications, mais certainement pas un remplacement. Cela ne veut pas dire que je plaide pour une spécification initiale non plus, mais plutôt que je fais la distinction que nous appliquons des tests pour valider les choses que nous savons sur la façon dont un système devrait se comporter, plutôt que d'avoir la les tests définissent le comportement. Une distinction pédante peut-être, mais néanmoins importante.
S.Robins
10

Je pense que le plus important pour vous serait de clarifier pourquoi elle a besoin de ce rapport.

Il peut y avoir différentes explications (comme le suggèrent plusieurs réponses), qui nécessitent des stratégies très différentes.

  • si elle est une personne raisonnable, souhaitant simplement obtenir des informations pour aider le travail de son équipe de test, il est logique de parvenir à une compréhension commune et de trouver une solution qui conviendrait à vous deux. Vous pouvez discuter avec elle de la nature des tests unitaires et de la différence fondamentale entre les tests unitaires vs fonctionnels / système / d'acceptation. J'espère que vous pourrez lui faire comprendre que ces travaux se déroulent à des niveaux très différents et qu'aucun ne peut remplacer l'autre.
  • si elle est une folle de contrôle ou une bureaucrate, exigeant un rapport juste pour le plaisir, vous pouvez générer quelque chose pour satisfaire ses caprices avec le moins d'effort (par exemple, ce que @Doc a suggéré :-).
  • si elle est dans un jeu de pouvoir, vous pouvez vous demander si elle a le droit d'exiger des rapports des développeurs. D'après mon expérience, les développeurs ne sont généralement pas censés faire rapport au département QA.
Péter Török
la source
Bons points. Elle semble être une personne raisonnable. Ma crainte, que je n'ai pas clairement exprimée, est que les tests unitaires conduisent les testeurs dans la mauvaise direction et la fausse sécurité dans ce dont ils ont besoin et n'ont pas besoin de tester.
Rubio
2
@Rubio, en effet, vous devez lui préciser que les tests unitaires ne peuvent pas remplacer les tests système. En fait, la couverture élevée des tests unitaires d'un module spécifique peut même être un signe d'avertissement que ce module nécessite une attention supplémentaire lors des tests du système! Si les développeurs ont pris la peine supplémentaire d'écrire autant de tests, le code peut avoir été radicalement modifié / étendu récemment, et / ou est plein de bugs.
Péter Török
7

Je pense que le rôle de l'AQ et du développement, ainsi que l'interaction, peuvent varier considérablement d'une organisation à l'autre. Mais en général, dans mon équipe, je dis aux membres qui se joignent de faire comme s'il n'y avait pas d'équipe QA, dans le sens où ils sont responsables des changements qu'ils mettent en production. À son tour, notre équipe d'assurance qualité n'assume pas grand-chose aux tests des développeurs et effectue une bonne partie des tests du système dans son ensemble.

Pour cette raison, notre équipe d'assurance qualité ne se soucie pas vraiment de ce qui est et n'est pas testé unitaire avant de commencer le test.

Je pense qu'il est utile pour l'équipe d'AQ de comprendre ce que les tests unitaires font et ne couvrent pas, à un niveau élevé, afin que nous puissions travailler collectivement pour identifier les lacunes et les domaines qui pourraient avoir besoin de plus de rigueur. Donc, peut-être que votre collègue recherche un résumé de haut niveau, par opposition aux détails sanglants.

Paul Sanwald
la source
5

Elle a insisté pour que les développeurs signalent ce qu'ils ont testé et comment l'unité.

Essaie-t-elle vraiment de se demander si ce type de test relève réellement du domaine du «développement», ou essaie-t-elle simplement de déterminer dans quelle mesure votre code est couvert par des tests unitaires? En regardant les informations que vous avez fournies, il semble qu'elle veuille simplement savoir quelles parties du code sont couvertes et où elle devrait concentrer les efforts de son équipe.

J'ai travaillé sur une équipe de test dès la sortie de l'école avant de me lancer dans un rôle de développement, et je peux voir comment cela pourrait être utile pour elle et son équipe.

Jason
la source
1
Mais la focalisation ne devrait-elle pas venir des spécifications? Il y a des situations où les changements de code ont des répercussions inattendues et alors il est très important pour le développeur de communiquer que les tests doivent également couvrir ceci et cela.
Rubio
1
@Rubio: Bien sûr, mais d'un point de vue purement pratique, essayez de le regarder de son point de vue. En supposant que toutes les parties de l'application n'auront pas des quantités de code parfaitement égales couvertes par les tests unitaires, ne voudriez-vous pas consacrer davantage de vos ressources limitées aux parties de l'application avec moins de couverture? Pour moi, il s'agit simplement de regarder le rapport et de dire à mon équipe: "Hé les gars, il semble que la zone X ait moins de code couvert par les tests que la zone Y, essayons de nous concentrer sur l'exécution de tests sur la zone X"
Jason
@Rubio: oui, mais si vous faites correctement le TDD (c'est-à-dire le BDD), vos tests doivent être en premier lieu conformes aux spécifications. Si votre entreprise était vraiment éclairée, alors l'équipe de test pourrait écrire les tests pour l'équipe de développement.
gbjbaanb
2
Ce qui est testé: rapport de couverture de code généré automatiquement. Comment est-il testé: lisez le code de test unitaire. @gbjbaanb: "l'équipe de test pourrait écrire les tests pour l'équipe de développement." Il y a tellement de choses qui ne vont pas dans cette déclaration, que je ne sais pas par où commencer, sauf pour dire, Very Bad Idea .
BryanH
5

Je ne vois pas que cela compte trop.

Si vous ne les fournissez pas à QA / Testing, et qu'ils ne font pas les tests appropriés, et que cela échoue en production, c'est leur faute de le laisser passer par QA en production sans vérifier qu'il fonctionne comme spécifié.

Si vous les fournissez à QA / Testing, et qu'ils ne font pas de tests appropriés ... même résultat que si vous ne les aviez pas fournis.

Cependant, si vous les fournissez, ils pourraient également les comparer à la spécification et / ou suggérer quels tests pourraient être défectueux, ou doivent être modifiés car ils ont trouvé un bogue.

Vraiment, je ne vois pas beaucoup d'inconvénients à les fournir. C'est toujours sur QA / testing pour valider par rapport à la spécification. S'ils prennent la voie paresseuse et se contentent de croire que vos tests sont assez bons parce qu'ils ont tous réussi, ce sont eux qui ont échoué dans leur travail. Tant qu'ils ont toujours les spécifications, les résultats des tests unitaires / d'intégration ne sont que des peluches et ne devraient pas vous blesser d'une manière ou d'une autre. C'est la raison pour laquelle nous avons dev et QA. Plusieurs vérifications que l'application effectue comme spécifié.

Les développeurs font des erreurs, l'AQ fait des erreurs, idéalement, ils ne font pas tous les deux une erreur sur le même élément ... et s'ils le font ... c'est potentiellement un analyste qui a laissé tomber la balle en écrivant une spécification peu claire.

CaffGeek
la source
2
L'inconvénient pour moi est un travail supplémentaire qui n'apporte pas ou peu de valeur.
Rubio
@Rubio, quel travail supplémentaire? Imprimez simplement le résultat. S'ils sont bien nommés, cela leur indique ce que vous testez. Ils ne devraient pas avoir besoin du code réel ou de la description du fonctionnement de la méthode. S'ils le font, ils peuvent le rechercher eux-mêmes.
CaffGeek
1
Générer un rapport des 3500 tests unitaires / d'intégration réussis ne serait probablement d'aucune utilité pour le testeur, même si les tests étaient bien nommés (ce qu'ils devraient être mais ne le sont pas). Afin de fournir aux testeurs des informations significatives sur le test unitaire, le développeur devrait parcourir le test unitaire associé à une fonctionnalité particulière et communiquer en quelque sorte au testeur ce qui est réellement testé et comment il est affirmé. Ça fait beaucoup de travail.
Rubio
1
@Rubio - l'automatisation est votre ami. Vous pouvez configurer un serveur d'intégration continue qui envoie des rapports chaque fois qu'il y a un enregistrement (cela vous aidera aussi). Si le contrôle qualité demande des explications sur les tests et le code, il semblerait qu'ils aient dépassé le niveau de la raisonnabilité et soient tombés dans le domaine de «l'échec à saisir le concept». S'ils ne peuvent pas ou ne veulent pas lire le code, alors ils sont inutiles. À ce stade, une discussion avec votre responsable serait bénéfique, et vous pouvez l'exposer comme: "QA veut que je passe x% de mon temps à les aider à lire le code, est-ce correct?"
BryanH
1
+1 pour avoir déclaré que cela n'exonère pas QA de sa responsabilité de tester indépendamment le logiciel.
2

Les tests unitaires sont la responsabilité des développeurs que les tests peuvent être utiles pour comprendre comment les morceaux de code fonctionnent par eux-mêmes. Certains peuvent voir cela comme une forme de documentation et ont donc une certaine valeur bien qu'il puisse y avoir des frais généraux si les tests unitaires sont modifiés régulièrement.

L'autre valeur de la réussite des tests est que cela peut éviter de doubler les tests qui peuvent être redondants en termes de garantie des fonctionnalités de base.

Il existe également des tests d'acceptation par l'utilisateur qui sont distincts de tout cela, car l'utilisateur final peut avoir sa propre compréhension du fonctionnement d'un système.

JB King
la source
1
Les tests redondants sont ce qui est souvent utilisé comme argument et peuvent parfois être vrais. Cependant, les tests système sont toujours effectués sur l'ensemble du système tandis que les tests unitaires / d'intégration se concentrent sur une unité spécifique. Je vois un danger ici.
Rubio
2

Si votre entreprise a une méthodologie définie pour garantir la qualité de ses produits (s'ils sont conformes SOX, ou essaient d'améliorer leur niveau CMMI, ils le font probablement), alors les produits doivent pouvoir résister à l'audit pour montrer que le processus était suivi.

Souvent, le processus défini comprend des tests unitaires (ce qui est une bonne chose). Malheureusement, cela signifie également que vous devez documenter vos tests unitaires et prouver qu'ils ont été exécutés afin de résister à l'audit. Cela signifie donc que vous avez besoin d'un moyen de rendre compte de vos tests unitaires.

Examinez un outil comme Sonar pour vous aider - il indiquera le niveau de couverture du code et les résultats de vos tests unitaires.

Matthew Flynn
la source
SOX non, CMMI oui. Nos tests unitaires / d'intégration font partie du processus de révision du code et cela résiste à l'audit. Je peux obtenir un rapport généré à partir d'un cycle de test unitaire / d'intégration, mais c'est assez énigmatique pour un testeur. La couverture est également dans le rapport, mais cela ne signifie rien en soi.
Rubio
Tout d'abord, ne donnez pas de noms cryptiques à vos tests. Consultez dannorth.net/introducing-bdd . Deuxièmement, la couverture du code peut ne pas dire grand-chose sur la qualité des tests, mais elle montre au moins que les unités testées ne explosent pas lorsque la plupart du code est exécuté.
Matthew Flynn
Bon lien, merci. Je me souviens d'avoir lu un excellent article de magazine explorant différentes façons de nommer les tests unitaires, mais je ne peux pas le trouver pour la mort de moi maintenant. Peut-être Visual Studio Magazine ou Code Magazine.
Rubio
2

Cela dépend vraiment de l'entreprise, mais d'après mon expérience ayant travaillé à la fois en tant que testeur de système dans une approche traditionnelle mais également en tant que testeur travaillant dans une équipe agile dans un modèle de CD, savoir ce qui a été testé à l'unité et à l'intégration est extrêmement utile.

La qualité est la responsabilité de l'équipe - les développeurs, les testeurs et la gestion des produits et travailler ensemble est le meilleur moyen de garantir cela.

Le gestionnaire de test veut donc savoir ce qui a été testé à l'unité et l'intégration et c'est un peu plus de travail supplémentaire pour les développeurs, mais cela économise le travail global pour le projet! En donnant les informations au responsable du test, il peut concentrer les efforts de son équipe de test sur ce qui est critique et important. Comme mentionné précédemment, si un domaine de code n'est pas testé unitaire, l'équipe peut y concentrer ses efforts par rapport à un domaine qui est fortement testé - pourquoi dupliquer l'effort? Vous travaillez tous vers le même objectif ultime: des logiciels de meilleure qualité publiés à temps.

Lauren
la source
1

Je pense qu'il serait avantageux de fournir ce genre de chose. La couverture des tests unitaires doit être connue par le développement et les tests afin qu'ils puissent en tenir compte.

De toute évidence, vous devez tester les éléments essentiels à l'entreprise, quoi qu'il arrive. Vous devez tester durement la fonctionnalité couramment utilisée, qu'elle ait ou non une grande couverture de test unitaire. Cela ne pouvait pas faire de mal de leur faire savoir quels autres endroits sont couverts par les tests unitaires. Le code vérifie-t-il déjà les cas marginaux dans ce petit contrôle? Ce genre de choses est utile à connaître de tous les côtés de l'entreprise.

Chad Stewart
la source
J'étais sur le point d'écrire une réponse similaire. Alors que les tests unitaires doivent être du domaine du développeur du logiciel, donner à l'équipe de test une idée de la couverture du code peut aider l'équipe de test à comprendre et à cibler des domaines spécifiques qui peuvent nécessiter une plus grande attention de la part des testeurs. Cela peut également être un moyen de garder les développeurs sur leur jeu en s'assurant qu'ils prennent en compte autant de cas marginaux qu'il est rentable de le faire. Cela permet à l'équipe de test non seulement de valider l'intégralité du système, mais également de prendre en compte tous les éléments qui pourraient autrement être considérés comme coûteux à tester.
S.Robins
1

Il convient de mentionner l'approche discutée dans le livre "Comment Google teste les logiciels": les tests et le contrôle de la qualité sont la responsabilité de tous, et les normes sont rigoureuses.

Le véritable rôle de ce que l'on appelle traditionnellement le département "Testing" est en fait la productivité des développeurs; c'est-à-dire l'automatisation pour permettre à l'organisation d'atteindre le niveau de rigueur économique requis.

William Payne
la source