Jak przetestować projekt biblioteki systemu Android

97

Piszę Android Library Project w oparciu o klasę Android Bitmap (nazwijmy ją AndroindLib), która zawiera tylko klasę narzędziową (brak aktywności). Próbowałem to przetestować za pomocą Androida JUnit, ale ciągle narzeka, że ​​nie mogę znaleźć AnroidLib.apk

Jaki jest właściwy sposób testowania jednostkowego Android Library Project?

Lilia
źródło
1
Lub ( bezwstydny alert wtyczki ) możesz użyć projektu, który stworzyłem: Android Library Test Harness (co lubię nazywać „Alt H”). Jest dostępny jako repozytorium git: gitorious.org/alth Projekt jest nadal w fazie rozwoju, a dokumentacja jest trochę skąpa, więc nie krępuj się, jeśli masz jakieś pytania, napisz do mnie.
i41

Odpowiedzi:

75

Cytując dokumentację :

„Istnieją dwa zalecane sposoby konfigurowania testowania kodu i zasobów w projekcie biblioteki:

  • Możesz skonfigurować projekt testowy, który instrumentuje projekt aplikacji zależny od projektu biblioteki. Następnie możesz dodać testy do projektu dla funkcji specyficznych dla biblioteki.

  • Można skonfigurować standardowy projekt aplikacji, który zależy od biblioteki i umieścić instrumentację w tym projekcie. Pozwala to na utworzenie samodzielnego projektu zawierającego zarówno testy / instrumenty, jak i kod do przetestowania ”.

CommonsWare
źródło
27
więc w zasadzie wszystko, co musisz zrobić, to dodać bibliotekę do projektu testowego i przetestować projekt testowy.
njzk2
Link nie jest już ważny, czy możesz wskazać nam aktualny?
Abdullah Jibaly
Wygląda na to: developer.android.com/guide/developing/projects/ ...
Abdullah Jibaly,
4
Nie jestem pewien, czy komuś innemu udało się zastosować te zalecenia, ale ja nie. Najpierw wypróbowałem drugie rozwiązanie, a gdy próbuję uruchomić w Eclipse, otrzymuję następujące informacje: <ProjectName> nie określa instrumentacji android.test.InstrumentationTestRunner lub nie deklaruje użycia biblioteki android.test.runner w swoim AndroidManifest.xml. Dzieje się tak pomimo faktu, że do mojego Manifestu dodałem zarówno instrumentację, jak i elementy biblioteki użytkowej.
Bellinghammer
2
Mam drugi (i preferowany sposób pracy). Bardzo ważne jest, aby w swoim manifeście umieścić bibliotekę zastosowań i elementy instrumentacji we właściwej lokalizacji. Element Instrumentation jest elementem podrzędnym głównego elementu manifestu, a element uses-library jest elementem podrzędnym elementu aplikacji. Umieszczałem bibliotekę zastosowań pod elementem manifestu i kończyłem na powyższym komunikacie o błędzie podczas próby uruchomienia testów.
Bellinghammer
17

W projekcie testowym po prostu zmień nazwę pakietu, tak aby była taka sama, jak pakiet biblioteki. Na przykład masz bibliotekę, której pakiet to "com.example.lib". Utwórz projekt testowy przeznaczony dla Twojej biblioteki. W pliku manifestu zobaczysz package="com.example.lib.test"i targetPackage="com.example.lib". Po prostu zmień pakiet z „com.example.lib.test” na „com.example.lib” ( targetPackagepozostaw taki, jaki jest).

Upewnij się również, że biblioteka odwołuje się do twojego projektu testowego NIE w ścieżce kompilacji Java, ale jako zwykła biblioteka Androida: w Eclipse musi być pokazana jako biblioteka na Project->Properties->Androidkarcie, ale nie na Project->Properties->Java Build Pathkarcie.

Następnie przeprowadź testy.

alexaschka
źródło
Twoje pomysły miały dla mnie sens, więc test był ukierunkowany na siebie (jako aplikację), a aplikacja jest połączona z biblioteką ... ale nie mogłem zmusić jej do działania za pomocą kompilacji mrówek ani IntelliJ .... .apk (oczekiwany dla testowanej aplikacji) nie istniał, gdy próbował go zainstalować, ponieważ jest kompilowany do „test / bin /.- debug.apk”
Andrew Mackenzie
Mam to do pracy, po prostu zmieniając nazwę pakietu projektu testowego w jego manifeście (i pakiet testowany - który powinien być taki sam), aby NIE pokrywał się z nazwą pakietu projektu biblioteki, plus usunięcie odniesienia do testu docelowego projekt w pliku ant.properties.
Andrew Mackenzie
1
Myślę, że jest to lepsza odpowiedź niż akceptowana, która po prostu odzwierciedla dokumentację - IMHO.
Andrew Mackenzie
5

Zgodnie z dokumentacją :

Testowanie modułu biblioteki jest tym samym, co testowanie aplikacji. Główna różnica polega na tym, że biblioteka i jej zależności są automatycznie uwzględniane jako zależności testowego APK. Oznacza to, że testowy plik APK zawiera nie tylko własny kod, ale także AAR biblioteki i wszystkie jego zależności. Ponieważ nie ma oddzielnej „testowanej aplikacji”, zadanie androidTest instaluje (i odinstalowuje) tylko testowy pakiet APK. Podczas scalania wielu plików manifestu Gradle stosuje domyślną kolejność priorytetów i scala manifest biblioteki z głównym manifestem testowego APK.

Avilio
źródło
jakie zadanie przeprowadzić testy? Gradle test czy Gradle AndroidTest? androidTest nie jest zadaniem.
Słoneczny dzień
ale narzędzia takie jak Firebase Test Lab wymagają APK lub AAB i nie akceptują pliku AAR, który jest wynikiem zadania asemblera biblioteki
Mustafa Berkay Mutlu
1

