Napisz testera Tradefed

Na tej stronie opisano, jak napisać nowego testera w Tradefed.

Tło

Jeśli ciekawi Cię miejsce modułów testowych w architekturze Tradefed, zobacz Struktura modułu uruchamiającego testy .

Nie jest to warunek wstępny napisania nowego programu uruchamiającego test; programy uruchamiające testy można pisać oddzielnie.

Absolutne minimum: zaimplementuj interfejs

Absolutnym minimum, aby zakwalifikować się jako uczestnik testów Tradefed, jest implementacja interfejsu IRemoteTest , a dokładniej metody run(TestInformation testInfo, ITestInvocationListener listener) .

Ta metoda jest wywoływana przez uprząż podczas korzystania z modułu testowego, podobnie jak Java Runnable.

Każda część tej metody jest uważana za część wykonania modułu testowego.

Raportuj wyniki od biegacza testowego

Metoda run w interfejsie podstawowym umożliwia dostęp do obiektu nasłuchującego typu ITestInvocationListener . Obiekt ten jest kluczem do raportowania uporządkowanych wyników od biegacza testowego do uprzęży.

Raportując ustrukturyzowane wyniki, osoba przeprowadzająca test ma następujące właściwości:

  • Zgłoś odpowiednią listę wszystkich testów, które zostały przeprowadzone, ile czasu trwały i czy indywidualnie zaliczyły, zakończyły się niepowodzeniem lub inne stany.
  • Jeśli ma to zastosowanie, zgłaszaj metryki powiązane z testami, na przykład metryki czasu instalacji.
  • Pasuje do większości narzędzi infrastruktury, na przykład wyników i metryk wyświetlania itp.
  • Zwykle łatwiejsze do debugowania, ponieważ istnieje bardziej szczegółowy ślad wykonania.

To powiedziawszy, raportowanie ustrukturyzowanych wyników jest opcjonalne; osoba przeprowadzająca test może po prostu chcieć ocenić stan całego przebiegu jako PASSED lub FAILED, bez żadnych szczegółów dotyczących faktycznego wykonania.

Na słuchaczu można wywołać następujące zdarzenia, aby powiadomić uprząż o bieżącym postępie wykonywania:

  • testRunStarted: Powiadom o początku grupy przypadków testowych, które są ze sobą powiązane.
    • testStarted: Powiadom o rozpoczęciu przypadku testowego.
    • testFailed/testIgnored: Powiadom o zmianie stanu trwającego przypadku testowego. Przypadek testowy bez zmiany stanu uznaje się za zaliczony.
    • testEnded: Powiadom o zakończeniu przypadku testowego.
  • testRunFailed: Powiadom, że ogólny status wykonania grupy przypadków testowych to niepowodzenie. Przebieg testu może zakończyć się sukcesem lub niepowodzeniem niezależnie od wyników przypadków testowych, w zależności od tego, czego oczekiwało wykonanie. Na przykład plik binarny uruchamiający kilka przypadków testowych może zgłosić wszystkie pomyślnie zakończone przypadki testowe, ale z kodem wyjścia zawierającym błąd (z dowolnego powodu: wyciek plików itp.).
  • testRunEnded: Powiadom o końcu grupy przypadków testowych.

Utrzymanie i zapewnienie właściwej kolejności wywołań zwrotnych jest obowiązkiem realizatora programu uruchamiającego test, na przykład zapewnienie wywołania testRunEnded w przypadku wyjątku przy użyciu klauzuli finally .

Wywołania zwrotne przypadków testowych ( testStarted , testEnded itp.) są opcjonalne. Uruchomienie testowe może nastąpić bez żadnych przypadków testowych.

Możesz zauważyć, że ta struktura zdarzeń jest inspirowana typową strukturą JUnit . Ma to na celu utrzymanie rzeczy zbliżonych do czegoś podstawowego, o czym programiści zwykle mają wiedzę.

