Badam techniki i strategie skalowania naszej rosnącej liczby testów integracyjnych naszego obecnego produktu, aby mogły (po ludzku) pozostać częścią naszego rozwoju i procesu CI.
Przy ponad 200 testach integracyjnych osiągamy już 1 godzinę, aby ukończyć pełny test (na komputerze stacjonarnym), a to negatywnie wpływa na zdolność dewelopera do tolerowania uruchamiania całego pakietu w ramach rutynowych procesów wypychania. Co wpływa na motywację do zdyscyplinowania ich dobrego tworzenia. Testujemy integrację tylko kluczowych scenariuszy od przodu do tyłu i używamy środowiska, które odzwierciedla produkcję, które jest budowane od podstaw przy każdym uruchomieniu testowym.
Ze względu na czas potrzebny do uruchomienia, tworzy straszliwą pętlę sprzężenia zwrotnego i wiele zmarnowanych cykli czekających na maszynach na zakończenie testów, bez względu na to, jak skoncentrowane są testy. Nie zwracaj uwagi na droższy negatywny wpływ na przepływ i postęp, zdrowie psychiczne i zrównoważony rozwój.
Oczekujemy, że przeprowadzimy 10-krotnie więcej testów integracyjnych, zanim ten produkt zacznie zwalniać (tak naprawdę nie ma pojęcia, ale nie wydaje się, żebyśmy zaczynali jeszcze pod względem funkcji). W pewnym momencie musimy się spodziewać, że będziemy w kilkuset lub kilku tysiącach testów integracyjnych.
Żeby było jasne, postaraj się, aby dyskusja ta nie była dyskusją na temat testów jednostkowych a testów integracyjnych (które nigdy nie powinny być przedmiotem wymiany). Przeprowadzamy zarówno testy jednostkowe z TDD ORAZ testy integracyjne w tym produkcie. W rzeczywistości przeprowadzamy testy integracyjne na różnych warstwach architektury usług, które mamy, gdzie ma to dla nas sens, ponieważ musimy zweryfikować, gdzie wprowadzamy przełomowe zmiany przy zmianie wzorców w naszej architekturze na inne obszary system.
Trochę o naszym stosie technologii. Obecnie testujemy środowisko emulacji (intensywnie wykorzystujące procesor i pamięć), aby przeprowadzać nasze testy od początku do końca. Który składa się z usług sieci Web Azure REST frontend backend noSql (ATS). Symulujemy nasze środowisko produkcyjne, uruchamiając emulator pulpitu Azure + IISExpress. Jesteśmy ograniczeni do jednego emulatora i jednego lokalnego repozytorium zaplecza na maszynę programistyczną.
Mamy również CI oparty na chmurze, który przeprowadza ten sam test w tym samym emulowanym środowisku, a testy trwają dwa razy dłużej (ponad 2 godziny) w chmurze u naszego obecnego dostawcy CI. Osiągnęliśmy limity SLA dla dostawców CI w chmurze pod względem wydajności sprzętowej i przekroczyliśmy ich limit czasu testowania. Aby być uczciwym, ich specyfikacje nie są złe, ale w połowie tak dobre, jak wbudowana chropowata maszyna stacjonarna.
Stosujemy strategię testowania polegającą na przebudowaniu naszego magazynu danych dla każdej logicznej grupy testów i wstępnym załadowaniu danych testowych. Kompleksowo zapewniając integralność danych, daje to 5-15% wpływ na każdy test. Uważamy więc, że niewiele można zoptymalizować tę strategię testowania na tym etapie opracowywania produktu.
Długa i krótka z tego jest taka: chociaż możemy zoptymalizować przepustowość każdego testu (nawet jeśli nawet o 30% -50% każdy), nadal nie będziemy skutecznie skalować w najbliższej przyszłości za pomocą kilkuset testów. 1 godzina teraz jest nawet znacznie wyższa niż ludzka tolerancja, potrzebujemy rzędu ogólnej poprawy całego procesu, aby był on zrównoważony.
Badam więc, jakie techniki i strategie możemy zastosować, aby radykalnie skrócić czas testowania.
- Pisanie mniej testów nie jest opcją. Proszę nie dyskutować tego w tym wątku.
- Korzystanie z szybszego sprzętu jest zdecydowanie opcją, choć bardzo kosztowne.
- Równoległe uruchamianie grup testów / scenariuszy na osobnym sprzęcie jest zdecydowanie preferowaną opcją.
- Tworzenie grup testów wokół opracowywanych funkcji i scenariuszy jest wiarygodne, ale ostatecznie nie jest wiarygodne, jeśli chodzi o wykazanie pełnego zasięgu lub pewności, że zmiana nie wpłynie na system.
- Technicznie możliwe jest uruchamianie w środowisku pomostowym skalowanym w chmurze zamiast w emulatorze pulpitu, chociaż zaczynamy dodawać czasy wdrażania do uruchomień testowych (około 20 minut na początku uruchomienia testowego w celu wdrożenia).
- Podział elementów systemu na niezależne elementy logiczne jest do pewnego stopnia prawdopodobny, ale spodziewamy się w tym ograniczonym przebiegu, ponieważ oczekuje się, że interakcje między składnikami będą rosły z czasem. (tj. zmiana jest możliwa, może wpłynąć na innych w nieoczekiwany sposób - jak to często się dzieje, gdy system jest rozwijany stopniowo)
Chciałem zobaczyć, jakich strategii (i narzędzi) używają inni w tej przestrzeni.
(Muszę wierzyć, że inni mogą mieć tego rodzaju trudności przy korzystaniu z niektórych zestawów technologii).
[Aktualizacja: 16.12.2016: W końcu zainwestowaliśmy więcej w testy równoległe CI, aby omówić wynik: http://www.mindkin.co.nz/blog/2015/12/16/16-jobs]