7
votes

Qu'est-ce qu'un test d'unité?

DUPLICATES possibles:

Quel est le test unitaire et comment le faites-vous? < / a>
Qu'est-ce que le test unitaire?

Je reconnais que à 95% de vous, c'est une question très WTF.

Alors. Qu'est-ce qu'un test d'unité? Je comprends que, essentiellement, vous essayez d'isoler la fonctionnalité atomique, mais comment testez-vous cela? Quand est-ce nécessaire? Quand est-ce ridicule? Pouvez-vous donner un exemple? (De préférence en C? Je l'entends surtout de Java Devs sur ce site, alors peut-être que cela est spécifique aux langues orientées objet? Je ne sais vraiment pas.)

Je sais que de nombreux programmeurs jurerent par l'unité testant religieusement. De quoi s'agit-il de

EDIT: En outre, quel est le rapport entre le temps que vous dépensez généralement des tests d'unité à l'écriture du temps passé à écrire un nouveau code?


10 commentaires

Duplicata de doublons. Il suffit de rechercher un débordement de pile pour "Qu'est-ce qu'un test unitaire" et vous aurez assez de mâcher pendant des mois.


@womp: Je viens de le faire et je n'ai vu aucun avec des titres similaires.


Stackoverflow.com/search?q=unit+Sting


Stackoverflow.com/search?q=what+unit+Test rendements Stackoverflow.com/questions/1383/what-is-unit-testing , parmi beaucoup d'autres. 20 pages valeurs.


Exemple pratique, Roy Osherove Avis sur Nerddinner Unit Tests viddler.com/explore/royoSherove/ Vidéos / 4/723.2


@John Saunders Belle chaîne de recherche. Merci.


FYI, j'ai été surpris que je devais retirer le "s" et le "A".


Ouais. Je n'ai même pas pensé à faire ça. Merci pour votre patience.


Un test unitaire est un meilleur ami du développeur.


@Tyler: Pas de problème. Je suggère que tout le monde passe jusqu'à deux minutes à la recherche avant de poster une nouvelle question. Si vous ne trouvez pas ce que vous recherchez après cela, puis postez-vous!


7 Réponses :


0
votes

Dans la programmation informatique, le test d'unité est une méthode de vérification et de validation logicielle dans lesquelles un programmeur teste que des unités individuelles de code source sont aptes à être utilisées. Une unité est la plus petite partie essentielle d'une application. Dans la programmation procédurale Une unité peut être un programme individuel, une fonction, une procédure, etc., tandis que dans la programmation orientée objet, la plus petite unité est une classe, qui peut appartenir à une classe / super classe, de classe abstraite ou de classe dérivée / d'enfant.

http://fr.wikipedia.org/wiki/unit_testing


6 commentaires

C'est assez grossier. Bien sûr, j'ai examiné l'article Wikipedia sur les tests unitaires. Les questions que j'ai posées ne sont pas répondues. Je voudrais des exemples du monde réel. Je rassemble que c'est un gros problème et j'aimerais savoir comment c'est utilisé dans la pratique.


Avez-vous également lu les liens externes de cet article?


@Nifle oui. Encore une fois, pas de perspicacité du monde réel. Juste théorie.


Je ne vois pas comment il est impoli. Vous avez posé une question logicielle très élémentaire - je vous ai pointée vers un bon lieu de référence


@Psu_kardi Lisez en.wikipedia.org/wiki/recursion_(Computer_science) et dites moi cela décrit que ce sont les pièges du monde réel.


Je voudrais mais vous m'avez donné une mauvaise url ... Donc, non seulement vous échouez aux tests unitaires - vous ne pouvez même pas fournir de véritables URL dans vos arguments



0
votes

Par exemple, si vous avez une classe matricielle, vous pourriez avoir un test d'unité vérifiant que

matrice A = matrice (.....); A.Inverse () * A == matrice :: identité


0 commentaires

1
votes

Un test d'unité est un autre élément de logiciel que vous écrivez qui exerce votre code principal pour accepter la fonctionnalité souhaitée.

Je pourrais écrire un programme de calculatrice qui a l'air bien, a les boutons, ressemble à une calculatrice TI-quoi que ce soit et cela pourrait produire 2 + 2 = 5. Semble agréable, mais plutôt que d'envoyer chaque itération de certains code à un testeur humain, avec une longue liste de chèques, je, le développeur peut exécuter des tests de l'unité automatisés, codés et codés sur mon code.

essentiellement, Un test unitaire doit être testé, par des pairs ou un autre examen attentif pour répondre "est-ce que cela teste ce que je veux dire?"

Le test de l'unité disposera d'un ensemble de "entrées" ou "entrées". ", et comparez celles-ci aux" sorties "attendues.

Il existe, bien sûr, différentes méthodologies sur la manière dont, lorsque, et combien d'utilisation des tests d'unités (vérifiez donc certaines questions sur ces lignes). Cependant, dans leur cas le plus fondamique, ils sont un programme ou un module chargé de certains autres programmes, ce qui rend assertions .

une grammaire standard pour un test unitaire pourrait être de avoir une ligne de code qui ressemble à ceci: assert.arequal (A, b) .

Le corps de la méthode de test de l'unité peut configurer les entrées et une sortie réelle et Comparez-le à la sortie attendue. xxx

Si votre test de l'unité est écrit dans la langue d'un cadre particulier ( par exemple, par exemple Junit, Nunit, etc. ), les résultats de chaque méthode marqués comme faisant partie d'une "course de tests" seront agrégés dans un ensemble de résultats de test, tels qu'un assez graphique de points rouges pour les points de défaillance et vert pour les succès et / ou un fichier XML , etc.

En réponse à vos derniers commentaires, "Théorie" peut fournir une idée réelle mondiale. TDD, le développement axé sur les tests, en dit long sur lorsque et à quelle fréquence utiliser des tests. Sur mon dernier projet, nous n'avions pas adhéré à TDD, mais nous avons certainement utilisé des tests unitaires pour vérifier que notre code a fait ce qu'il était censé faire.

Dites que vous avez choisi de mettre en œuvre l'interface de la voiture. L'interface de la voiture ressemble à ceci: xxx

Vous choisissez de mettre en œuvre l'interface de la voiture dans la classe FordTurus: xxx

vous «Re supposant que pour décélérer un FordTurus, il faut passer une valeur négative. Cependant, supposons que vous ayez un ensemble de tests d'unités écrites contre l'interface de la voiture, et ils ressemblent à ceci: xxx

Le test vous indique que vous avez peut-être mis en œuvre la voiture interface incorrectement.


3 commentaires

Faites-vous des tests unitaires sur votre code? Pour chaque paramètre possible pour chaque fonction que vous écrivez? Quel est le rapport entre le temps passé à écrire des tests unitaires pour écrire un nouveau code?


Réponse courte: Cela dépend. Vérifiez d'autres réponses à cette question même. Si je n'ai pas besoin de et je ne veux pas, je ne le fais pas. Parfois, je suis tenu de. Parfois, je me sens comme si ça sera utile. D'autres fois, ce serait ridicule si je le faisais. Beaucoup de gens vous diront que si votre code doit être transmis, ou réapprobré ou jamais refoulé, un ensemble de tests peut être en ordre.


Répondre à une question de ratio du temps passé à écrire des tests pour écrire un nouveau code implique l'adoption d'une méthodologie spécifique pour écrire ledit code. Si vous êtes au lycée et que vous voulez simplement obtenir un codage de l'expérience, comprenez que l'adoption de toute méthodologie nécessite du temps et de la planification. Si vous souhaitez pratiquer TDD, obtenez un livre sur le sujet et travaillez par le chapitre par chapitre, par exemple une semaine (note: Je n'ai aucune connaissance particulière de ce que des livres existent sur le sujet). Demandez-vous "quel est mon objectif?". Si vous travaillez à travers une API particulière, vous risquez de ne pas être la réponse. :-)



9
votes

Je suis Java maintenant, avant que ce C ++, avant que C. Je suis tout à fait convaincu que chaque œuvre que j'ai faite, que je suis maintenant immuable, a été renforcée par les stratégies de test que j'ai choisies. Ébrécher les tests mals.

Je suis sûr que vous testez le code que vous écrivez. Quelles techniques utilisez-vous? Par exemple, vous pourriez vous asseoir dans un débogueur et passer à travers le code et regarder ce qui se passe. Vous pourriez exécuter le code contre certaines données de test que quelqu'un vous a donné. Vous pouvez concevoir des entrées particulières car vous savez que votre code a des comportements intéressants pour certaines valeurs d'entrée. Supposons que vos affaires utilisent les choses de quelqu'un d'autre et que ce n'est pas encore prêt, vous vous moquez de leur code afin que votre code puisse fonctionner avec au moins certaines fausses réponses

Dans tous les cas, vous pourriez être dans une certaine mesure unitaire. Le dernier est particulièrement intéressant - vous testez beaucoup de manière isolée, testez votre unité, même si le leur n'est pas encore prêt.

Mon avis:

1). Les tests qui peuvent facilement être rénovés sont très utiles - capturer sans fin des défauts de rampants tardifs. En cas de contraste assis dans un débogueur, il y a un engourdissement.

2). L'activité consistant à construire des tests intéressants lorsque vous écrivez votre code ou avant d'écrire votre code, vous vous concentrez sur vos cas de franges. Ces entrées gênantes zéro et nulle, celles "désactivées par une erreur". Je perçoive un meilleur code qui sort à la suite de bons tests unitaires.

