Przejdź do treści głównej

Jak uruchamiać i pisać testy

Nieoficjalne Tłumaczenie Beta

Ta strona została przetłumaczona przez PageTurner AI (beta). Nie jest oficjalnie zatwierdzona przez projekt. Znalazłeś błąd? Zgłoś problem →

Uruchamianie testów

Ta sekcja dotyczy testowania Twoich zmian w React Native jako współtwórcy. Jeśli jeszcze tego nie zrobiłeś, przejdź przez kroki konfiguracji środowiska deweloperskiego dla budowania projektów z natywnym kodem.

Testy JavaScript

Najprostszym sposobem uruchomienia zestawu testów JavaScript jest użycie następującego polecenia w katalogu głównym Twojego repozytorium React Native:

bash
yarn test

Spowoduje to uruchomienie testów przy użyciu Jest.

Powinieneś również upewnić się, że Twój kod przechodzi testy Flow i lintowania:

bash
yarn flow
yarn lint

Testy iOS

Postępuj zgodnie z instrukcjami w README.md znajdującym się w katalogu packages/rn-tester.

Następnie wróć do katalogu głównego swojego repozytorium React Native i uruchom polecenie yarn. Spowoduje to skonfigurowanie zależności JavaScript.

W tym momencie możesz uruchomić testy iOS, wywołując następujący skrypt z katalogu głównego swojego repozytorium React Native:

bash
./scripts/objc-test.sh test

You can also use Xcode to run iOS tests. Open RNTester/RNTesterPods.xcworkspace and run tests locally by pressing Command + U or selecting Product then Test from the menubar.

Xcode also allows running individual tests through its Test Navigator. You can also use Command + 6 shortcut.

uwaga

objc-test.sh zapewnia, że Twoje środowisko testowe jest skonfigurowane do uruchamiania wszystkich testów. Skrypt ten wyłącza również testy, które są znane jako niestabilne lub uszkodzone. Miej to na uwadze podczas uruchamiania testów przy użyciu Xcode. Jeśli napotkasz nieoczekiwany błąd, sprawdź najpierw, czy test nie został wyłączony w objc-test.sh.

Testy iOS Podfile/Ruby

Jeśli wprowadzasz zmiany w konfiguracjach Podfile, istnieją testy Ruby, które mogą je zweryfikować.

Aby uruchomić testy Ruby:

bash
cd scripts
sh run_ruby_tests.sh

Testy Androida

Testy jednostkowe Androida nie są uruchamiane w emulatorze, ale na maszynie wirtualnej Java (JVM) na Twoim lokalnym komputerze.

Aby uruchomić testy jednostkowe Androida, wywołaj następujący skrypt z katalogu głównego swojego repozytorium React Native:

bash
./gradlew test

Pisanie testów

Zawsze, gdy naprawiasz błąd lub dodajesz nową funkcjonalność do React Native, dobrym pomysłem jest dodanie testu, który to obejmuje. W zależności od wprowadzanych zmian, mogą być odpowiednie różne rodzaje testów.

Testy JavaScript

Testy JavaScript można znaleźć w katalogach __test__, znajdujących się obok plików, które są testowane. Zobacz TouchableHighlight-test.js jako podstawowy przykład. Możesz również przejść przez samouczek Jesta Testowanie aplikacji React Native, aby dowiedzieć się więcej.

Testy integracyjne iOS

React Native udostępnia narzędzia ułatwiające testowanie zintegrowanych komponentów, które wymagają komunikacji między komponentami natywnymi i JS poprzez most.

Dwa główne komponenty to RCTTestRunner i RCTTestModule. RCTTestRunner konfiguruje środowisko React Native i udostępnia narzędzia do uruchamiania testów jako XCTestCase w Xcode (najprostszą metodą jest runTest:module). RCTTestModule jest eksportowany do JavaScript jako NativeModules.TestModule.

Same testy są pisane w JS i muszą wywołać TestModule.markTestCompleted() po zakończeniu, w przeciwnym razie test przekroczy limit czasu i zakończy się niepowodzeniem.

Błędy testów są głównie sygnalizowane przez rzucenie wyjątku JS. Możliwe jest również testowanie warunków błędów za pomocą runTest:module:initialProps:expectErrorRegex: lub runTest:module:initialProps:expectErrorBlock:, które spodziewają się, że zostanie rzucony błąd i sprawdzą, czy błąd pasuje do podanych kryteriów.

