L'autre jour, j'ai participé pour la première fois à l'événement développeur de Microsoft de: code2017. Il était très intéressant d'entendre parler d'un large éventail de thèmes, tels que la gestion et la modification des sites de développement hérités à partir des dernières tendances technologiques.
Parmi eux, le développement piloté par les tests du problème ** FizzBuzz, qui a fait l'objet d'un codage en direct pour la session Développement piloté par les tests DO03 en 50 minutes Le développement ** était très impressionnant.
Alors, qu'est-ce qu'un test (test unitaire) en premier lieu? En regardant en arrière, j'ai essayé de le pratiquer à ma manière.
Comme il semble que ce sera plus long si vous suivez le contenu de la pratique dans l'ordre, je le posterai en deux parties, ** Préparation ** et ** Pratique **. Cette fois, c'est la ** préparation **.
Un test unitaire est un test pour vérifier si un programme fonctionne selon les spécifications en petites unités telles que les classes et les méthodes.
Il existe trois types principaux:
Il semble y avoir une idée que les tests unitaires sont inutiles [^ 1], mais j'estime que c'est nécessaire dans les points suivants.
Construisez la qualité des petites pièces vers le haut.
Facilite la vérification du fonctionnement après la refactorisation et les changements de spécifications et améliore la maintenabilité du système.
C'est une méthode de développement qui répète les trois cycles suivants pour chaque fonction de la spécification.
Dans le framework xUnit, ce cycle est décrit à partir de la couleur de l'affichage de la barre lorsque le test échoue / réussit. RED </ font> - GREEN </ font> --REFACTOR Aussi appelé.
Le choix réel du développement piloté par les tests dépend de la situation du projet, mais je pense que les avantages suivants s'appliquent à n'importe quel projet.
Maintenant, préparons-nous pour ** le développement piloté par les tests du problème FizzBuzz **.
Type | Material | Version |
---|---|---|
Language | Java (JDK) | 1.8.0_111 |
IDE | Spring Tool Suite | 3.8.2 |
Build | Maven | 3.3.9 |
Test | JUnit | 4.12 |
Suivez les étapes ci-dessous pour créer un projet.
Assurez-vous que pom.xml est créé directement sous le projet créé.
Ensuite, ajoutez les paramètres suivants à pom.xml pour utiliser JUnit.
pom.xml
<!--Extrait uniquement pour les pièces connexes-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
Si la version de la bibliothèque JRE n'est pas 1.8, ajoutez le paramètre maven-compiler-plugin à pom.xml.
pom.xml
<!--Extrait uniquement pour les pièces connexes-->
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
Maintenant que l'environnement est en place, il est temps de définir les exigences à mettre en œuvre.
Écrivez un programme qui imprime des nombres de 1 à 100. Cependant, s'il s'agit d'un multiple de 3, imprimez «Fizz» au lieu d'un nombre, s'il s'agit d'un multiple de 5, imprimez «Buzz», et s'il s'agit d'un multiple de 3 et 5, imprimez «Fizz Buzz».
Il semble que c'était à l'origine un jeu de langue anglaise.
À partir du problème ci-dessus, nous allons extraire les mots-clés, diviser les exigences et définir la partie implémentation.
Extrayez la partie correspondant à la commande ou à la condition sous forme de mot-clé.
A partir des mots-clés, définissez la partie à implémenter dans la classe testée. Ici, la fonction à imprimer est laissée à l'appelant de la classe FizzBuzz, et la classe FizzBuzz a la fonction de renvoyer la chaîne de caractères que l'appelant veut imprimer.
Avec laquelle des fonctionnalités ci-dessus voulez-vous commencer, même si vous excluez l'entrée de classe et quittez "prendre un nombre" et "renvoyer une chaîne"? Je pense que la question demeure. Je pense que cela dépend de l'heure et du cas, mais j'ai décidé de l'ordre des fonctions suivantes. [^ 2]
Nous allons donc tester et développer la classe FizzBuzz, qui prend un nombre comme argument et renvoie une chaîne de caractères, dans l'ordre suivant.
Tout d'abord, j'aimerais écrire du code de test ... mais avant cela, je dois confirmer que JUnit est correctement installé.
Plus précisément, préparez la classe de test FizzBuzzTest.java, écrivez un programme de test vide et exécutez le test.
Tout d'abord, préparez la classe de test selon la procédure suivante.
La structure du projet après la création de FizzBuzzTest.java est la suivante.
Ensuite, implémentez une méthode de test vide qui ne fait rien dans le FizzBuzzTest.java créé.
FizzBuzzTest.java
import org.junit.Test;
public class FizzBuzzTest {
@Test
test de fonctionnement public void JUnit() {
}
}
Placez le curseur sur la méthode de test d'opération JUnit de la classe FizzBuzzTest que vous avez créée et cliquez avec le bouton droit sur -> Exécuter en tant que -> Test JUnit pour exécuter le test.
Ensuite, vous verrez une barre verte indiquant que le test a réussi, comme indiqué dans la figure ci-dessous.
À partir de là, vous pouvez voir que JUnit fonctionne par défaut et est prêt à utiliser JUnit. Inversement, si le test échoue, vous pouvez découvrir des failles dans l'environnement de test, par exemple, l'installation de Maven a échoué.
Maintenant que vous avez confirmé que JUnit fonctionne correctement, la ** Préparation ** est terminée.
Ici, je publierai la structure finale du projet et le contenu du programme en disant "La conclusion vient en premier". [^ 3]
FizzBuzzTest.java
package com.example;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
@RunWith(Enclosed.class)
public class FizzBuzzTest {
L'argument de classe statique publique n'est pas un multiple de 3 et 5{
FizzBuzz fizzbuzz = new FizzBuzz();
@Test
public void Renvoie 1 si 1 est donné comme argument() {
assertEquals("1", fizzbuzz.response(1));
}
}
public static class Un multiple de 3 avec seulement 3 arguments{
FizzBuzz fizzbuzz = new FizzBuzz();
@Test
public void Renvoie Fizz avec 3 arguments() {
assertEquals("Fizz", fizzbuzz.response(3));
}
}
public static class Un multiple de 5 avec seulement 5 arguments{
FizzBuzz fizzbuzz = new FizzBuzz();
@Test
public void Renvoie Buzz avec 5 arguments() {
assertEquals("Buzz", fizzbuzz.response(5));
}
}
public static class Les arguments sont des multiples de 3 et 5{
FizzBuzz fizzbuzz = new FizzBuzz();
@Test
public void Renvoie FizzBuzz avec 15 arguments() {
assertEquals("FizzBuzz", fizzbuzz.response(15));
}
}
l'argument de classe statique public est une valeur limite valide{
FizzBuzz fizzbuzz = new FizzBuzz();
@Test
public void Renvoie 1 si l'argument 1 est donné() {
assertEquals("1", fizzbuzz.response(1));
}
@Test
public void Renvoie Buzz avec 100 arguments() {
assertEquals("Buzz", fizzbuzz.response(100));
}
}
L'argument de classe statique public n'est pas valide. Valeur limite{
FizzBuzz fizzbuzz = new FizzBuzz();
@Test(expected = IndexOutOfBoundsException.class)
public void Une erreur se produit si l'argument 0 est donné.() {
fizzbuzz.response(0);
}
@Test(expected = IndexOutOfBoundsException.class)
une erreur public void se produit si l'argument 101 est donné() {
fizzbuzz.response(101);
}
}
}
FizzBuzz.java
public class FizzBuzz {
public String response(int num) {
StringBuilder result = new StringBuilder();
if(num < 1 || num > 100) {
throw new IndexOutOfBoundsException();
}
if(num % 3 == 0) {
result.append("Fizz");
}
if(num % 5 == 0) {
result.append("Buzz");
}
if(result.length() == 0) {
result.append(String.valueOf(num));
}
return result.toString();
}
}
La prochaine fois, je voudrais publier en tant que ** Practice ** comment j'ai procédé à l'implémentation de la classe de test suivante (FizzBuzzTest.java) et de la classe cible de test (FizzBuzz.java).
[Amazon \ .co \ .jp: [Comprendre dans ce livre] Manuel de test de logiciel - Principes de base et pratique du processus de test qui détermine la qualité eBook: Kazuhiro Ishihara, Hidekazu Tanaka, Masashi Tanaka: Boutique Kindle](https :: //www.amazon.co.jp/%E3%80%90%E3%81%93%E3%81%AE1%E5%86%8A%E3%81%A7%E3%82%88%E3%81 % 8F% E3% 82% 8F% E3% 81% 8B% E3% 82% 8B% E3% 80% 91% E3% 82% BD% E3% 83% 95% E3% 83% 88% E3% 82% A6 % E3% 82% A7% E3% 82% A2% E3% 83% 86% E3% 82% B9% E3% 83% 88% E3% 81% AE% E6% 95% 99% E7% A7% 91% E6 % 9B% B8_% E5% 93% 81% E8% B3% AA% E3% 82% 92% E6% B1% BA% E5% AE% 9A% E3% 81% A5% E3% 81% 91% E3% 82 % 8B% E3% 83% 86% E3% 82% B9% E3% 83% 88% E5% B7% A5% E7% A8% 8B% E3% 81% AE% E5% 9F% BA% E6% 9C% AC % E3% 81% A8% E5% AE% 9F% E8% B7% B5-% E7% 9F% B3% E5% 8E% 9F-% E4% B8% 80% E5% AE% 8F-ebook / dp / B00U17809A / ref = sr_1_1? ie = UTF8 & qid = 1496770784 & sr = 8-1 & keywords =% E3% 82% BD% E3% 83% 95% E3% 83% 88% E3% 82% A6% E3% 82% A7% E3% 82% A2% E3% 83% 86% E3% 82% B9% E3% 83% 88% E3% 81% AE% E6% 95% 99% E7% A7% 91% E6% 9B% B8)
Développement piloté par les tests en 50 minutes / TDD Live en 50 minutes // Speaker Deck
[^ 1]: Je n'ai lu que le résumé, mais l'histoire originale est [Why \ -Most \ -Unit \ -Testing \ -is \ -Waste \ .pdf](http://rbcs-us.com/ documents / Pourquoi la plupart des tests unitaires sont des déchets.pdf) Il est écrit.
[^ 2]: par exemple, dans un système de réservation de films qui propose plusieurs options de remise en fonction des caractéristiques de l'utilisateur, si l'exigence finale est "appliquer l'option qui augmente le taux de remise", alors à partir de la condition caractéristique de l'utilisateur que le taux de remise est élevé Je vais le tester.
[^ 3]: Il y a quelques différences par rapport au codage en direct de de: code auquel j'ai fait référence parce que c'était le résultat de ma propre pratique et que certaines parties ont été omises dans de: code en raison de contraintes de temps.
Recommended Posts