3). Il y a un coût de maintien des tests. Généralement, cela en vaut la peine, mais ne sous-estimez pas l'effort de les garder à travailler.

4). Il peut y avoir une tendance à des tests unitaires trop propulsés. Les bugs vraiment intéressants ont tendance que ot fluage lorsque des pièces sont intégrées. Vous remplacez cette bibliothèque que vous vous moquez avec la vraie chose et lo! Cela ne fait pas tout à fait ce qu'il a dit sur l'étain. Il reste également un rôle pour les tests manuels ou explorateurs. Le testeur humain perspicace trouve des défauts spéciaux.


1 commentaires

Bien dit. Peut-être que vous pourriez aussi ajouter à "Comment testez-vous en ce moment": vous ajoutez simplement (trop) la journalisation et la lire à travers elle lors de la ré-exécution de votre application, peut-être à chaque fois même en cliquant sur / Parcourir une manière loine à travers votre application, configuré Les bonnes données de manière interactive avant de voir, si cela fonctionne comme vous l'attendez. (affirmer attendu attendu :-))



1
votes

point par point:

1) Qu'est-ce qu'un test d'unité?

Un test unitaire est un test logiciel conçu pour tester une unité distincte de fonctionnalité de logiciels.

2) Je comprends que, essentiellement, vous essayez d'isoler la fonctionnalité atomique, mais comment testez-vous cela?