Zgłoś dzienniki od modułu uruchamiającego test

Jeśli piszesz własną klasę testową lub moduł uruchamiający Tradefed, zaimplementujesz IRemoteTest i uzyskasz obiekt ITestInvocationListener za pomocą metody run() . Tego odbiornika można używać do rejestrowania plików w następujący sposób:

    listener.testLog(String dataName, LogDataType type_of_data, InputStreamSource data);

Przetestuj za pomocą urządzenia

Powyższy minimalny interfejs pozwala na uruchomienie bardzo prostych testów, które są izolowane i nie wymagają żadnych szczególnych zasobów, na przykład testy jednostkowe Java.

Twórcy testów, którzy chcą przejść do kolejnego etapu testowania urządzeń, będą potrzebować następujących interfejsów:

  • IDeviceTest umożliwia otrzymanie obiektu ITestDevice reprezentującego testowane urządzenie i zapewnia interfejs API umożliwiający interakcję z nim.
  • IBuildReceiver umożliwia testowi pobranie obiektu IBuildInfo utworzonego na etapie dostawcy kompilacji, zawierającego wszystkie informacje i artefakty związane z konfiguracją testu.

Osoby przeprowadzające testy są zwykle zainteresowane tymi interfejsami, aby uzyskać artefakty związane z wykonaniem, na przykład dodatkowe pliki, i uzyskać testowane urządzenie, które będzie celem podczas wykonywania.

Przetestuj na wielu urządzeniach

Tradefed umożliwia przeprowadzanie testów na wielu urządzeniach jednocześnie. Jest to przydatne podczas testowania komponentów wymagających interakcji zewnętrznej, takich jak parowanie telefonu i zegarka.

Aby napisać moduł uruchamiający test, który może korzystać z wielu urządzeń, należy zaimplementować IMultiDeviceTest , który umożliwi otrzymanie mapy ITestDevice do IBuildInfo zawierającej pełną listę reprezentacji urządzeń i powiązanych z nimi informacji o kompilacji.

Funkcja ustawiająca z interfejsu będzie zawsze wywoływana przed metodą run , można więc bezpiecznie założyć, że struktura będzie dostępna po wywołaniu run .

Testerzy są świadomi swoich ustawień

Niektóre implementacje modułu uruchamiającego testy mogą potrzebować informacji o ogólnej konfiguracji, aby działać poprawnie, na przykład pewne metadane dotyczące wywołania lub tego, który target_preparer był wcześniej uruchomiony itp.

Aby to osiągnąć, osoba przeprowadzająca test może uzyskać dostęp do obiektu IConfiguration , którego jest częścią i w którym jest wykonywany. Więcej szczegółów można znaleźć w opisie obiektu konfiguracyjnego .

W przypadku implementacji modułu testowego należy zaimplementować obiekt IConfigurationReceiver , aby otrzymać obiekt IConfiguration .

Elastyczny biegacz testowy

Osoby przeprowadzające testy mogą zapewnić elastyczny sposób przeprowadzania testów, jeśli mają nad nimi szczegółową kontrolę, na przykład osoba przeprowadzająca testy JUnit może indywidualnie uruchamiać każdy test jednostkowy.

Dzięki temu większa uprząż i infrastruktura mogą wykorzystać tę precyzyjną kontrolę, a użytkownicy mogą częściowo uruchomić moduł testowy poprzez filtrowanie .

Obsługa filtrowania opisana jest w interfejsie ITestFilterReceiver , który umożliwia odbieranie zestawów filtrów include i exclude dla testów, które powinny lub nie powinny zostać uruchomione.

Nasza konwencja jest taka, że ​​test zostanie przeprowadzony, jeśli pasuje do jednego lub więcej filtrów włączających ORAZ nie pasuje do żadnego z filtrów wykluczających. Jeśli nie podano filtrów włączających, należy uruchomić wszystkie testy, o ile nie pasują one do żadnego z filtrów wykluczających.