[JAVA] Puisque le test unitaire de la PJ dont j'étais en charge était une photo d'enfer, je publierai mon propre guide (?)

introduction

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. __

De base

cas de test

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) `` `.

Bookshelf.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"));
    }

}

À propos des règles de dénomination

Fonctionnalités recommandées de JUnit 5

Structuration des tests

BookshelfTest.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"));
        }
    }

}

Test paramétré

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));
    }

}

Balisage

--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"));
    }

}

Grâce au développement au premier semestre 2020

Les références

Recommended Posts

Puisque le test unitaire de la PJ dont j'étais en charge était une photo d'enfer, je publierai mon propre guide (?)
Comment un ingénieur en arts libéraux a réussi Java Silver six mois après avoir rejoint l'entreprise
J'étais confus parce qu'il y avait une scission dans le tableau
Le tableau de rapport quotidien de l'entreprise de mes parents a été transformé en une application web. (Pour les smartphones)
Puisque le test unitaire de la PJ dont j'étais en charge était une photo d'enfer, je publierai mon propre guide (?)
[POST passé] Je publierai une partie du mémo réponse quand j'étais mentor de TECH :: CAMP
Un super débutant a terminé le livre d'introduction du printemps, je vais donc le résumer à ma manière
J'étais confus parce qu'il y avait une scission dans le tableau
J'ai vérifié l'outil de création automatique de tests unitaires (version fin 2019)
J'ai réussi le test Java niveau 2, je vais donc laisser une note