Pourquoi utiliser JUnit pour les tests?

peut-être que ma question Est nouvelle, mais je ne peux pas vraiment comprendre les circonstances dans lesquelles j'utiliserais ?

que j'écrive des applications simples ou des plus grandes, je les teste avec les instructions System.out et cela me semble assez facile.

Pourquoi créer des classes de test avec JUnit, dossiers inutiles dans le projet si nous devons encore appeler les mêmes méthodes, vérifier ce qu'ils retournent et nous avons alors un les frais généraux de l'annotation de tout?

pourquoi ne pas écrire une classe et la tester tout de suite avec System.out mais ne pas créer des classes Test?

PS. Je n'ai jamais travaillé sur de grands projets que je ne fais qu'apprendre.

Alors quel est le but?

123
demandé sur Rob Kielty 2012-06-02 04:54:05

11 réponses

ce n'est pas un test, c'est" regarder manuellement la sortie " (connu dans le biz sous le nom LMAO). Plus formellement, il est connu sous le nom de" recherche manuelle de sortie anormale " (LMFAO). (Voir note ci-dessous)

chaque fois que vous changez de code, vous devez lancer l'application et LMFAO pour tout code affecté par ces changements. Même dans les petits projets, cela est problématique et sujet à des erreurs.

maintenant échelle jusqu'à 50k, 250k, 1m LOC ou plus, et LMFAO chaque fois que vous faire un changement de code. Non seulement c'est désagréable, mais c'est impossible: vous avez augmenté les combinaisons d'entrées, de sorties, de drapeaux, de conditions, et il est difficile d'exercer toutes les branches possibles.

pire, LMFAO pourrait signifier visiter des pages sur des pages d'application web, exécuter des rapports, surveiller des millions de lignes de log à travers des douzaines de fichiers et de machines, lire des e-mails générés et livrés, vérifier des messages textes, vérifier le chemin d'un robot, remplir une bouteille de soda, agrégation de données provenant d'une centaine de services web, vérification de la piste de vérification d'une transaction financière... vous obtenez l'idée. "Output "ne signifie pas quelques lignes de texte," output " signifie le comportement du système agrégé.

enfin, les tests unitaires et de comportement définissent comportement du système. Les Tests peuvent être effectués par un serveur d'intégration en continu et leur exactitude vérifiée. Bien sûr, tout comme System.out s, mais le CI le serveur ne va pas savoir si l'un d'eux a tort–et si c'est le cas, ce sont des tests unitaires, et vous pourriez aussi bien utiliser un framework.

peu importe à quel point nous pensons que nous sommes bons, les humains ne sont pas de bons cadres de tests unitaires ou des serveurs de CI.


Note: Comme indiqué (rudement) dans les commentaires, LMAO est test, mais dans un très sens limité. Il n'est pas reproductible de manière significative, à travers un projet entier ou dans le cadre d'un processus. C'est comme se développer progressivement dans une REPL, mais ne jamais formaliser ces tests incrémentiels.

127
répondu Dave Newton 2017-02-08 14:35:48

nous écrivons des tests pour vérifier l'exactitude du comportement d'un programme.

vérifier l'exactitude du comportement d'un programme en inspectant le contenu des instructions de sortie en utilisant votre yeux est un manuel , ou plus spécifiquement, un visuel processus.

on pourrait dire que

inspection visuelle des œuvres , Je vérifie que le code fait ce qu'il doit à si, pour ces scénarios et une fois que je peux voir que c'est correct nous sommes bons à aller.

Maintenant, d'abord, c'est formidable que vous êtes intéressé à savoir si ou non le code fonctionne correctement. C'est une bonne chose. Vous êtes en avance sur le virage! Malheureusement, il y a des problèmes avec cette approche.

le premier problème avec l'inspection visuelle est que vous êtes un mauvais accident de soudure loin de ne jamais être en mesure de vérifiez à nouveau l'exactitude de votre code.

le deuxième problème est que la paire d'yeux utilisée est étroitement couplée avec le cerveau du propriétaire des yeux. Si l'auteur du code possède également les yeux utilisés dans le processus d'inspection visuelle, le processus de vérification de l'exactitude dépend des connaissances sur le programme internalisé dans le cerveau de l'inspecteur visuel.

