Bonjour, je suis Negero.
J'ai été affecté à un projet de développement Java au premier semestre 2020, mais le code UT créé par les membres, y compris moi-même, était __chaos ici.
Par exemple -Test avec code mixte JUnit4 et JUnit5 -Un test qui appelle juste une méthode sans rien affirmer · Tests non reproductibles qui peuvent réussir ou non -Un test normal utilisant une simulation qui réussit, que le code d'état soit 200, 404 ou 500. etc···.
Ce PJ continuera son développement au second semestre pour implémenter des fonctions supplémentaires, mais je pense que ce n'est pas bon tel quel. J'ai décidé de faire un guide de test unitaire (?) Après avoir consulté les cadres supérieurs.
Dans cet article, nous publierons le guide.
Cependant, sachez qu'il s'agit d'un guide pour __ sites chaotiques __ comme décrit ci-dessus.
De plus, l'auteur lui-même n'est pas familier avec les tests unitaires. Si vous avez des opinions telles que "Je devrais faire ça plus!" Ou "C'est faux!", Écrivez-les dans les commentaires!
J'espère que cet article aidera ceux qui se demandent "Comment dois-je procéder avec le test unitaire?"!
__ Ce qui suit est une description supposant JUnit5. __
Add.java
//Classe testée
public class Calc {
public int add(int a, int b) {
return a + b;
}
}
CalcTest.java
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
//Classe d'essai
class CalcTest {
@Test
Passer 2 et 3 à la méthode void add renvoie 5() {
//【Préparation préalable】
Calc sut = new Calc();
int expected = 5;
//[Exécution]
int actual = sut.add(2, 3);
//[Vérification]
assertEquals(expected, actual);
//[Post-traitement]
/*
*Détruire une instance, fermer un fichier, etc.
*Ecrire le traitement si nécessaire
*/
}
}
--Dans la phase [Exécution], __ Appelez une seule méthode ou un seul constructeur à évaluer __ ―― À l'exception de l'évaluation transversale, dans les tests unitaires, les tests transversaux ne sont pas souvent effectués en premier lieu. --Dans la phase [Vérification], l'évaluation est effectuée en utilisant la syntaxe ```assert Equals (valeur attendue, cible d'inspection) `` `.
assertTrue / False
, assertNull / NotNull
, assertSame / NotSame
, donc utilisez-les correctement si nécessaire.
--Dans JUnit4, assertThat (cible d'inspection, fonction de correspondance (valeur attendue)) `` ` Cependant, les fonctions asserThat et Matcher ont été supprimées dans JUnit5. --Il est possible de l'utiliser en chargeant la bibliothèque correspondante --Utilisez
assertThrows``` pour tester que des exceptions sont levéesBookshelf.java
//Classe testée
public class Bookshelf {
String[] books = new String[3];
public String addBook(int i, String title) {
books[i] = title;
return title;
}
public List<String> readBook(String str) throws IOException {
Path path = Paths.get(str);
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
return lines;
}
}
BookshelfTest.java
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import java.io.IOException;
//Classe d'essai
class BookshelfTest {
@Test
Lorsque la méthode addBook est appelée avec 3 ou plus spécifiés pour l'index void, ArrayIndexOutOfBoundsException est levée.() {
//【Préparation préalable】
Bookshelf sut = new Bookshelf();
//[Exécution]
assertThrows(ArrayIndexOutOfBoundsException.class, () -> sut.addBook(3, "JavaTextBook"));
}
@Test
void Throw IOException lors de l'appel de la méthode readBook avec un fichier inexistant spécifié() {
//【Préparation préalable】
Bookshelf sut = new Bookshelf();
//[Exécution]
assertThrows(IOException.class, () -> sut.readBook("hoge.txt"));
}
}
La valeur immédiate est bonne si la valeur immédiate est plus facile à comprendre, comme ```assertEquals (0, actual);
`@ BeforeEach '' et
@ AfterEach ''.
--Il est également possible de sélectionner et d'exécuter le test pour chaque hiérarchieBookshelfTest.java
import static org.junit.jupiter.api.Assertions.*;
import java.io.IOException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
class BookshelfTest {
@Nested
classe Vous pouvez stocker jusqu'à 3 livres sur l'étagère{
private Bookshelf sut;
private String expected1 = "JavaText";
private String expected2 = "PythonText";
private String expected3 = "RubyText";
@BeforeEach
void setUp() {
sut = new Bookshelf();
}
@Test
Vous pouvez ajouter un livre à la méthode void addBook() {
//【Préparation préalable】
//[Exécution]
String actual = sut.addBook(0, expected1);
//[Vérification]
assertEquals(expected1, actual);
}
@Test
Deux livres peuvent être ajoutés à la méthode void addBook() {
//【Préparation préalable】
//[Exécution]
String actual1 = sut.addBook(0, expected1);
String actual2 = sut.addBook(1, expected2);
//[Vérification]
assertEquals(expected1, actual1);
assertEquals(expected2, actual2);
}
@Test
Vous pouvez ajouter 3 livres à la méthode void addBook() {
//【Préparation préalable】
//[Exécution]
String actual1 = sut.addBook(0, expected1);
String actual2 = sut.addBook(1, expected2);
String actual3 = sut.addBook(1, expected3);
//[Vérification]
assertEquals(expected1, actual1);
assertEquals(expected2, actual2);
assertEquals(expected3, actual3);
}
}
@Nested
test anormal de classe{
private Bookshelf sut;
@BeforeEach
void setUp() {
sut = new Bookshelf();
}
@Test
Lorsque la méthode addBook est appelée avec 3 ou plus spécifiés pour l'index void, ArrayIndexOutOfBoundsException est levée.() {
//【Préparation préalable】
Bookshelf sut = new Bookshelf();
//[Exécution]
assertThrows(ArrayIndexOutOfBoundsException.class, () -> sut.addBook(3, "JavaTextBook"));
}
@Test
void Throw IOException lors de l'appel de la méthode readBook avec un fichier inexistant spécifié() {
//【Préparation préalable】
Bookshelf sut = new Bookshelf();
//[Exécution]
assertThrows(IOException.class, () -> sut.readBook("hoge.txt"));
}
}
}
@ ParameterizedTest au lieu de` `@ Test
--Spécifiez la source de l'argument en ajoutant une annotation
--Il existe plusieurs types, mais ici nous illustrons l'annotation
@ CsvSource ''.
@ CsvFileSource```)BookshelfTest.java
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
class BookshelfTest {
@ParameterizedTest
@CsvSource({
"0, JavaText",
"1, PythonText",
"2, RubyText"
})
3 étagères peuvent être stockées dans une étagère vide(int index, String title) {
Bookshelf sut = new Bookshelf();
assertEquals(title, sut.addBook(index, title));
}
}
--Il est possible de baliser chaque code de test en ajoutant l'annotation `` @ tag ''.
BookshelfTest.java
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
class BookshelfTest {
@Test
Vous pouvez ajouter un livre à la méthode void addBook() {
//【Préparation préalable】
Bookshelf sut = new Bookshelf();
String expected1 = "JavaText";
//[Exécution]
String actual = sut.addBook(0, expected1);
//[Vérification]
assertEquals(expected1, actual);
}
@Tag("Système anormal")
@Test
Lorsque la méthode addBook est appelée avec 3 ou plus spécifiés pour l'index void, ArrayIndexOutOfBoundsException est levée.() {
//【Préparation préalable】
Bookshelf sut = new Bookshelf();
//[Exécution]
assertThrows(ArrayIndexOutOfBoundsException.class, () -> sut.addBook(3, "JavaTextBook"));
}
}