Jestem zwolennikiem testów losowych i piszę je. Jednak to, czy są one odpowiednie w określonym środowisku kompilacji i które zestawy testów powinny być zawarte, jest bardziej zniuansowanym pytaniem.
Uruchomione lokalnie (np. Przez całą noc na swoim dev boxie), losowe testy wykazały błędy zarówno oczywiste, jak i niejasne. Te niejasne są na tyle tajemnicze, że myślę, że losowe testy były naprawdę jedynym realistycznym sposobem ich usunięcia. W ramach testu wziąłem jeden trudny do znalezienia błąd wykryty za pomocą testów losowych i poleciłem pół tuzinowi programistów cracków, aby przejrzeli funkcję (około tuzina linii kodu), w której wystąpił. Nikt nie był w stanie tego wykryć.
Wiele z twoich argumentów przeciwko randomizowanym danym jest posmakiem „testu nie da się odtworzyć”. Jednak dobrze napisany test losowy wychwyci ziarno użyte do uruchomienia zrandomizowanego ziarna i wyprowadzi je w przypadku niepowodzenia. Oprócz możliwości ręcznego powtórzenia testu, pozwala to w prosty sposób stworzyć nowy test, który będzie testował konkretny problem, poprzez zakodowanie materiału siewnego dla tego testu. Oczywiście, prawdopodobnie przyjemniej jest ręcznie zakodować jawny test obejmujący ten przypadek, ale lenistwo ma swoje zalety, a to nawet pozwala zasadniczo automatycznie generować nowe przypadki testowe z powodującego niepowodzenie materiału siewnego.
Jedyną kwestią, o której nie mogę debatować, jest to, że psuje systemy kompilacji. Większość testów kompilacji i testów ciągłej integracji oczekuje, że testy będą za każdym razem robić to samo. Tak więc test, który przypadkowo się nie powiedzie, spowoduje chaos, losowe niepowodzenie i wskazanie palcami zmian, które były nieszkodliwe.
W takim razie rozwiązaniem jest nadal uruchamianie testów losowych w ramach testów kompilacji i testów CI, ale uruchamianie ich ze stałym materiałem inicjującym dla ustalonej liczby iteracji . Dlatego test zawsze robi to samo, ale nadal bada kilka przestrzeni wejściowych (jeśli uruchomisz go dla wielu iteracji).
Lokalnie, np. Podczas zmiany danej klasy, możesz uruchomić ją w celu uzyskania większej liczby iteracji lub z innymi ziarnami. Jeśli testy losowe kiedykolwiek staną się bardziej popularne, możesz sobie nawet wyobrazić określony zestaw testów, o których wiadomo, że są losowe, które można by uruchomić z różnymi zalążkami (a więc z rosnącym zasięgiem w czasie) i gdzie awarie nie oznaczałyby tego samego ponieważ deterministyczne systemy CI (tj. przebiegi nie są kojarzone 1: 1 ze zmianami kodu, więc nie wskazuje się palcem na konkretną zmianę, gdy coś się nie powiedzie).
Wiele można powiedzieć o testach losowych, szczególnie dobrze napisanych, więc nie odrzucaj ich zbyt szybko!