Il est difficile pour une nouvelle paire d'yeux à venir et de vérifier l'exactitude du code, simplement parce qu'ils ne sont pas associés avec le cerveau de l'original codeur. Le propriétaire de la deuxième paire d'yeux vont devoir converse avec l'auteur original du code, afin de bien comprendre le code en question. La Conversation comme moyen de partage des connaissances est notoirement peu fiable. Un point qui est discutable si le Codeur est pas disponible pour la nouvelle paire d'yeux. Dans ce cas, la nouvelle paire d'yeux doit lire le code original.

il est plus difficile de lire le code d'une autre personne qui n'est pas visé par les tests unitaires que le code qui comporte des tests unitaires connexes. Au mieux, la lecture du code d'autres personnes est un travail délicat, au pire, c'est la tâche la plus difficile dans l'ingénierie logicielle. Il y a une raison pour laquelle les employeurs, lorsqu'ils annoncent des postes vacants, insistent sur le fait qu'un projet est entièrement nouveau. Écrire du code à partir de Zéro est plus facile que de modifier le code existant et rend ainsi l'emploi annoncé apparaître plus attrayant pour les employés.

avec les tests unitaires, nous divisons le code en ses composants. Pour chaque composant, nous indiquons ensuite notre décrochage en indiquant comment le programme devrait se comporter . Chaque test unitaire décrit la façon dont cette partie du programme devrait fonctionner dans un scénario précis. Chaque test unitaire est comme une clause dans un contrat qui décrit ce qui devrait se passer du point de vue du code client.

cela signifie donc qu'un nouvelle paire de yeux a deux brins vivre et précis documentation sur le code en question.

tout d'abord, ils ont le code lui-même, la mise en œuvre, comment le code a été fait ; deuxièmement, ils ont toute la connaissance que le codeur original décrit dans un ensemble d'énoncés formels qui racontent l'histoire de la façon dont ce code est censé se comporter.

Unité les tests permettent de saisir et de décrire officiellement les connaissances que l'auteur original possédait lorsqu'il a mis en œuvre la classe. Ils donnent une description du comportement de cette classe lorsqu'elle est utilisée par un client.

vous avez raison de remettre en question l'utilité de faire cela parce qu'il est possible d'écrire des tests unitaires qui sont inutiles, ne couvrent pas tout le code en question, deviennent périmés ou périmés et ainsi de suite. Comment s'assurer que les tests unitaires non seulement imitent mais améliorent le processus d'un auteur averti et consciencieux qui inspecte visuellement les états de sortie de son code à l'exécution? Écrivez d'abord le test unitaire, puis écrivez le code pour réussir ce test. Quand vous avez terminé, laissez les ordinateurs exécuter les tests, ils sont rapides, ils sont bons à faire des tâches répétitives, ils sont idéalement adaptés au travail.

S'assurer de la qualité des tests en les examinant chaque fois que vous démarrez le code, ils testent et exécutent les tests pour chaque construction. Si un test échoue, le réparer immédiatement.

nous automatisons le processus d'exécution des tests afin qu'ils soient exécutés à chaque fois que nous construisons le projet. Nous automatisons également la génération de rapports de couverture de code qui détaille le pourcentage de code qui est couvert et exercé par des tests. Nous recherchons des pourcentages élevés. Certaines entreprises empêcheront les changements de code d'être enregistrés au contrôle du code source si elles n'ont pas suffisamment de tests unitaires écrits pour décrire tout changement de comportement du code. Généralement, une deuxième paire d'yeux examinera les changements de code en conjonction avec l'auteur de la modification. L'examinateur va passer par les changements s'assurer que les changements compréhensible et suffisamment couverts par des tests. Ainsi, le processus de révision est Manuel, Mais lorsque les tests (tests d'unité et d'intégration et éventuellement tests d'acceptation par l'utilisateur) passent ce processus de révision manuelle, ils deviennent partie intégrante du processus de construction automatique. Ceux-ci sont exécutés chaque fois qu'un changement est enregistré. A d'intégration continue réalise cette tâche dans le cadre du processus de construction.

Tests qui sont lancés automatiquement, maintenir l'intégrité du comportement du code et aider à empêcher les changements futurs à la base de code de briser le code .

enfin, fournir des tests vous permet d'agressivement code de re-facteur parce que vous pouvez faire de grandes améliorations de code en toute sécurité dans la connaissance que vos modifications ne cassent pas les tests existants.

