W projekcie, w którym istnieją niefunkcjonalne wymagania, które określają maksymalny czas wykonania dla określonego działania, QA musi sprawdzić wydajność tego działania na dedykowanej maszynie przy użyciu precyzyjnego sprzętu pod precyzyjnym obciążeniem, przy czym zarówno sprzęt, jak i obciążenie są określone w wymaganiach.
Z drugiej strony niektóre błędne zmiany w kodzie źródłowym mogą poważnie wpłynąć na wydajność. Zauważenie tego negatywnego wpływu wcześnie , zanim kod źródłowy przejdzie do kontroli źródła i zostanie zweryfikowany przez dział kontroli jakości, może być korzystny pod względem czasu straconego przez dział kontroli jakości zgłaszający problem, a deweloper naprawiający go kilka później.
Aby to zrobić, czy to dobry pomysł:
Aby użyć testów jednostkowych, aby zorientować się, ile czasu zajmuje wykonanie tej samej akcji² n razy,
Aby użyć limitu czasu dla testu za pomocą
[TestMethod, Timeout(200)]
atrybutu w języku C #?
Oczekuję kilku problemów z tym podejściem:
Pod względem koncepcyjnym testy jednostkowe tak naprawdę nie są do tego przeznaczone: oczekuje się, że przetestują małą część kodu, nic więcej: ani sprawdzenie wymagań funkcjonalnych, ani test integracji, ani test wydajności.
Czy limit czasu testu jednostkowego w programie Visual Studio naprawdę mierzy to, co należy zmierzyć, biorąc pod uwagę, że inicjalizacja i czyszczenie nie istnieją dla tych testów lub są zbyt krótkie, aby wpłynąć na wyniki?
Pomiar wydajności w ten sposób jest brzydki. Uruchomienie testu porównawczego na dowolnej maszynie¹ niezależnie od sprzętu, obciążenia itp. Jest jak wykonanie testu porównawczego, który pokazuje, że jeden produkt bazodanowy jest zawsze szybszy od drugiego. Z drugiej strony nie oczekuję, że te testy jednostkowe będą ostatecznym wynikiem, ani też czymś, co będzie wykorzystywane przez dział kontroli jakości . Te testy jednostkowe zostaną wykorzystane jedynie w celu przedstawienia ogólnego wyobrażenia o oczekiwanej wydajności i zasadniczo do ostrzeżenia dewelopera, że jego ostatnia modyfikacja coś zepsuła, poważnie wpływając na wydajność .
Test Driven Development (TDD) jest niemożliwy dla tych testów. Jak by to się nie powiodło, zanim zacznie wdrażać kod?
Zbyt wiele testów wydajności wpłynie na czas wymagany do uruchomienia testów, więc to podejście ogranicza się tylko do krótkich akcji.
Biorąc pod uwagę te problemy, nadal uważam za interesujące stosowanie takich testów jednostkowych, jeśli są one połączone z rzeczywistymi wskaźnikami wydajności działem kontroli jakości.
Czy się mylę? Czy istnieją inne problemy, które sprawiają, że całkowicie niedopuszczalne jest stosowanie do tego testów jednostkowych?
Jeśli się mylę, jaki jest właściwy sposób ostrzeżenia programisty, że zmiana kodu źródłowego poważnie wpłynęła na wydajność, zanim kod źródłowy przejdzie pod kontrolę źródła i zostanie zweryfikowany przez dział kontroli jakości?
¹ W rzeczywistości oczekuje się, że testy jednostkowe będą przeprowadzane tylko na komputerach programistów o porównywalnej wydajności sprzętowej, co zmniejsza różnicę między najszybszymi komputerami, które nigdy nie będą w stanie zawieść testu wydajności, a najwolniejszymi komputerami, które nigdy nie zdadzą go pomyślnie.
² Przez działanie mam na myśli raczej krótki fragment kodu, którego uruchomienie zajmuje kilka milisekund.