Ich arbeite an einem Listenkomparator, um die Sortierung einer ungeordneten Liste von Suchergebnissen nach ganz bestimmten Anforderungen unseres Kunden zu unterstützen. Die Anforderungen verlangen nach einem eingestuften Relevanzalgorithmus mit den folgenden Regeln in der Reihenfolge der Wichtigkeit:
- Genaue Übereinstimmung mit dem Namen
- Alle Wörter der Suche werden im Namen oder einem Synonym des Ergebnisses abgefragt
- Einige Wörter der Suchanfrage im Namen oder Synonym des Ergebnisses (% absteigend)
- Alle Wörter der Suchanfrage in der Beschreibung
- Einige Wörter der Suchanfrage in der Beschreibung (% absteigend)
- Datum der letzten Änderung absteigend
Die natürliche Designwahl für diesen Komparator schien eine auf Potenzen von 2 basierende Wertung zu sein. Die Summe von weniger wichtigen Regeln kann niemals mehr als eine positive Übereinstimmung mit einer Regel mit höherer Wichtigkeit sein. Dies wird durch die folgende Punktzahl erreicht:
- 32
- 16
- 8 (Sekundäre Tie-Breaker-Punktzahl basierend auf% absteigend)
- 4
- 2 (Sekundäre Tie-Breaker-Punktzahl basierend auf% absteigend)
- 1
Im Sinne des TDD habe ich mich dazu entschlossen, zuerst mit meinen Unit-Tests zu beginnen. Einen Testfall für jedes einzelne Szenario zu haben, würde mindestens 63 einzelnen Testfällen entsprechen, wobei zusätzliche Testfälle für die Logik der sekundären Verbindungsunterbrecher in den Regeln 3 und 5 nicht berücksichtigt werden. Dies scheint überheblich.
Die tatsächlichen Tests werden jedoch tatsächlich weniger sein. Auf der Grundlage der eigentlichen Regeln stellen bestimmte Regeln sicher, dass niedrigere Regeln immer zutreffen (z. B. Wenn "Alle Suchbegriffe in der Beschreibung enthalten", ist die Regel "Einige Suchbegriffe in der Beschreibung enthalten" immer zutreffend). Lohnt sich der Aufwand, jeden dieser Testfälle zu schreiben? Ist dies die Teststufe, die normalerweise erforderlich ist, wenn es um eine Testabdeckung von 100% bei TDD geht? Wenn nicht, was wäre dann eine akzeptable alternative Teststrategie?