il y a une mise en garde à Test Driven Development et c'est que vous devez écrire du code avec un oeil pour le rendre testable. Cela implique le codage vers des interfaces et l'utilisation de techniques telles que L'Injection de dépendances pour instancier des objets collaborateurs. Découvrez le travail de Kent Beck qui décrit très bien TDD. Rechercher codage aux interfaces et étudier

48
répondu Rob Kielty 2017-08-11 06:36:16

quand vous testez en utilisant quelque chose comme le système.dehors, vous testez seulement un petit sous-ensemble de cas d'utilisation possible. Ce n'est pas très approfondi lorsque vous avez affaire à des systèmes qui pourraient accepter une quantité presque infinie de différentes entrées.

tests unitaires sont conçus pour vous permettre d'exécuter rapidement des tests sur votre application en utilisant un ensemble très large et diversifié de différentes entrées de données. De plus, les meilleurs tests unitaires tiennent également compte des cas limites, comme les entrées de données. qui se trouvent à la limite de ce qui est considéré comme valable.

pour un être humain tester toutes ces différentes entrées pourrait prendre des semaines alors que cela pourrait prendre des minutes pour une machine.

pensez-y comme ceci: vous n'êtes pas non plus en train de "tester" quelque chose qui sera statique. Votre application est très probablement en constante évolution. Par conséquent, ces tests unitaires sont conçus pour fonctionner à différents points du cycle de compilation ou de déploiement. Peut-être le plus grand avantage:

si vous cassez quelque chose dans votre code, vous le saurez maintenant , pas après votre déploiement, pas quand un testeur D'Assurance Qualité détecte un bug, pas quand vos clients ont annulé. Vous aurez également une meilleure chance de réparer le bug immédiatement , car il est clair que la chose qui a cassé la partie du code en question a très probablement eu lieu depuis votre dernière compilation. Ainsi, la quantité de travail d'investigation pour fixer le problème est considérablement réduit.

11
répondu jmort253 2012-06-02 01:02:48
Les essais unitaires

garantissent que le code fonctionne comme prévu. Ils sont également très utiles pour s'assurer que le code fonctionne toujours comme prévu au cas où vous auriez à le modifier plus tard pour construire de nouvelles fonctionnalités pour corriger un bogue. Avoir une couverture de test élevée de votre code vous permet de continuer à développer des fonctionnalités sans avoir à effectuer beaucoup de tests manuels.

votre approche manuelle par System.out est bonne mais pas la meilleure.C'est un test que vous effectuez une fois. Dans la vraie monde, les besoins évoluent et la plupart du temps, vous faites beaucoup de modificaiotns aux fonctions existantes et des classes. Donc ... pas à chaque fois que vous testez le morceau de code déjà écrit.

Il ya aussi quelques fonctionnalités plus avancées sont en JUnit comme comme

d'Affirmer états

JUnit fournit des méthodes pour tester pour certaines conditions, ces méthodes commencent généralement par des affirmations et vous permettent de spécifier l'erreur message, l'attendu et le résultat réel

certaines de ces méthodes sont

  1. fail([message]) - laisse le test échouer. Peut être utilisé pour vérifier qu'une certaine partie du code n'est pas atteint. Ou d'avoir un test d'échec avant que le code de test ne soit implémenté.
  2. assertTrue(true) / assertTrue(false) - Sera toujours vrai / faux. Peut être utilisé pour prédéfini un résultat d'essai, si l'essai n'est pas encore mis en œuvre.
  3. assertTrue([message,] condition) - Vérifie que le booléen condition est vrai.
  4. assertEquals([message,] expected, actual) - essais si deux valeurs sont égales (selon la méthode equals si elle est appliquée, autrement en utilisant la comparaison de référence == ). Remarque: Pour les tableaux, c'est la référence qui est vérifié, et pas le contenu, utilisez assertArrayEquals([message,] expected, actual) pour que.
  5. assertEquals([message,] expected, actual, delta) - essais visant à déterminer si deux valeurs flottantes ou doubles se trouvent dans un distance entre eux, contrôlée par la valeur delta .
  6. assertNull([message,] object) - vérifie que l'objet est nul

et ainsi de suite. Voir le Javadoc complet pour tous les exemples ici .

Suites

avec les suites de Test, vous pouvez dans un sens combiner plusieurs classes de test en une seule unité de sorte que vous pouvez les exécuter tous en même temps. Un exemple simple, combinant les classes d'essai MyClassTest et MySecondClassTest en une Suite appelée AllTests :

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({ MyClassTest.class, MySecondClassTest.class })
public class AllTests { } 
9
répondu Arvind 2017-02-21 20:07:28