Les tests unitaires sont en réalité un bon moyen d'appliquer certains principes de conception; L'un des aspects d'entre eux est qu'ils font réellement un effet subtil mais significatif sur la conception du code. La conception de test est une chose importante; Être capable de tester (ou non) un certain nombre de code peut être très important; Lorsque des tests d'unités sont utilisés, les conceptions ont tendance à migrer vers le côté "plus atomique" du spectre.

3) Quand est-ce nécessaire?

Il y a beaucoup d'opinions variables sur celui-ci. Certains disent que c'est toujours nécessaire, certains disent que c'est complètement inutile. J'aurais affirmé que la plupart des développeurs expérimentés avec des tests unitaires diraient que des tests d'unités sont nécessaires à tout code de chemin critique qui a une conception pouvant être conçue pour tester un appareil (je sais que c'est un peu circulaire, mais voir n ° 2 ci-dessus). < / p>

  1. Quand est-ce ridicule? Pouvez-vous donner un exemple?

    En règle générale, l'autre est l'endroit où vous entrez dans la fin ridicule du spectre. Par exemple, si vous avez une classe de vecteur 3D contenant des accesseurs pour chacun des composants scalaires, les tests unitaires pour chacun des accessoires scalaires confirmant la gamme complète d'entrées et vérifiant que les valeurs de chacune d'elles seraient considérées comme un peu de surkill par certains. D'autre part, il est important de noter que même ces situations peuvent être utiles à tester.

    1. Je l'entends surtout de Java Devs sur ce site, alors peut-être que cela est spécifique aux langues orientées objet?

      Non, c'est vraiment applicable à tout logiciel. La méthodologie de test de l'unité est arrivée à la maturité avec un environnement Java, mais elle est vraiment applicable à une langue ou à une autre environnement.

      1. Qu'est-ce que c'est tout?

        Le test unitaire est, à un niveau très basique, tout sur la vérification et la validation des comportements attendus d'une unité de code sont en réalité ce que le code fait.


0 commentaires

2
votes

La définition la plus simple / non technique que je peux trouver de manière automatisée pour tester des parties du code ...

Je l'utilise et je l'aime ... mais pas religieusement, l'un des Mes moments les plus fiers des tests unitaires étaient un calcul d'intérêt que j'ai fait pour une banque, extrêmement compliqué et que je n'avais qu'un bug et qu'il n'y avait pas de test de l'unité pour ce cas ... Dès que j'ai ajouté le cas et corrigé mon code, était parfait.

prenant cet exemple j'avais un appel de classe INTERNALCALCULATION et qu'il avait des propriétés pour tous les arguments et une seule méthode publique calculer () Là où plusieurs étapes du calcul et si je l'essaie d'essayer d'écrire le tout dans une seule méthode et de vérifier mon résultat, il aurait été accablant d'essayer de trouver où mon bug / s ... alors j'ai pris chaque étape du calcul et créé une méthode privée et un test de l'unité / s pour tous les cas différents. (Certaines personnes vous diront de tester uniquement les méthodes publiques, mais dans ce scénario, il a fonctionné mieux pour moi ...) Un exemple des méthodes privées était la suivante:

Méthode: < / p> xxx

Méthodes de test:

