Testy nie powinny być wystarczająco „inteligentne”, aby wykryć błędy.
Kod, który piszesz, implementuje zestaw specyfikacji. (Jeśli X, to Y, chyba że Z, w którym to przypadku Q itp.). Jedynym testem, jaki powinien próbować wykonać, jest ustalenie, że X naprawdę jest Y, chyba że Z, w którym to przypadku Q. Oznacza to, że wszystko, co powinien zrobić test, to ustawienie X i weryfikacja Y.
Ale to nie obejmuje wszystkich przypadków, prawdopodobnie mówisz i miałbyś rację. Ale jeśli sprawisz, że test będzie „wystarczająco inteligentny”, aby wiedzieć, że X powinien być tylko Y, jeśli nie Z, to w zasadzie ponownie wdrażasz logikę biznesową w teście. Jest to problematyczne z powodów, dla których przejdziemy nieco głębiej poniżej. Nie powinieneś poprawiać zasięgu kodu, czyniąc swój pierwszy test „inteligentniejszym”, zamiast tego dodaj drugi głupi test, który ustawia X i Z i weryfikuje Q. W ten sposób będziesz mieć dwa testy, jeden obejmujący ogólny przypadek ( czasami znany również jako ścieżka szczęścia) i taki, który obejmuje obudowę krawędzi jako osobny test.
Istnieje wiele przyczyn tego, przede wszystkim, w jaki sposób można ustalić, czy nieudany test jest spowodowany błędem w logice biznesowej lub błędem w testach? Oczywiście odpowiedź jest taka, że jeśli testy są tak proste, jak to możliwe, jest mało prawdopodobne, że zawierają błędy. Jeśli uważasz, że twoje testy wymagają testowania, oznacza to, że testujesz źle .
Inne powody obejmują to, że po prostu replikujesz wysiłek (jak już wspomniałem, napisanie testu wystarczająco inteligentnego, aby wykorzystać wszystkie możliwości w jednym teście, to w zasadzie replikacja logiki biznesowej, którą próbujesz przetestować w pierwszej kolejności), jeśli wymagania się zmienią następnie testy powinny być łatwe do zmiany, aby odzwierciedlić nowe wymagania, testy służą jako rodzaj dokumentacji (są formalnym sposobem określenia specyfikacji testowanego urządzenia) i tak dalej.
TL: DR: Jeśli twoje testy wymagają testowania, robisz to źle. Napisz głupie testy .