j'ai ajouté un autre Système.out ne peut pas faire:

  • Faire de chaque cas de test indépendant (C'est important)

    JUnit peut le faire: chaque fois qu'une nouvelle instance de test sera créée et @Before appelé.

  • code D'essai séparé de la source

    JUnit peut le faire.

  • intégration avec CI

    JUnit peut le faire avec Ant et Maven.

  • arranger et combiner facilement les caisses d'essai

    JUnit peut le faire @Ignore et de la suite de test.

  • résultat facile à vérifier

    JUnit propose de nombreuses méthodes D'assertion ( assertEquals , assertSame )...)

  • Mock and stub vous font vous concentrer sur le module de test.

    JUnit peut le faire: en utilisant mock et stub, vous pouvez configurer correctement le montage et vous concentrer sur la logique du module de test.

8
répondu 卢声远 Shengyuan Lu 2012-06-03 00:51:19

Le principal avantage de JUnit est qu'il est automatisé plutôt que manuellement, vous avoir à vérifier avec vos impressions. Chaque test que vous écrivez reste dans votre système. Cela signifie que si vous effectuez un changement qui a un effet secondaire inattendu, votre test l'attrapera et échouera plutôt que de devoir vous rappeler de tout tester manuellement après chaque changement.

6
répondu n00begon 2012-06-02 00:56:44

JUnit est un framework de test pour le langage de programmation Java. Il est important dans le développement piloté par les tests, et est l'un d'une famille de tests unitaires cadres collectivement connus comme xUnit.

JUnit promeut l'idée de "tester d'abord puis coder", qui met l'accent sur la mise en place des données de test pour un morceau de code qui peut être testé d'abord et ensuite peut être mis en œuvre . Cette approche est comme " tester un peu, coder un peu, tester un peu, coder un peu..." ce qui augmente la productivité du programmeur et la stabilité du code de programme qui réduit le stress du programmeur et le temps passé sur le débogage.

Features JUnit est un framework open source qui est utilisé pour écrire et exécuter des tests.

fournit une Annotation pour identifier les méthodes d'essai.

fournit des Assertions pour tester les résultats attendus.

fournit des patins d'essai pour les essais de course.

Les tests JUnit vous permettent d'écrire du code plus rapidement, ce qui augmente la qualité

JUnit est élégamment simple. Il est moins complexe et prend moins de temps.

les tests JUnit peuvent être exécutés automatiquement et ils vérifient leurs propres résultats et fournissent une rétroaction immédiate. Il n'est pas nécessaire de passer au peigne fin un rapport des résultats d'essai.

Les tests

peuvent être organisés en suites de test contenant des cas de test et même d'autres suites de test.

Junit montre la progression du test dans une barre qui est verte si le test va bien et il devient rouge quand un test échoue.

4
répondu AKKI 2013-02-13 09:59:27

J'ai une perspective légèrement différente de la raison pour laquelle JUnit est nécessaire.

vous pouvez en fait écrire tous les cas de test vous-même, mais il est lourd. Voici les problèmes:

  1. au lieu de System.out nous pouvons ajouter if(value1.equals(value2)) et retourner 0 ou -1 ou message d'erreur. Dans ce cas, nous avons besoin d'une classe de test "principale" qui exécute toutes ces méthodes et vérifie les résultats et maintient les cas de test qui ont échoué et qui sont réussis.

  2. si vous voulez ajouter d'autres tests, vous devez les ajouter à cette classe de test "principale" ainsi. Modifications au code existant. Si vous voulez auto-détecter les cas de test des classes de test, alors vous devez utiliser la réflexion.

  3. tous vos tests et votre classe principale pour exécuter des tests ne sont pas détectés par eclipse et vous devez écrire des configurations de débogage/exécution personnalisées pour exécuter ces tests. Vous ne voyez toujours pas ces jolis verts / rouges couleur de sorties.

voici ce que fait JUnit:

  1. Il a assertXXX() méthodes qui sont utiles pour l'impression des messages d'erreur utiles dans les conditions et à communiquer les résultats à la classe "main".

  2. classe "main" est appelé coureur qui est fourni par JUnit, de sorte que nous n'avons pas à écrire. Et il détecte automatiquement les méthodes d'essai par réflexion. Si vous ajoutez de nouveaux tests avec l'annotation @Test , alors ils sont automatiquement détectés.

  3. Jun a l'intégration eclipse et l'intégration Maven/gradle aussi, il est donc facile d'exécuter des tests et vous n'aurez pas à écrire des configurations d'exécution personnalisées.

Je ne suis pas un expert en JUnit, donc c'est ce que j'ai compris maintenant, va ajouter plus à l'avenir.

2
répondu Sreekar 2016-06-27 15:41:36

vous ne pouvez pas écrire n'importe quel cas d'essai sans utiliser le cadre d'essai ou autrement vous devrez écrire votre cadre d'essai pour donner justice à vos cas d'essai. Voici quelques informations sur le Framework JUnit à part que vous pouvez utiliser le framework TestNG .

Qu'est-ce que Junit?

Junit est largement utilisé cadre de test ainsi que le langage de programmation Java. Vous pouvez utiliser ce cadre d'automatisation pour tester les unités et L'interface utilisateur.Il nous aide à définir flux d'exécution de notre code avec différentes Annotations. Junit est construit sur l'idée de "tester d'abord puis coder" ce qui nous aide à augmenter la productivité des cas de test et la stabilité du code.

Caractéristiques Importantes de Junit Test -

  1. Il est open source du framework de test permettant aux utilisateurs d'écrire et d'exécuter des cas de test de manière efficace.
  2. fournit divers types d'annotations pour identifier les méthodes d'essai.
  3. fournit différents types d'Assertions pour vérifier les résultats de l'exécution de cas test.
  4. il donne également des coureurs d'essai pour exécuter des essais efficacement.
  5. il est très simple et donc économise du temps.
  6. il fournit des moyens d'organiser vos cas de test sous forme de combinaisons de test.
  7. il donne des résultats de cas d'essai de manière simple et élégante.
  8. vous pouvez intégrer jUnit avec Eclipse, Android Studio, Maven & Ant, Gradle et Jenkins
1
répondu anuja jain 2017-09-08 16:31:55

JUNIT est la méthode généralement acceptée par java developer. Lorsqu'ils peuvent fournir des données attendues similaires à la fonction et décider en conséquence que le code écrit est parfaitement écrit ou si le test case échoue, alors une approche différente peut également devoir mettre en œuvre. JUNIT va faire du développement rapide et va assurer les 0 défauts dans la fonction.

0
répondu mohit sarsar 2014-09-16 11:21:11

JUNIT : OBSERVER ET AJUSTER

Voici mon point de vue sur JUNIT.

JUNIT peut être utilisé pour,

1) observer le comportement d'un système lorsqu'une nouvelle unité est ajoutée dans ce système.

