J'ai toujours voulu présenter JUnit pour l'éducation des nouveaux arrivants, mais c'est un article décevant auquel j'ai abandonné car il est devenu un petit volume lorsque j'écrivais un brouillon. C'est un gaspillage de le jeter tel quel, donc l'entreprise est également en vacances d'été et pour les nouveaux arrivants.
JUnit est un outil couramment utilisé dans ce que l'on appelle communément les tests unitaires. JUnit est un logiciel qui vous permet d'exécuter la méthode à tout moment en créant une classe avec une méthode qui décrit comment l'utiliser et la vérifier. Lors de l'exécution de JUnit, écrivez des classes et des méthodes selon le style JUnit.
Le flux de base de JUnit est
--Exécuter en fonction de "Comment utiliser la fonction" --Vérifier les "résultats de l'utilisation de cette fonction"
Sera.
Par exemple, supposons que vous ayez une classe de panier (Cart
). Supposons que vous ayez une méthode appelée getSum ()
qui obtient le prix total qui reflète le prix et la quantité de tous les articles de votre panier.
L'utilisation est comme ça.
Cart cart = new Cart();
cart.add(Produit,Quantité);
int result = cart.getSum(); //Vous pouvez obtenir le montant total actuel dans le panier
assertEquals(Montant qui aurait dû être, result); //Vérifiez si le montant acquis est le montant attendu
** ʻassert Equals fait partie de la validation. ** ** ** Si les arguments sont différents ici, le processus de test s'arrêtera là. ** ** ** Le test sera également "échoué". Après avoir passé ʻassertEquals
et être allé à la fin, le test sera réussi
. ** **
Vous pouvez écrire plusieurs «Assert Equals». Par exemple, si vous souhaitez définir plusieurs paramètres dans le test du constructeur et vérifier s'ils sont correctement définis, ce sera comme suit.
Product apple = new Product("Pomme", 400); // appleという変数にPommeという商品名と400円を設定している
assertEquals("Pomme", apple.getName()); //Vérifiez si le nom a été défini correctement
assertEquals(400, apple.getPrice()); //Vérifiez si le prix a été réglé correctement
C'est comme ça. Le test réussit si vous réussissez les deux «Assert Equals».
Les ** classes ci-dessous sont les classes à tester **.
Product.java
public class Product {
private String productId; //Numéro d'article
private String productName; //Nom du produit
private Integer price; //prix
// getter
public String getProductId() { return productId; }
public String getProductName() { return productName; }
public Integer getPrice() { return price; }
//constructeur
public Product(Numéro d'article de chaîne,String Nom du produit,Prix entier) { /*Définissez les propriétés ci-dessus*/ }
}
Cart.Java
public class Cart {
//Propriété
private List<Product> list; //Produits inclus et leur nombre
//Méthode
/**
*Effectuer le processus d'ajout d'un produit
*/
public void add(Produit Produit) { /*Abréviation*/ }
/**
*Traitement pour retourner les produits contenus et leur quantité
*/
public List<Product> getList() { /*Abréviation*/ }
/**
*Traitement pour retourner le total des produits contenus
*/
public int getSum() { /*Abréviation*/ }
}
Product.java
public class Product {
private String productId; //Numéro d'article
private String productName; //Nom du produit
private Integer price; //prix
public Product(String productId, String productName, Integer price) {
this.productId = productId;
this.productName = productName;
this.price = price;
}
public String getProductId() {
return productId;
}
public String getProductName() {
return productName;
}
public Integer getPrice() {
return price;
}
}
Cart.java
import java.util.List;
import java.util.ArrayList;
public class Cart {
//Propriété
private List<Product> list; //Produits inclus et leur nombre
public Cart() {
this.list = new ArrayList<Product>();
}
//Méthode
/**
*Effectuer le processus d'ajout d'un produit
*/
public void add(Product product) {
this.list.add(product);
}
/**
*Traitement pour retourner les produits contenus et leur quantité
*/
public List<Product> getList() {
return this.list;
}
/**
*Traitement pour retourner le total des produits contenus
*/
public int getSum() {
int sum = 0;
for (Product p: this.list) {
sum += p.getPrice();
}
return sum;
}
}
Ici, je voudrais tester ajouter. Dans ce cas, j'ai pensé au flux suivant
Comment utiliser 0. Créez un produit à ajouter au panier
Pour vérifier si add est correct avec l'utilisation ci-dessus, j'ai pensé comme suit (** Remarque: Ceci est un exemple. Il n'est pas toujours nécessaire d'effectuer le test suivant avec un test similaire **) 0. Retirer la liste du panier (il s'agit d'une étape préparatoire et n'entrera pas dans le test)
Le code de test ci-dessus ressemblerait à ceci
// 0.Créer un produit à ajouter au panier
Product apple = new Product("A001", "Pomme", 158);
Product orange = new Product("A002", "Orange", 258);
// 1.Créer un panier
Cart cart = new Cart();
//Articles dans le panier(Pomme et orange)Ajouter
cart.add(apple);
cart.add(orange);
//Vérifier ici
// 0.Retirer la liste du panier
List<Product> list = cart.getList(); //Obtenez la liste dans le panier
// 1.Le nombre d'articles de la liste ajoutés au panier(2 pièces)Vérifiez si c'est le même que
assertEquals(2, list.size());
// 2.Vérifiez dans l'ordre si les articles du panier sont corrects
Product item;
// 2.1 Vérifiez si le premier produit est le même que celui défini par apple
item= list.get(0); //Sortez le premier article du panier
assertEquals("A001", item.getProductId()); //Vérification de l'ID produit du produit extrait
assertEquals("Pomme", item.getProductName()); //Vérification du nom de produit du produit extrait
assertEquals((Integer)158, item.getPrice()); //Vérification du nom de produit du produit extrait
// 2.1 Vérifiez si le deuxième produit est le même que celui défini en orange
item = list.get(1); //Retirez le deuxième article du panier et lancez la vérification
assertEquals("A002", item.getProductId()); //Vérification de l'ID produit du produit extrait
assertEquals("Orange", item.getProductName()); //Vérification du nom de produit du produit extrait
assertEquals((Integer)258, item.getPrice()); //Vérification du nom de produit du produit extrait
Au fait, la partie écrite avec «" A001 "» etc. peut être «apple.getProductName ()».
Comme je l'ai écrit au début, le flux de JUnit est
--Exécuter en fonction de "Comment utiliser la fonction" --Vérifier les "résultats de l'utilisation de cette fonction"
Est la base. Sa validation est validée avec une méthode commençant par ʻassert, telle que ʻassertEquals
.
Et ** assertEquals échouera ** si les deux arguments ne sont pas les mêmes, et aucun autre traitement ne sera effectué **.
Par exemple
ʻAssert Equals ("pomme", item.getProductName ()); Si «pomme» devient «pomme», ce sera un échec, et après cela
assertEquals((Integer)158, item.getPrice());`
Etc. ne sera pas implémenté.
Et si toutes les affirmations égales sont passées et que le processus se poursuit jusqu'à la fin, ce sera un succès.
De plus, écrivez * ʻassertXXX (expect, actual) `dans l'ordre de la valeur correcte et de la valeur de test *.
Bien qu'il soit édité pour Eclipse, l'original est pleiades. Au fait, j'étais épuisé avec ça seul ... Si vous avez l'énergie, j'ajouterai un jour VS Code, etc. Lors de l'exécution de JUnit dans Eclipse, procédez comme suit:
Sélectionnez le menu Fichier → Nouveau → Dossier source.
Entrez "test" dans "Nom du dossier:" sur l'écran suivant et cliquez sur "Terminer".
Cliquez avec le bouton droit sur le dossier de test que vous venez de vérifier ou de créer et sélectionnez Nouveau> Autre.
Un nouvel écran s'affiche. Sélectionnez "Java" -> "JUnit" -> "JUnit Test Case" puis sélectionnez "Next". Vous pouvez également saisir "junit" dans le champ de l'assistant en haut du nouvel écran. Sélectionnez "JUnit Test Case" parmi les autres, puis sélectionnez "Next".
Le suivant dépend de JUnit 3, 4 ou 5. Utilisez 4 ou 5 si vous n'avez aucune inquiétude concernant l'éducation des nouveaux arrivants. Sélectionnez 3 si vous êtes dans une situation décevante où vous êtes affecté à 3. Malheureusement, 5 seront inclus dans 4. Je n'ai pas eu assez de temps ...
Il n'y a pas de bibliothèque pour JUnit3 au début, il vous sera donc demandé si vous voulez l'ajouter. Sélectionnez "Effectuer l'action suivante", sélectionnez "Ajouter la bibliothèque JUnit 3 au chemin de construction" et appuyez sur OK.
CartTest.java
package myStore;
import junit.framework.TestCase;
import java.util.List;
public class CartTest extends TestCase {
public void test Vérifier s'il a été ajouté au panier() {
//Faites d'abord les produits à introduire pour le test
Product apple = new Product("A001", "Pomme", 158);
Product orange = new Product("A002", "Orange", 258);
//Créer un panier
Cart cart = new Cart();
//Ajouter des pommes et des oranges
cart.add(apple);
cart.add(orange);
//Vérifier ici
List<Product> list = cart.getList(); //Obtenez la liste dans le panier
//Vérifiez si le panier contient deux
assertEquals(2, list.size());
//Vérifiez si le contenu du panier est correct
Product item;
item= list.get(0); //Retirez le premier article du panier et lancez la vérification
assertEquals("Vérification que le premier ID de produit dans le panier est A001", "A001", item.getProductId());
assertEquals("Vérification que le premier nom de produit dans le panier est apple", "Pomme", item.getProductName());
assertEquals("Vérification de savoir si le premier prix du panier est de 158", (Integer)158, item.getPrice());
item = list.get(1); //Retirez le deuxième article du panier et lancez la vérification
assertEquals("Vérification que le premier ID de produit dans le panier est A002", "A002", item.getProductId());
assertEquals("Vérification que le premier nom de produit dans le panier est orange", "Orange", item.getProductName());
assertEquals("Vérification que le premier prix du panier est de 258", (Integer)258, item.getPrice());
}
}
Les promesses de JUnit 3 sont les suivantes. --ʻImporter junit.framework.TestCase; `écrire
public void
et le nom commence par test
Créez selon les règles ci-dessus. Vous pouvez créer autant de méthodes de test que vous le souhaitez en commençant par test
, veuillez donc créer des tests avec différents modèles.
De plus, le nom de la méthode contient du japonais, ce qui n'est pas un problème pour Java (pas de problème en termes de spécifications). Dans JUnit, le japonais est souvent utilisé pour faciliter la compréhension du test en cours [^ 1]. N'est-ce pas plus facile à comprendre que d'écrire «testNo1»?
Vous pouvez également remarquer que le premier argument de assertEquals contient une chaîne, mais considérez-la comme un commentaire. Si vous laissez cela, lorsque vous testez avec JUnit, ce premier argument sera affiché sous forme de message et vous pourrez voir ce que le test prévu a échoué.
[^ 1]: Cependant, s'il y a un espace demi-largeur, une erreur se produira, alors choisissez un mot qui peut exprimer le test en un mot.
Il n'y a pas de bibliothèque pour JUnit 4 au début, il vous sera donc demandé si vous voulez l'ajouter. Sélectionnez "Effectuer l'action suivante", sélectionnez "Ajouter la bibliothèque JUnit 4 au chemin de construction" et appuyez sur OK.
CartTest2.java
package myStore;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import java.util.List;
import org.junit.Test;
public class CartTest {
@Test
public void Vérifier s'il a été ajouté au panier() {
//Faites d'abord les produits à introduire pour le test
Product apple = new Product("A001", "Pomme", 158);
Product orange = new Product("A002", "Orange", 258);
//Créer un panier
Cart cart = new Cart();
//Ajouter des pommes et des oranges
cart.add(apple);
cart.add(orange);
//Vérifier ici
List<Product> list = cart.getList(); //Obtenez la liste dans le panier
//Vérifiez si le panier contient deux
assertEquals(2, list.size());
//Vérifiez si le contenu du panier est correct
Product item;
item= list.get(0); //Sortez le premier article du panier
assertThat(item.getProductId(), is("A001")); //Vérification de l'ID produit du produit extrait
assertThat(item.getProductName(), is("Pomme")); //Vérification du nom de produit du produit extrait
assertThat(item.getPrice(), is(158)); //Vérification du nom de produit du produit extrait
item = list.get(1); //Retirez le deuxième article du panier et lancez la vérification
assertThat(item.getProductId(), is("A002")); //Vérification de l'ID produit du produit extrait
assertThat(item.getProductName(), is("Orange")); //Vérification du nom de produit du produit extrait
assertThat(item.getPrice(), is(258)); //Vérification du nom de produit du produit extrait
}
}
Les promesses de JUnit 4 sont les suivantes.
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.junit.Test;
public void
@ Test
avant la méthode de testCréez selon les règles ci-dessus. Vous pouvez créer autant de méthodes de test que vous le souhaitez en ajoutant @ Test
, veuillez donc créer des tests avec différents modèles.
De plus, le nom de la méthode contient du japonais, ce qui n'est pas un problème pour Java (pas de problème en termes de spécifications). Dans JUnit, le japonais est souvent utilisé pour faciliter la compréhension du test en cours [^ 1]. N'est-ce pas plus facile à comprendre que d'écrire «testNo1»?
Vous pouvez également remarquer que le premier argument de assertEquals contient une chaîne, mais considérez-la comme un commentaire. Si vous laissez cela, lorsque vous testez avec JUnit, ce premier argument sera affiché sous forme de message et vous pourrez voir ce que le test prévu a échoué.
CartTest.java
package myStore;
import static org.junit.Assert.*;
import org.junit.Test;
import java.util.List;
public class CartTest {
@Test
public void Vérifier s'il a été ajouté au panier() {
//Faites d'abord les produits à introduire pour le test
Product apple = new Product("A001", "Pomme", 158);
Product orange = new Product("A002", "Orange", 258);
//Créer un panier
Cart cart = new Cart();
//Ajouter des pommes et des oranges
cart.add(apple);
cart.add(orange);
//Vérifier ici
List<Product> list = cart.getList(); //Obtenez la liste dans le panier
//Vérifiez si le panier contient deux
assertEquals(2, list.size());
//Vérifiez si le contenu du panier est correct
Product item;
item= list.get(0); //Retirez le premier article du panier et lancez la vérification
assertEquals("Vérification que le premier ID de produit dans le panier est A001", "A001", item.getProductId());
assertEquals("Vérification que le premier nom de produit dans le panier est apple", "Pomme", item.getProductName());
assertEquals("Vérification de savoir si le premier prix du panier est de 158", (Integer)158, item.getPrice());
item = list.get(1); //Retirez le deuxième article du panier et lancez la vérification
assertEquals("Vérification que le deuxième ID de produit dans le panier est A002", "A002", item.getProductId());
assertEquals("Vérification que le deuxième nom de produit du panier est orange", "Orange", item.getProductName());
assertEquals("Vérification que le deuxième prix du panier est de 258", (Integer)258, item.getPrice());
}
}
J'ai utilisé «Assert Equals» au début, voici donc un cours supplémentaire. Dans JUnit 4, vous pouvez écrire comme suit. A partir de maintenant, ce sera le principal.
assertThat( target, is("target") );
C'est presque la même chose que «Assert Equals», mais cela a le gros avantage de pouvoir lire de gauche à droite. C'est comme affirmer que la cible est "cible" (vérifiez que la cible est "cible"). Vous pouvez également écrire comme ça. «Is» et «not» sont appelés Matchers.
assertThat( target, is( not( "not target") ) )
référence: Java Master - Introduction à l'utilisation de base de JUnit Comment utiliser JUnit (Débutant)
Exécutez le scénario de test créé. Sélectionnez le menu Exécuter → Exécuter → Test JUnit.
Ensuite, l'écran suivant apparaîtra quelque part sur l'écran.
Cliquez maintenant sur le triangle à gauche de myStore.CartTest. Vous pouvez voir quel test vous avez fait comme ci-dessous. Les tests réussis sont affichés en vert et les tests infructueux sont affichés en rouge.
Au fait, changeons "A001" sur la 28ème ligne du programme de test en "A003" et réessayons. Vous pouvez cliquer avec le bouton droit de la souris pour l'exécuter de la même manière qu'avant, mais si vous avez une vue JUnit, vous pouvez la réexécuter en appuyant sur "Ré-exécuter le test" (ligne rouge).
Le fichier ayant été modifié en changeant "A001" en "A003", une boîte de dialogue apparaîtra vous demandant si vous souhaitez l'enregistrer. S'il n'y a pas de problème, cliquez sur "OK". Si vous décochez la case à côté du nom du fichier, le programme sera exécuté avant que le fichier ne soit enregistré.
Ensuite, une croix outremer sera attachée en bas à gauche de l'icône. C'est un signe d'échec. Cliquez ensuite sur le test qui a échoué pour voir où il a échoué dans le cas de test. Double-cliquez dessus pour voir la ligne en question.
De plus, si vous regardez derrière le junit.framework.ComparisonFailure:
de la trace de l'échec, vous pouvez voir la description de "Il y a une confirmation que le premier ID produit du panier est A001" dans les détails de l'erreur. ..
De plus, la valeur correcte est affichée dans "Attendu: est" et la valeur réelle (résultat de l'exécution) est affichée dans "mais: était".
Eh bien, c'est une longue histoire, mais c'est tout.
JUnit a écrit que l'exécution et la vérification sont deux choses importantes. Parmi ceux-ci, je voudrais aborder la vérification. C'est super compliqué ici, vous pouvez donc l'ignorer. La validation consiste à vérifier si la valeur du résultat de l'exécution est la même que le résultat attendu, mais il existe une controverse sur ce qu'il faut valider. Il y a peut-être une réponse correcte, mais je ne sais pas (je sais @ t_wada-san ...).
Par exemple, supposons que vous ayez la classe suivante.
SomeClass.java
class SomeClass {
private String somethingvalue = "";
public void setSomethingValue(String somethingvalue) {
this.somethingvalue = somethingvalue;
}
}
Cette classe ne peut contenir que des données pour de futures extensions. Il y a un setSomethingValue
qui définit les données somethingvalue
à conserver. Cependant, il n'y a pas de getSomethingValue
pour obtenir la valeur de value
. Que dois-je faire avec ce test setSomethingValue
?
Ma réponse personnelle est «basée sur les directives et les spécifications du projet».
Tout d'abord, même s'il s'agit d'une variable privée (propriété), la valeur de value peut être connue en utilisant la fonction appelée reflet en Java. [^ 2]
En plus de cela, sur les projets et les spécifications
――Si le projet ou la spécification dit "mis à valeur", il est fort probable qu'il sera testé.
Je voudrais adopter cette dernière perspective, mais dans ce cas, il y a un problème quelque peu ennuyeux. Lors de l'ajout d'une méthode qui affiche à plusieurs reprises les valeurs suivantes pour le nombre de fois spécifié
public String repeatSpeak(int times) {
String result = "";
for (int i=0; i < times; i++) {
result += this.value;
}
return result;
}
Ce repeatSpeak
est une méthode publique (= supposée être utilisée par quelqu'un), donc elle sera testée. À ce stade, la valeur change en fonction de la «valeur». Donc, vous écririez également un test qui utilise setValue
pour changer valeur
.
Je pense qu'il est possible de tester indirectement plutôt que directement comme ça.
Il est nécessaire pour le développement de l'équipe d'avoir une ** perspective unifiée ** dans le projet basée sur des perspectives telles que «quoi», «comment» et «qui», alors comment le faire sur le lieu d'affectation, etc. Demandez si vous voulez tester. Si vous n'avez pas décidé, laissez les membres de l'équipe partager une perspective unifiée au début du développement.
[^ 2]: Référez-vous à ce qui suit pour réflexion: Samurai blog- [Introduction to Java] Exécution de méthodes et changement de champs avec réflexion, Hishidama Réflexion sur la page de la note technique,
Recommended Posts