Avez-vous déjà entendu la phrase «Pour étudier quelque chose, il vaut mieux le faire»? Même si j'ai utilisé JUnit pour les affaires, je ne savais pas comment il était fabriqué. Depuis que j'ai quitté l'entreprise et que je suis en train de changer d'emploi, j'ai du temps, j'ai donc décidé de créer ma propre version de JUnit.
J'ai recherché le code source de JUnit, mais je n'ai trouvé que JUnit4 et JUnit5. (Autre que officiel, il existe d'autres que JUnit4 et JUnit5.) Il y a deux répertoires sous `` `junit4 / src / main / java / '' du code source JUnit4.
En regardant à l'intérieur, il semble que différentes sources soient stockées. Pour le moment, j'ai décidé de parler de `` junit ''. La raison en est la suivante.
Au début, j'ai lu la source de junit un par un, mais pour les raisons suivantes, je viens de saisir le flux principal.
JUnit est exécuté selon le flux suivant. Si vous l'utilisez pour les affaires, l'environnement de développement intégré le fera bien. Pour plus de détails, veuillez consulter la [Page officielle] de JUnit (https://junit.org/junit4/).
L'explication de la création d'une classe de test et de la compilation d'une classe de test est omise.
Exécutez une commande comme celle ci-dessous.
java -cp Une classe qui exécute les tests de bibliothèque requis(Junit pour JUnit3.textui.TestRunner)Classe testée
L'important est de spécifier la classe pour exécuter le test et la classe à tester.
Comment JUnit fait-il le travail? Existe-t-il un mécanisme spécial? L'essentiel est que vous ne faites rien de difficile, vous utilisez simplement Reflection.
Vous savez que cette classe est le point d'entrée car vous avez une classe qui exécute les tests.
Si vous regardez réellement junit4 / src / main / java / junit / textui / TestRunner.java '', il existe une méthode
main () ''. Donc junit lit simplement la méthode
main () ''. Je ne fais rien de spécial.
Maintenant que vous connaissez le point d'entrée, comment exécutez-vous la méthode de test? Diverses méthodes sont appelées à partir de la méthode `` main () '' plus tôt, mais celles qui exécutent réellement les méthodes sont les suivantes.
junit4/src/main/java/junit/framework/TestCase.java runTest()Méthode
En regardant le contenu, c'est juste `` method.invoke () ''. (la méthode est le type de méthode) C'est une caractéristique de Reflection.
En termes simples, Reflection est une fonctionnalité qui vous permet de lire et d'exécuter les informations de classe et de méthode au moment de l'exécution. C'était il y a longtemps, mais c'était célèbre comme magie noire. L'avantage de Reflection est que vous avez la flexibilité de travailler avec des classes et des méthodes. L'inconvénient est le revers de l'avantage. La vitesse d'exécution est lente car la machine virtuelle Java doit collecter des informations lors de l'exécution. Vous pouvez également exécuter des méthodes privées, donc si vous ne l'utilisez pas correctement, ce sera erratique.
J'ai les connaissances minimales nécessaires pour essayer de créer JUnit ci-dessus. J'ai pensé à la classe dont j'avais besoin, en supposant qu'elle offrirait la fonctionnalité minimale.
--Assert (fournit assertEquals) --TestResult (maintenir le résultat du test) --TestRunner (point d'entrée) --TestCase (super classe de classe de test)
Voir GitHub. Actuellement, la structure des classes est légèrement différente.
Les bons points à essayer sont les suivants.
Recommended Posts