note: je les nommerais différemment maintenant, au lieu de chiffres que je voudrais fondamentalement mettre le résumé dans la Nom de la méthode. xxx

où est-il ridicule?

Eh bien à chacun ... Plus vous le faites, vous trouverez ce que vous trouverez où il est utile et où il semble "être ridicule" mais personnellement, je ne l'utilise pas pour tester ma base de données de la manière dont la plupart des testeurs de l'unité hardcore ... En ce sens que j'ai des scripts pour reconstruire le schéma de base de données , repeuplez la base de données avec des données de test, etc. J'écris habituellement une méthode de test de l'unité pour appeler ma méthode de dataAccess et l'étiqueter avec un suffixe de débogage comme celui-ci: FindLoannots_debug () Et j'ai pu mettre System.Diagnostics.debugger.break () Donc, si je les exécute en mode de débogage, je peux vérifier manuellement mes résultats.


0 commentaires

1
votes

Vous voulez donc des exemples? Dernier semestre j'ai pris un cours de compilateurs. Nous avons dû écrire un allocator de registre. Pour le mettre en termes simples, mon programme peut être résumé comme suit:

entrée: fichier écrit dans ILOC, une langue pseudo-assemblée composée de mon manuel. Les instructions du fichier ont enregistré des noms comme "R ". Le problème est que le programme utilise autant de registres que nécessaire, ce qui est généralement supérieur au nombre de registres sur la machine cible.

Sortie: Un autre fichier écrit dans ILOC. Cette fois, les instructions sont réécrites de manière à ce qu'il utilise le nombre maximal de registres correct qui est autorisé.

Pour écrire ce programme, je devais faire une classe qui pourrait analyser un fichier ILOC. J'ai écrit un tas de tests pour cette classe. Vous trouverez ci-dessous mes tests (j'en avais effectivement plus, mais je me suis débarrassé d'eux pour vous aider à raccourcir cela. J'ai aussi ajouté des commentaires pour vous aider à le lire). J'ai fait le projet en C ++, donc j'ai utilisé le cadre de test C ++ de Google (Googletest) situé ici .

Avant de vous montrer le code ... laissez-moi dire quelque chose à propos de la structure de base. Essentiellement, il y a une classe de test. Vous devez mettre un tas de trucs de configuration générale dans la classe de test. Ensuite, il y a des macros de test appelées test_f. Le cadre de test prend sur ces points et comprend qu'ils doivent être exécutés en tant que tests. Chaque test_f a 2 arguments, le nom de la classe de test et le nom du test (qui devrait être très descriptif ... de cette façon si le test échoue, vous savez exactement ce qui a échoué). Vous verrez que la structure de chaque test est similaire: (1) Configurez quelques éléments initiaux, (2) Exécutez la méthode que vous testez, (3) Vérifiez que la sortie est correcte. La façon dont vous vérifiez (3) consiste à utiliser des macros comme attendre. *. attendu_eq (attendu, résultat) vérifie que résultat est égal au attendu . Si ce n'est pas le cas, vous obtenez un message d'erreur utile comme "Le résultat était bla, mais attendu bla".

voici le code (j'espère que ce n'est pas terriblement déroutant ... ce n'est certainement pas un Exemple court ou facile, mais si vous prenez le temps, vous devriez pouvoir suivre et obtenir la saveur générale de la façon dont cela fonctionne). xxx

après tout est dit et fait. .. Pourquoi ai-je fait ça !? Bien d'abord. J'ai écrit les tests progressivement lorsque je suis prêt à écrire chaque morceau de code. Cela m'a permis de me donner la tranquillité d'esprit que le code que j'ai déjà écrit fonctionnait correctement. Il aurait été fou d'écrire tout mon code puis de l'essayer sur un fichier et de voir ce qui s'est passé. Il y avait tellement de couches, comment pourrais-je savoir où un bogue viendrait de sauf si j'avais chaque petite pièce testée isolément?

Mais ... surtout !!! Le test ne consiste pas vraiment à attraper des bugs initiaux dans votre code ... il s'agit de vous protéger de votre code accidentellement. Chaque fois que j'ai refoulé ou modifié ma classe Ilocparser, j'étais convaincu que je ne l'ai pas modifiée de manière mauvaise parce que je pouvais exécuter mes tests (en quelques secondes) et voir que tout le code fonctionne toujours comme prévu. C'est la grande utilisation des tests d'unités.

Ils semblent avoir trop de temps ... mais finalement, ils vous permettent de suivre le temps de suivre des bugs parce que vous avez changé de code et ne savez pas ce qui s'est passé. Ils constituent un moyen utile de vérifier que de petits morceaux de code font ce qu'ils sont censés faire, et correctement.


1 commentaires

Wow. Merci d'avoir mis ceci ensemble. C'était très très utile.