[JAVA] Denken Sie an Testcode, der durch den Komparator-Test leicht zu verstehen ist

Als ich den Testcode las, den ich vor vier Jahren geschrieben hatte, stellte ich fest, dass die Absicht eines bestimmten Vergleichstestcodes schwer zu lesen war. Der Inhalt des Tests ist korrekt, aber ich konnte mir beim Lesen des Tests keinen bestimmten Anwendungsfall vorstellen.

Es ist bis zu einem gewissen Grad ein guter Testcode, da er die Richtigkeit des Produktcodes garantiert. Wenn möglich, wäre es jedoch glücklicher, wenn die Betreuer der Nachwelt die Absicht lesen könnten. Also fand ich eine freie Zeit und versuchte sie neu zu schreiben.

In diesem Artikel werden wir den alten Testcode und den verbesserten Testcode vorstellen und als Gedenkgottesdienst verwenden.

Produktcode

public class TodayReportComparator implements Comparator<Report> {
  @Override
  public int compare(Report lhs, Report rhs) {
    //Viel Glück
  }
}

TodayReportComparator ist ein Komparator, der die heutigen Berichte sortiert, um sie zu priorisieren.

Alter Testcode

Beginnen wir mit dem konventionellen Test. Dieser Test überprüft das Ergebnis der Ausführung von "Comparator # compare".

public class TodayReportComparatorTest {

  private TodayReportComparator sut;

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

  @Test
public void Der heutige Bericht steht ganz oben auf dem gestrigen Bericht() {
    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 ist hoch
  }

  @Test
public void Der Bericht von heute steht ganz oben auf dem Bericht von morgen() {
    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 ist hoch
  }
}

Guter Punkt

schlechter Platz

In jedem Fall ist es eine Geschichte, dass Sie sich an das Verhalten von Java SE erinnern sollten, oder Sie können es sich mit ein wenig Nachdenken vorstellen. Aber aus Sicht des Rezensenten möchte ich mein Gehirn dort ehrlich gesagt nicht zu sehr einsetzen.

Neuer Testcode

In dem neu geschriebenen Test habe ich mich auf das konzentriert, was ich als Ergebnis von "Collections.sort" haben wollte, was die tatsächliche Verwendung ist.

public class TodayReportComparatorTest {

  private TodayReportComparator sut;

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

  @Test
public void Der heutige Bericht steht ganz oben auf dem gestrigen Bericht() {
    // 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, //Der heute datierte Bericht steht ganz oben
        yesterdayReport
    );

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

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

  @Test
public void Der Bericht von heute steht ganz oben auf dem Bericht von morgen() {
    // 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, //Der heute datierte Bericht steht ganz oben
        tomorrowReport
    );

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

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

Ich habe es nach meinem aktuellen Geschmack geschrieben. Ich denke, dass die Absicht, dem heutigen Bericht "Priorität einzuräumen und ihn zur Sprache zu bringen", die ich ursprünglich wollte, im Test zum Ausdruck gebracht werden kann.

Guter Punkt

schlechter Platz

abschließend

Derzeit habe ich die Angewohnheit, beim Schreiben von Java TDD zu schreiben. Wenn ich einen Test schreiben kann, schreibe ich den Test zuerst.

Testcode ist nicht nur nützlich für die Richtigkeit des Produktcodes, sondern auch zum Ausdrücken und Verfeinern der Benutzerfreundlichkeit. Es wäre schön, Testcode schreiben zu können, der zur Verbesserung des Produktcodes beiträgt.

Recommended Posts

Denken Sie an Testcode, der durch den Komparator-Test leicht zu verstehen ist
Schreiben Sie Code, der schwer zu testen ist
Schreiben Sie einfach zu wartenden Code (Teil 1)
Schreiben Sie einfach zu pflegenden Code (Teil 4)
Schreiben Sie einfach zu wartenden Code (Teil 3)
Schreiben wir einen Code, der einfach zu pflegen ist (Teil 2)
[Java] Code, der schwer zu bemerken, aber furchtbar langsam ist
Ich habe eine GitHub-Aktion erstellt, die es einfach macht, das Ausführungsergebnis von RSpec zu verstehen
So identifizieren Sie den Pfad, auf dem leicht Fehler gemacht werden können