Zobacz poniższe przykłady użycia i punkty integracji:

Testy snapshotowe na iOS

Popularnym typem testów integracyjnych są testy snapshotowe. Renderują komponent i porównują zrzuty ekranu z obrazami referencyjnymi za pomocą TestModule.verifySnapshot(), wykorzystując bibliotekę FBSnapshotTestCase. Obrazy referencyjne tworzy się ustawiając recordMode = YES w RCTTestRunner przed uruchomieniem testów.

Snapshoty mogą się nieznacznie różnić między wersjami 32 i 64-bitowymi oraz różnymi wersjami systemu operacyjnego, dlatego zaleca się uruchamianie testów z poprawną konfiguracją.

Zaleca się też mockowanie wszystkich danych sieciowych i innych potencjalnie problematycznych zależności. Przykład podstawowego testu snapshotowego znajdziesz w SimpleSnapshotTest.

Jeśli w pull requestie wprowadzisz zmianę wpływającą na test snapshotowy (np. dodasz nowy przypadek w przykładzie objętym snapshotem), będziesz musiał ponownie wygenerować obraz referencyjny.

W tym celu zmień flagę recordMode na _runner.recordMode = YES; w RNTester/RNTesterSnapshotTests.m, ponownie uruchom testy, następnie ustaw flagę z powrotem na NO i zgłoś/aktualizuj pull request oczekując na wynik z CircleCI.

Testy jednostkowe na Androida

Dobrą praktyką jest dodawanie testu jednostkowego dla Androida podczas pracy nad kodem, który można przetestować w izolacji w Javie/Kotlinie. Testy jednostkowe dla Androida znajdują się w packages/react-native/ReactAndroid/src/test/.

Zachęcamy do przejrzenia tych testów, aby zobaczyć przykłady dobrej jakości testów jednostkowych.

Ciągłe testowanie

Do automatycznego uruchamiania testów open source używamy CircleCI. Testy są uruchamiane przy każdym commicie w pull requeście, co pomaga maintainerom ocenić, czy zmiana wprowadza regresję. Testy uruchamiają się też dla commitów w gałęziach main i *-stable monitorując ich stabilność.

Dodatkowy zestaw testów działa w wewnętrznej infrastrukturze Meta. Niektóre to testy integracyjne definiowane przez wewnętrznych użytkowników React Native (np. testy jednostkowe dla funkcji React Native w aplikacji Facebook).

Testy te uruchamiają się przy każdym commicie do kopii React Native w systemie kontroli źródła Facebooka oraz podczas importu pull requesta do tego systemu.

W przypadku niepowodzenia tych testów, konieczna będzie pomoc osoby z Meta. Ponieważ pull requesty mogą być importowane tylko przez pracowników Meta, osoba importująca powinna pomóc w rozwiązaniu problemu.

uwaga

Uruchamianie testów CI lokalnie: Większość współtwórców open source polega na CircleCI dla wyników testów. Jeśli wolisz zweryfikować zmiany lokalnie z tą samą konfiguracją co CircleCI, możesz użyć ich interfejsu wiersza poleceń do uruchamiania zadań lokalnie.

Często zadawane pytania

Jak zaktualizować wersję Xcode używaną w testach CI?

Podczas aktualizacji do nowej wersji Xcode najpierw upewnij się, że jest obsługiwana przez CircleCI.

Będziesz także musiał zaktualizować konfigurację środowiska testowego, aby upewnić się, że testy uruchamiają się na symulatorze iOS dostępnym w maszynie CircleCI.

Informacje te można również znaleźć w dokumentacji wersji Xcode w CircleCI poprzez kliknięcie wybranej wersji i sprawdzenie sekcji Runtimes.

Następnie możesz edytować te dwa pliki:

  • .circleci/config.yml

    Edytuj linię xcode: w sekcji macos: (wyszukaj _XCODE_VERSION).

  • scripts/.tests.env

    Zmień wartość zmiennej środowiskowej IOS_TARGET_OS tak, aby odpowiadała wybranej wersji iOS Runtime.

Jeśli planujesz scalić tę zmianę na GitHubie, upewnij się, że powiadomisz pracownika Meta, ponieważ będzie on musiał zaktualizować wartość _XCODE_VERSION używaną w wewnętrznym teście Sandcastle RN OSS dla iOS w pliku react_native_oss.py podczas importowania twojego pull requesta.