2) Faire des ajustements dans le système pour accueillir la "nouvelle" unité dans le système.

Quoi? Exactement.

"151900920 la" Vraie vie, par exemple.

quand votre parent visite votre chambre d'auberge de collège,

1) Vous fera semblant d'être plus responsables.

2) vous garderez toutes choses là où elles devraient être, comme des chaussures dans un porte-chaussures pas sur une chaise, des vêtements dans un placard pas sur une chaise.

3) vous vous débarrasserez de toute la contrebande.

4) vous commencerez le nettoyage dans chaque appareil que vous possédez.

En termes de programmation

Système: votre code

Unité: nouvelle fonctionnalité.

Comme JUNIT framework est utilisé pour le langage JAVA, JUNIT = JAVA UNIT (peut être).

supposons que vous avez déjà un code bien à l'épreuve des balles, mais une nouvelle exigence est venue et vous devez ajouter la nouvelle exigence dans votre code. Cette nouvelle exigence peut briser votre code pour certaines entrées (testcase).

voie Facile pour adapter ce changement, on utilise l'unité testing (JUNIT).

Pour cela, vous devez écrire plusieurs testcases pour votre code lorsque vous construisez votre codebase. Et chaque fois qu'une nouvelle exigence d'entrée que vous venez d'exécuter les cas de test pour voir si un test échoue. Si non, vous êtes un artiste BadA** et vous êtes prêt à déployer le nouveau code.

Si l'une des testcases échoue, vous changez votre code et lancez de nouveau testcases jusqu'à ce que vous obteniez le statut Vert.

0
répondu Rohit Singh 2017-08-23 07:31:08