UWAGA: To rozwiązanie opiera się na użyciu Eclipse Indigo (3.8.2) i może wymagać implementacji nieco inaczej dla innego IDE, chociaż podstawowe zasady będą takie same.

Miałem podobne problemy i stwierdziłem, że zawsze działa:

( UWAGA: te instrukcje dotyczą tworzenia nowej grupy projektów od podstaw. Jeśli już zbudowałeś części grupy projektów, może być konieczne zmodyfikowanie projektów, aby łączyć się w ten sam sposób ).

  1. Utwórz nowy projekt biblioteki systemu Android, zaznaczając pole wyboru „Jest biblioteką” podczas tworzenia. (na przykład projekt Android o nazwie „RemingtonAndroidTools”).
  2. Zbuduj projekt biblioteki systemu Android i sprawdź, czy utworzył plik jar w folderze bin. (na przykład plik jar o nazwie „RemingtonAndroidTools.jar”).
  3. Utwórz pusty projekt systemu Android do testowania aplikacji na Androida, która będzie służyć jako aplikacja testowa systemu Android. (Na przykład projekt Android o nazwie „RemingtonAndroidToolsTestApp”). Nie musisz modyfikować kodu źródłowego ani zasobów projektu aplikacji testowej systemu Android, chyba że masz coś, co należy dodać do testowania. Wiele rzeczy można przetestować bez żadnych modyfikacji projektu aplikacji testowej na Androida. Projekt aplikacji testowej systemu Android jest pomostem między projektem biblioteki systemu Android a projektem Android Junit, który umożliwia testowanie projektu biblioteki systemu Android za pośrednictwem narzędzia Android Junit.
  4. Przejdź do karty Biblioteka ścieżki budowania języka Java dla projektu aplikacji testowej systemu Android (w tym przykładzie „RemingtonAndroidToolsTestApp”).
  5. Dodaj plik jar (w tym przykładzie „RemingtonAndroidTools.jar”) projektu biblioteki systemu Android (w tym przykładzie „RemingtonAndroidTools”) za pomocą przycisku „Dodaj słoiki…”.
  6. Utwórz nowy projekt Android Test (na przykład „RemingtonAndroidToolsTester”), który będzie służył jako Android Library Tester, i wybierz projekt Android Test App (w tym przykładzie „RemingtonAndroidToolsTestApp”) jako cel.
  7. Przejdź do karty Biblioteka ścieżki budowania języka Java dla projektu Android Library Tester (w tym przykładzie „RemingtonAndroidToolsTester”).
  8. Dodaj plik jar (w tym przykładzie „RemingtonAndroidTools.jar”) projektu biblioteki systemu Android (w tym przykładzie „RemingtonAndroidTools”) za pomocą przycisku „Dodaj słoiki…”.
  9. Znajdź ostatni folder pakietu systemu Android w projekcie Android Library Tester (na przykład „danny.remington.remington_android_tools_test_app.test”) i dodaj klasę testową (na przykład „MainActivityTest”), która dziedziczy po ActivityInstrumentationTestCase2.
  10. Edytuj klasę testową (w tym przykładzie „TestActivityTest”), aby użyć działania (na przykład „TestActivity”) aplikacji testowej na Androida (w tym przykładzie „RemingtonAndroidToolsTestApp”) jako parametru dla ActivityInstrumentationTestCase2.
  11. Edytuj klasę testową (w tym przykładzie „TestActivityTest”) i utwórz domyślny konstruktor, który wywołuje funkcję super (Class) i przekazuje ją do klasy aplikacji testowej systemu Android (na przykład „TestActivity.class”).

Powinieneś skończyć z trzema projektami (Android Library, Android Test App, Android Library Tester), które wyglądają podobnie do tego:

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

Powinieneś otrzymać klasę do testowania biblioteki Androida, która wygląda podobnie do tego:

package danny.remington.remington_android_tools_test_app.test;

import android.test.ActivityInstrumentationTestCase2;
import danny.remington.remington_android_tools_test_app.TestActivity;

/**
 * 
 */
public class TestActivityTest extends
      ActivityInstrumentationTestCase2<TestActivity> {

   public TestActivityTest() {
      super(TestActivity.class);
   }

}

Następnie możesz dodać dowolny test, który chcesz. Nie będzie konieczne dalsze odwoływanie się do aplikacji Android Test (w tym przykładzie „RemingtonAndroidToolsTestApp”), aby uruchomić testy, chyba że będą one wymagały dostępu do określonego składnika systemu Android (na przykład do folderu Assets). Jeśli potrzebujesz uzyskać dostęp do jakichkolwiek komponentów specyficznych dla Androida, możesz to zrobić, modyfikując aplikację Android Test App (w tym przykładzie „RemingtonAndroidToolsTestApp”), a następnie odwołując się do niej za pomocą oprzyrządowania udostępnionego przez standardowy interfejs Android Junit API. (Możesz przeczytać więcej na ten temat tutaj: http://developer.android.com/tools/testing/testing_android.html )

Danny Remington - OMS
źródło
0

Jeśli Twoje klasy ulitiy nie zależą od żadnego specyficznego dla Androida kodu, możesz po prostu użyć standardowych testów jednostkowych JUnit. Nie ma potrzeby korzystania z wersji Androida.

Cheryl Simon
źródło
2
To nie działa, ponieważ standardowa JUnit jest kompilowana do standardowej maszyny JVM, podczas gdy pliki Java systemu Android są kompilowane na maszynę wirtualną Dalvik.
Danny Remington - OMS