Sercem systemu testowego WhatsApp jest zaawansowana infrastruktura automatyzacji. Każda zmiana w kodzie musi przejść przez wielopoziomowy proces weryfikacji, wykorzystujący system kontroli wersji Git oraz Mercurial. Proces rozpoczyna się od testów jednostkowych (JUnit i Robolectric dla Androida, XCTest dla iOS), przez testy UI (Espresso i XCUI Tests), aż po testy end-to-end bazujące na Jest. Co wyróżnia to podejście? Przede wszystkim inteligentna integracja popularnych narzędzi open-source z zaawansowanymi rozwiązaniami wewnętrznymi Meta.
Weźmy na przykład testy interfejsu użytkownika. Na Androidzie WhatsApp wykorzystuje Espresso, ale nie w standardowy sposób. Framework został rozszerzony o własne rozwiązania do wykrywania niestabilnych testów i automatycznej optymalizacji zestawów testowych. Gdy test staje się niewiarygodny, system automatycznie wyklucza go z głównej ścieżki CI/CD i tworzy ticket dla autora. To proaktywne podejście znacząco redukuje czas poświęcany na utrzymanie testów.
Podobnie wygląda sytuacja w ekosystemie iOS, gdzie standardowe narzędzia Apple (XCTest i XCUITest) zostały wzbogacone o własne rozwiązania do zarządzania stanem aplikacji i symulacji złożonych scenariuszy użytkownika. WhatsApp opracował również system snapshot testów, który automatycznie wykrywa niezamierzone zmiany w interfejsie użytkownika na różnych urządzeniach i wersjach systemu.
Infrastruktura testowa WhatsApp opiera się na trzech kluczowych zespołach. Pierwszy to zespół infrastrukturalny, który odpowiedzialny jest za rozwój narzędzi. Drugi to zespół Prod Ops, składający się z Technical Quality Specialists (TQS), którzy działają jako pomost między programistami a infrastrukturą testową. Trzeci filar stanowią Test Leads, czyli wyznaczeni inżynierowie w każdym zespole funkcjonalnym, odpowiedzialni za przegląd planów testowych i koordynację wysiłków testowych.
Idąc dalej, dość interesujący wydaje się używany przez WhatsApp system end-to-end testów bazujący na Jest. Twórcy aplikacji stworzyli własną warstwę abstrakcji, która pozwala pisać testy w sposób deklaratywny, opisując intencje biznesowe zamiast technicznych szczegółów implementacji. Ten sam test może być wykonywany na różnych platformach, co znacznie redukuje nakład pracy potrzebny na utrzymanie nawet najbardziej kompleksowych scenariuszy testowych. W praktyce oznacza to, że gdy programista implementuje nową funkcję, otrzymuje nie tylko dostęp do gotowych narzędzi, ale także wsparcie w projektowaniu efektywnej strategii testowej. System automatycznie sugeruje obszary wymagające dodatkowego pokrycia, bazując na historycznych danych o awariach i wzorcach użycia aplikacji.
Ważną rolę odgrywają w całym procesie wbudowane w infrastrukturę mechanizmy monitorowania jakości kodu. WhatsApp wykorzystuje zaawansowane narzędzia do analizy statycznej (Infer) oraz dynamicznej (Sapienz), które automatycznie identyfikują potencjalne problemy zanim kod trafi do produkcji. Co więcej, system uczy się na podstawie historycznych danych, stopniowo poprawiając trafność swoich przewidywań.
To podejście ma swoje zalety i wady. Do zalet należy wysoka liczba tworzonych testów automatycznych, szybka naprawa niestabilnych testów i brak wąskich gardeł w procesie testowym. Wyzwaniami są natomiast przypadki słabych asercji w testach, duplikacja kodu testowego i początkowo wysoka liczba niestabilnych testów. System jednak aktywnie pracuje nad minimalizacją tych problemów poprzez automatyczną optymalizację i ciągłe doskonalenie procesów.
Kluczem do sukcesu okazało się silne wsparcie ze strony kierownictwa WhatsApp, które rozumie strategiczną wartość inwestycji w jakość. To pozwoliło na stworzenie środowiska, w którym jakość jest integralną częścią procesu rozwoju oprogramowania, a nie dodatkiem na końcu. WhatsApp może dzięki temu wypuszczać nowe wersje aplikacji z dużą częstotliwością, utrzymując jednocześnie wyjątkowo niski wskaźnik awarii.
Wszystkie te doświadczenia WhatsApp udowadniają, że można testować aplikację dla 2 miliardów użytkowników bez tradycyjnego zespołu testerów. To trochę jak odkrycie że można zrobić imprezę bez DJ-a - niby się da, ale zawsze jest ryzyko, że ktoś puści Króla Lwa w zapętleniu. Na szczęście póki co działa, może dlatego że każdy defekt jest od razu widoczny dla populacji wielkości kontynentu. W końcu nic tak nie motywuje do pisania dobrych testów jak perspektywa 2 miliardów wkurzonych użytkowników.
Dlatego następnym razem, gdy będziecie narzekać że wasz zespół testerski jest za mały, pomyślcie o WhatsAppie. Oni po prostu stwierdzili „a może by tak wszyscy byli testerami?” i najwyraźniej to był strzał w dziesiątkę, albo po prostu mieli tak dobry budżet, że mogli sobie pozwolić na eksperymenty. Tego już się pewnie nie dowiemy, ale przynajmniej mamy ciekawy case study. 😊
*Artykuł powstał na podstawie oryginalnego postu blogowego napisanego przez byłego pracownika zespołu Test Automation w londyńskim biurze WhatsApp (2021-2023). Tekst został przeorganizowany i uzupełniony, zachowując wszystkie najważniejsze informacje z oryginalnego źródła.