Chociaż istnieją sposoby, aby nie przeprowadzać testów jednostkowych, jaka jest wartość sprawdzania w nieudanych testach jednostkowych?
Posłużę się prostym przykładem: rozróżnianie wielkości liter. W obecnym kodzie rozróżniana jest wielkość liter. Prawidłowym wejściem do metody jest „Cat” i zwraca ona wyliczenie Animal.Cat. Jednak pożądana funkcjonalność metody nie powinna uwzględniać wielkości liter. Więc jeśli opisana metoda zostanie przekazana jako „cat”, może zwrócić coś takiego jak Animal.Null zamiast Animal.Cat, a test jednostkowy zakończy się niepowodzeniem. Chociaż prosta zmiana kodu sprawiłaby, że to zadziałałoby, bardziej skomplikowany problem może zająć tygodnie, ale identyfikacja błędu za pomocą testu jednostkowego może być mniej złożonym zadaniem.
Aktualnie analizowana aplikacja ma 4 lata kodu, który „działa”. Jednak ostatnie dyskusje dotyczące testów jednostkowych wykazały wady w kodzie. Niektórzy potrzebują tylko jawnej dokumentacji implementacyjnej (np. Rozróżnia małe lub duże litery) lub kodu, który nie wykonuje błędu w oparciu o to, jak jest aktualnie wywoływany. Ale testy jednostkowe można tworzyć, wykonując określone scenariusze, które spowodują wyświetlenie błędu i będą prawidłowymi danymi wejściowymi.
Jaka jest wartość sprawdzania w testach jednostkowych, które wykonują błąd, dopóki ktoś nie będzie w stanie naprawić kodu?
Czy ten test jednostkowy powinien być oznaczony ignorowaniem, priorytetem, kategorią itp., Aby ustalić, czy kompilacja zakończyła się powodzeniem na podstawie wykonanych testów? Ostatecznie należy utworzyć test jednostkowy, aby wykonać kod, gdy ktoś go naprawi.
Z jednej strony pokazuje, że zidentyfikowane błędy nie zostały naprawione. Z drugiej strony, w dziennikach mogą pojawić się setki nieudanych testów jednostkowych, a przeglądanie tych, które powinny zakończyć się niepowodzeniem, a awarie spowodowane przez sprawdzenie kodu byłyby trudne do znalezienia.
źródło
Odpowiedzi:
Nie lubię zepsutych, niezatwierdzonych gości, ponieważ wytwarzają niepotrzebny hałas. Po każdym najcudowniejszym musiałbym sprawdzić wszystkie nieudane problemy (czerwony). Czy jest czerwony, ponieważ wystąpił nowy problem lub dlatego, że istnieje stara czynność do wykonania / naprawienia? Nie jest to w porządku, jeśli jest więcej niż 20 unittestów.
Zamiast tego używam
[Ignore("Reason")]
atrybut, który powoduje, że wynik jest żółty lubthrow new NotImplementedException()
dzięki temu wynik jest szaryUwaga: używam NUnit dla .net. Nie jestem pewien, czy funkcja „szara” jest dostępna w innych najbardziej niestabilnych ramach.
Lubię więc następujące znaczenie wyników testów jednostkowych.
Wszystko oprócz „czerwonego” można zarejestrować.
Aby odpowiedzieć na pytanie: w „czerwonych-nieudanych testach” jest więcej szkody niż wartości, ale sprawdzanie w „testach zignorowanych na żółto” lub „testach niepoprawnych na szaro” może być przydatne jako lista rzeczy do zrobienia.
źródło
will probably never be fixed
jest decyzją polityczną, jeśli chcesz wydać pieniądze na automatyczne testy, czy nie. Dzięki „ignorowanym testom” masz szansę je naprawić. Wyrzucanie „ignorowanych testów” oznacza „porzucać automatyczne testy do czasu, aż ich nie będzie”Nie będę udawać, że jest to standard branżowy, ale sprawdzam zepsute testy, aby przypomnieć mi lub innym członkom mojego projektu, że nadal występuje problem z kodem lub samym testem jednostkowym.
Przypuszczam, że jedną rzeczą do rozważenia jest to, czy twoje zasady programistyczne pozwalają na nieudane testy bez kary. Mam przyjaciela, który pracuje w sklepie, który zajmuje się testowaniem, więc zawsze zaczynają od nieudanych testów ...
źródło
Niepowodzenie testów jednostkowych daje zespołowi programistycznemu wgląd w to, co należy zrobić, aby spełnić uzgodnione specyfikacje.
Krótko mówiąc, nieudane testy jednostkowe dają zespołowi listę „DO ZROBIENIA”.
Z tego powodu nieudane testy jednostkowe są znacznie lepsze niż brak testów jednostkowych. *
Brak testów jednostkowych pozostawia zespół programistów w ciemności; specyfikacje muszą być wielokrotnie potwierdzane ręcznie .
[* Pod warunkiem, że testy jednostkowe faktycznie testują coś użytecznego.]
źródło
Celem testów jednostkowych jest stwierdzenie oczekiwanego zachowania systemu, a nie dokumentowanie wad. Jeśli użyjemy testów jednostkowych do udokumentowania wad, ich przydatność do potwierdzenia oczekiwanego zachowania jest mniejsza. Odpowiedź na pytanie „Dlaczego test się nie powiódł?” nie jest proste: „Och, coś jest zepsute, czego się nie spodziewałem”. Nie wiadomo, czy błąd testu jest oczekiwany czy nieoczekiwany.
Oto akapit z początku rozdziału 13 efektywnej pracy ze starszym kodem :
źródło
Ale te zepsute, które identyfikują błędy w nowym projekcie, nazwanym jako takie. W ten sposób możesz zobaczyć, że POWINIEN się złamać ... Gdy zostaną naprawione, staną się zielone i zostaną przeniesione do normalnego zestawu testów.
UWAGA: Ten projekt musiałby zostać skonfigurowany tak, aby nie był budowany na serwerze kompilacji, jeśli serwer kompilacji zapobiega sprawdzeniom, które przerywają kompilację (zakładając, że zdefiniujesz zepsutą kompilację jako taką, w której wszystkie testy nie przejdą)
źródło
Testy jednostkowe powinny sprawdzać przypadki błędów oprócz przypadków powodzenia funkcji. Funkcja powinna wyraźnie odrzucać złe dane wejściowe lub powinna zawierać dokumentację wyjaśniającą, które dane wejściowe są uważane za prawidłowe.
Jeśli masz funkcję, która nie wykonuje żadnej z tych rzeczy, jest to błąd i powinieneś mieć sposób na zarejestrowanie, że ona istnieje. Jednym ze sposobów jest stworzenie testu jednostkowego wykazującego ten problem. Złożenie zgłoszenia błędu to kolejna opcja.
Celem testów jednostkowych nie jest osiągnięcie 100% sukcesu, chodzi o znalezienie i naprawienie błędów w kodzie. Nieprzeprowadzanie testów jest łatwym sposobem na osiągnięcie 100% sukcesu, ale nie jest to bardzo korzystne dla projektu.
źródło
Zgłoś błąd dla każdej awarii i zwróć uwagę na wynik testu. Jeśli kiedykolwiek uda Ci się zebrać akt i naprawić błąd, test zostanie zaliczony i usuniesz go z wyniku testu. Nigdy nie ignoruj problemów.
źródło
Jak widzę TDD wykonane przy implementacji testów dla niedokończonego kodu, najpierw napisz testy z atrybutem [ExpectedException] lub podobnym. Powinno to początkowo przejść, ponieważ niekompletny kod nie miałby żadnej logiki i zapisałby w nim nowy kod Exception (). Chociaż wyjątek przelotowy jest błędny, przynajmniej spowoduje to, że testy zakończą się pomyślnie i będą odpowiednie do sprawdzenia. Możemy zapomnieć o zignorowanym teście, ale zdecydowanie możemy uporządkować lub wypełnić niekompletny kod. Gdy to zrobimy, automatycznie odpowiedni test, który spodziewał się wyjątku, zacząłby się nie powieść i zaalarmowałby cię, aby go naprawić. Może to wymagać niewielkiej zmiany testu, aby pozbyć się ExpectException i zamiast tego wykonać prawdziwe twierdzenia. CI, deweloperzy, testerzy i klienci są szczęśliwi i wszyscy wygrywają?
źródło