[JAVA] Pensez à un code de test facile à comprendre grâce au test de Comparator

Quand j'ai lu le code de test que j'ai écrit il y a quatre ans, j'ai réalisé que l'intention d'un certain code de test de Comparator était difficile à lire. Le contenu du test est correct, mais je ne pouvais pas imaginer un cas d'utilisation spécifique en lisant le test.

C'est un bon code de test dans une certaine mesure car il garantit l'exactitude du code du produit, mais si possible, il serait plus heureux que les responsables de la postérité puissent lire l'intention. Alors, j'ai trouvé un temps libre et j'ai essayé de le réécrire.

Dans cet article, nous allons présenter l'ancien code de test et le code de test amélioré, et l'utiliser comme service commémoratif.

Code produit

public class TodayReportComparator implements Comparator<Report> {
  @Override
  public int compare(Report lhs, Report rhs) {
    //Bonne chance
  }
}

TodayReportComparator est un comparateur qui trie les rapports d'aujourd'hui afin de les hiérarchiser.

Ancien code de test

Commençons par le test conventionnel. Ce test vérifie le résultat de l'exécution de Comparator # compare.

public class TodayReportComparatorTest {

  private TodayReportComparator sut;

  @Before
  public void setUp() {
    sut = new TodayReportComparator();
  }

  @Test
public void Le rapport d'aujourd'hui vient en tête du rapport d'hier() {
    final long now = System.currentTimeMillis();
    lhs = new Report(new Date(now));
    rhs = new Report(new Date(now - 24 * 60 * 60 * 1000));
    assertThat(sut.compare(lhs, rhs), lessThan(0)); //lhs est élevé
  }

  @Test
public void Le rapport d'aujourd'hui vient en tête du rapport de demain() {
    final long now = System.currentTimeMillis();
    lhs = new Report(new Date(now));
    rhs = new Report(new Date(now + 24 * 60 * 60 * 1000));
    assertThat(sut.compare(lhs, rhs), lessThan(0)); //lhs est élevé
  }
}

Bon point

mauvais endroit

En tout cas, c'est une histoire dont vous devez vous souvenir du comportement de Java SE, ou vous pouvez l'imaginer avec un peu de réflexion. Mais du point de vue du critique, honnêtement, je ne veux pas trop utiliser mon cerveau.

Nouveau code de test

Dans le test récemment réécrit, je me suis concentré sur ce que je voulais que le résultat de Collections.sort, qui est l'utilisation réelle, soit.

public class TodayReportComparatorTest {

  private TodayReportComparator sut;

  @Before
  public void setUp() {
    sut = new TodayReportComparator();
  }

  @Test
public void Le rapport d'aujourd'hui vient en tête du rapport d'hier() {
    // Given
    final long now = System.currentTimeMillis();
    Report todayReport = new Report(new Date(now));
    Report yesterdayReport = new Report(new Date(now - 24 * 60 * 60 * 1000));

    List<Report> actual = Arrays.asList(
        yesterdayReport,
        todayReport
    );

    List<Report> expected = Arrays.asList(
        todayReport, //Le rapport daté d'aujourd'hui est en haut
        yesterdayReport
    );

    // When
    Collections.sort(actual, sut);

    // Then
    assertThat(actual, is(expected));
  }

  @Test
public void Le rapport d'aujourd'hui vient en tête du rapport de demain() {
    // Given
    final long now = System.currentTimeMillis();
    Report todayReport = new Report(new Date(now));
    Report tomorrowReport = new Report(new Date(now + 24 * 60 * 60 * 1000));

    List<Report> actual = Arrays.asList(
        tomorrowReport,
        todayReport
    );

    List<Report> expected = Arrays.asList(
        todayReport, //Le rapport daté d'aujourd'hui est en haut
        tomorrowReport
    );

    // When
    Collections.sort(actual, sut);

    // Then
    assertThat(actual, is(expected));
  }
}

Je l'ai écrit selon mes goûts actuels. Je pense que l’intention de «donner la priorité au rapport d’aujourd’hui et de l’évoquer» que j’ai voulu faire au départ peut être exprimée dans le test.

Bon point

mauvais endroit

en conclusion

Actuellement, j'ai l'habitude d'écrire TDD en écrivant Java, et si je peux écrire un test, j'écrirai le test en premier.

Le code de test est utile non seulement pour l'exactitude du code produit, mais également pour exprimer et affiner la convivialité. Ce serait bien de pouvoir écrire du code de test qui aidera à améliorer le code du produit.

Recommended Posts

Pensez à un code de test facile à comprendre grâce au test de Comparator
Écrire du code difficile à tester
Écrire du code facile à maintenir (partie 1)
Écrire du code facile à maintenir (partie 4)
Écrire du code facile à maintenir (partie 3)
Écrivons un code facile à maintenir (Partie 2) Nom
Quel est le test de code de test de modèle
[Java] Code difficile à remarquer mais terriblement lent
J'ai créé une action GitHub qui facilite la compréhension du résultat de l'exécution de RSpec
Comment identifier le chemin sur lequel il est facile de se tromper