Pracuję nad komparatorem list, aby pomóc w sortowaniu nieuporządkowanej listy wyników wyszukiwania według bardzo konkretnych wymagań od naszego klienta. Wymagania wymagają algorytmu rankingu zgodnego z następującymi regułami w kolejności ważności:
- Dokładne dopasowanie do nazwy
- Wszystkie słowa wyszukiwanego hasła w nazwie lub synonim wyniku
- Niektóre słowa zapytania wyszukiwania w nazwie lub synonimie wyniku (% malejąco)
- Wszystkie słowa zapytania wyszukiwania w opisie
- Niektóre słowa zapytania wyszukiwania w opisie (% malejąco)
- Data ostatniej modyfikacji malejąco
Naturalnym wyborem projektu dla tego komparatora wydawał się ranking punktowy oparty na potęgach 2. Suma mniej ważnych reguł nigdy nie może być więcej niż pozytywnym dopasowaniem reguły o wyższym znaczeniu. Osiąga się to poprzez następujący wynik:
- 32
- 16
- 8 (Drugi wynik w rozstrzygnięciu remisu na podstawie% malejąco)
- 4
- 2 (Drugi wynik w rozstrzygnięciu remisu na podstawie% malejąco)
- 1
W duchu TDD postanowiłem zacząć od testów jednostkowych. Posiadanie przypadku testowego dla każdego unikalnego scenariusza wymagałoby co najmniej 63 unikalnych przypadków testowych bez uwzględnienia dodatkowych przypadków testowych dla logiki dodatkowego przerywacza remisu w regułach 3 i 5. Wydaje się to przesadne.
Rzeczywiste testy będą w rzeczywistości mniej. W oparciu o same reguły, niektóre reguły zapewniają, że niższe reguły będą zawsze prawdziwe (np. Gdy „Wszystkie słowa z wyszukiwanego hasła pojawią się w opisie”, to reguła „Niektóre słowa z wyszukiwanego hasła pojawią się w opisie” zawsze będzie prawdziwa). Czy nadal warto wkładać wysiłek w napisanie każdego z tych przypadków testowych? Czy jest to poziom testowania, który jest zwykle wymagany przy mówieniu o 100% pokryciu testami w TDD? Jeśli nie, to jaka byłaby możliwa do zaakceptowania alternatywna strategia testowania?