Test avec JGoTesting

Tester avec JGoTesting

1. Vue d'ensemble

JGoTesting est unJUnit-compatible testing framework inspired by Go’s testing package.

Dans cet article, nous allons explorer les principales fonctionnalités du framework JGoTesting et mettre en œuvre des exemples pour présenter ses capacités.

2. Dépendance Maven

Tout d'abord, ajoutons la dépendancejgotesting à nospom.xml:


    org.jgotesting
    jgotesting
    0.12

La dernière version de cet artefact peut être trouvéehere.

3. introduction

JGoTesting nous permet d'écrire des tests compatibles avec JUnit. For every assertion method JGoTesting provides, there is one in JUnit with the same signature, implémenter cette bibliothèque est donc très simple.

Cependant,unlike JUnit, when an assertion fails, JGoTesting doesn’t stop the execution of the test. Au lieu de cela, l'échec est enregistré en tant queevent et ne nous est présenté que lorsque toutes les assertions ont été exécutées.

4. JGoTesting en action

Dans cette section, nous verrons des exemples de configuration de JGoTesting et explorerons ses possibilités.

4.1. Commencer

Afin d'écrire nos tests, commençons par importer les méthodes d'assertion de JGoTesting:

import static org.jgotesting.Assert.*; // same methods as JUnit
import static org.jgotesting.Check.*; // aliases starting with "check"
import static org.jgotesting.Testing.*;

La bibliothèque nécessite une instanceJGoTestRule obligatoire marquée de l'annotation@Rule. Cela indique que tous les tests de la classe seront gérés par JGoTesting.

Créons une classe déclarant une telle règle:

public class JGoTestingUnitTest {

    @Rule
    public final JGoTestRule test = new JGoTestRule();

    //...
}

4.2. Rédaction de tests

JGoTesting fournit deux ensembles de méthodes d'assertion pour écrire nos tests. Les noms des méthodes du premier ensemble commencent parassert et sont ceux compatibles avec JUnit, et les autres commencent par uncheck.

Les deux ensembles de méthodes se comportent de la même manière et la bibliothèque fournit une correspondance directe entre eux.

Voici un exemple pour tester si un nombre est égal à un autre, en utilisant les deux versions:

@Test
public void whenComparingIntegers_thenEqual() {
    int anInt = 10;

    assertEquals(anInt, 10);
    checkEquals(anInt, 10);
}

Le reste de l'API est explicite, nous n'entrerons donc pas dans les détails. Pour tous les exemples qui suivent, nous allons nous concentrer uniquement sur la versioncheck des méthodes.

4.3. Événements et messages d'échec

Quand une vérification échoue, JGoTesting enregistre l'échec pour que le cas de test continue son exécution. After the test ends, the failures are reported.

Voici un exemple pour montrer à quoi cela ressemble:

@Test
public void whenComparingStrings_thenMultipleFailingAssertions() {
    String aString = "The test string";
    String anotherString = "The test String";

    checkEquals("Strings are not equal!", aString, equalTo(anotherString));
    checkTrue("String is longer than one character", aString.length() == 1);
    checkTrue("A failing message", aString.length() == 2);
}

Après avoir exécuté le test, nous obtenons le résultat suivant:

org.junit.ComparisonFailure: Strings are not equal!
  expected:<[the test s]tring> but was:<[The Test S]tring>
// ...
java.lang.AssertionError: String is longer than one character
// ...
java.lang.AssertionError: Strings are not the same
  expected the same: was not:

En plus de transmettre les messages d'échec dans chaque méthode, nous pouvons également les enregistrer afin qu'ils n'apparaissent que lorsqu'un test a au moins un échec.

Écrivons une méthode de test qui met cela en pratique:

@Test
public void whenComparingNumbers_thenLoggedMessage() {
    log("There was something wrong when comparing numbers");

    int anInt = 10;
    int anotherInt = 10;

    checkEquals(anInt, 10);
    checkTrue("First number should be bigger", 10 > anotherInt);
    checkSame(anInt, anotherInt);
}

Après l'exécution du test, nous obtenons le résultat suivant:

org.jgotesting.events.LogMessage: There was something wrong
  when comparing numbers
// ...
java.lang.AssertionError: First number should be bigger

Notez qu'en plus delogf(), qui peut formater les messages comme la méthodeString.format(), les méthodes_ we can also use the _logIf() etlogUnless() pour consigner les messages en fonction d'une expression conditionnelle.

4.4. Interruption des tests

JGoTesting propose plusieurs méthodes pour mettre fin aux cas de test lorsqu'ils échouent à remplir une condition préalable donnée.

Voici un exemple detest that ends prematurely car un fichier requis n’existe pas:

@Test
public void givenFile_whenDoesnotExists_thenTerminated() throws Exception {
    File aFile = new File("a_dummy_file.txt");

    terminateIf(aFile.exists(), is(false));

    // this doesn't get executed
    checkEquals(aFile.getName(), "a_dummy_file.txt");
}

Notez que nous pouvons également utiliser les méthodesterminate() etterminateUnless() pour interrompre l'exécution du test.

4.5. Enchaînement

La classeJGoTestRule a également unfluent API that we can use to chain checks together.

Regardons un exemple qui utilise notre instance deJGoTestRule pour enchaîner plusieurs vérifications sur les objetsString:

@Test
public void whenComparingStrings_thenMultipleAssertions() {
    String aString = "This is a string";
    String anotherString = "This Is a String";

    test.check(aString, equalToIgnoringCase(anotherString))
      .check(aString.length() == 16)
      .check(aString.startsWith("This"));
}

4.6. Chèques personnalisés

En plus des expressionsboolean et des instancesMatcher,JGoTestRule‘s methods can accept a custom Checker object to do the checking. Il s'agit d'une interface de méthode abstraite unique qui peut être implémentée à l'aide d'une expression lambda.

Voici un exemple qui vérifie si unString correspond à une expression régulière particulière à l’aide de l’interface susmentionnée:

@Test
public void givenChecker_whenComparingStrings_thenEqual() throws Exception {
    Checker aChecker = s -> s.matches("\\d+");

    String aString = "1235";

    test.check(aString, aChecker);
}

5. Conclusion

Dans ce rapide tutoriel, nous avons exploré les fonctionnalités que JGoTesting nous fournit pour écrire des tests.

Nous avons présenté les méthodesassert compatibles JUnit ainsi que leurs homologuescheck. Nous avons également vu comment la bibliothèque enregistre et signale les événements d'échec, et nous avons écrit unChecker personnalisé à l'aide d'une expression lambda.

Comme toujours, le code source complet de cet article peut être trouvéover on Github.