Come testare un progetto di libreria Android


97

Sto scrivendo un progetto di libreria Android basato sulla classe Bitmap Android (chiamiamola AndroindLib) che contiene solo una classe di utilità (nessuna attività). Ho provato a testarlo utilizzando Android JUnit, ma continua a lamentarsi che non riesce a trovare AnroidLib.apk

Qual è il modo giusto per testare l'unità Android Library Project?


1
Oppure ( spudorato plug alert ) potresti usare un progetto che ho creato: Android Library Test Harness (quello che mi piace chiamare "Alt H"). È disponibile come repository git: gitorious.org/alth Il progetto è ancora in fase di sviluppo e la documentazione è un po 'scarsa, quindi sentiti libero di contattarmi se hai domande.
i41

Risposte:


75

Citando la documentazione :

"Esistono due modi consigliati per impostare il test su codice e risorse in un progetto di libreria:

  • È possibile impostare un progetto di test che strumentali un progetto di applicazione che dipende dal progetto di libreria. È quindi possibile aggiungere test al progetto per le funzionalità specifiche della libreria.

  • È possibile impostare un progetto applicativo standard che dipende dalla libreria e inserire la strumentazione in quel progetto. Ciò consente di creare un progetto autonomo che contiene sia i test / strumentazioni che il codice da testare. "


27
quindi praticamente tutto ciò che devi fare è aggiungere la libreria al tuo progetto di test e testare il progetto di test.
njzk2

Il link non è più valido, puoi indicarci quello attuale?
Abdullah Jibaly


4
Non sono sicuro che qualcun altro abbia avuto successo con questi consigli, ma io no. Ho provato prima la seconda soluzione e quando provo a eseguire in Eclipse ottengo quanto segue: <ProjectName> non specifica una strumentazione android.test.InstrumentationTestRunner o non dichiara la libreria uses android.test.runner nel suo AndroidManifest.xml. Questo nonostante abbia aggiunto sia la strumentazione che gli elementi della libreria degli usi al mio manifest.
Bellinghammer

2
Ottenuto il secondo (e il modo preferito di lavorare). È molto importante ottenere la libreria degli usi e gli elementi della strumentazione nella posizione corretta nel file manifest. L'elemento di strumentazione è un elemento secondario dell'elemento manifest root e l'elemento uses-library è un elemento secondario dell'elemento dell'applicazione. Stavo mettendo la libreria degli usi sotto l'elemento manifest e finivo con il messaggio di errore sopra quando provavo a eseguire i test.
Bellinghammer

17

Nel tuo progetto di test cambia semplicemente il nome del pacchetto in modo che sia lo stesso del pacchetto della tua libreria. Ad esempio, hai una libreria il cui pacchetto è "com.example.lib". Crea un progetto di test mirato alla tua libreria. Nel file manifest vedrai package="com.example.lib.test"e targetPackage="com.example.lib". Basta cambiare il pacchetto da "com.example.lib.test" a "com.example.lib" ( targetPackagelasciarlo così com'è).

Inoltre, assicurati che la libreria sia referenziata al tuo progetto di test NON nel percorso di build Java, ma come una normale libreria Android: in Eclipse deve essere mostrata come libreria nella Project->Properties->Androidscheda, ma non nella Project->Properties->Java Build Pathscheda.

Quindi esegui i test.


Le tue idee hanno avuto senso per me, quindi il test si è mirato a se stesso (come l'app) e l'app è collegata alla libreria ... ma non sono riuscito a farlo funzionare tramite ant build né IntelliJ .... come il .apk (previsto per l'app in prova) non esisteva quando ha provato a installarlo, poiché è stato compilato in "test / bin /.- debug.apk"
Andrew Mackenzie

L'ho fatto funzionare semplicemente cambiando il nome del pacchetto del progetto di test nel suo manifest (e il pacchetto sotto test - che dovrebbe essere lo stesso) per NON coincidere con il nome del pacchetto del progetto libreria, oltre a rimuovere il riferimento al test di destinazione project nel file ant.properties.
Andrew Mackenzie

1
Penso che questa sia una risposta migliore di quella accettata, che fa eco alla documentazione - IMHO.
Andrew Mackenzie


5

Secondo la documentazione :

Testare un modulo libreria equivale a testare un'app. La differenza principale è che la libreria e le sue dipendenze vengono incluse automaticamente come dipendenze dell'APK di prova. Ciò significa che l'APK di prova include non solo il proprio codice, ma anche l'AAR della libreria e tutte le sue dipendenze. Poiché non esiste una "app sotto test" separata, l'attività androidTest installa (e disinstalla) solo l'APK di prova. Quando si uniscono più file manifest, Gradle segue l'ordine di priorità predefinito e unisce il manifest della libreria al manifest principale dell'APK di prova.


quale attività eseguire i test? gradle test o gradle androidTest? androidTest non è un'attività.
Sunnyday

ma strumenti come Firebase Test Lab richiedono un APK o AAB e non accettano un file AAR che è l'output dell'attività di assemblaggio della libreria
Mustafa Berkay Mutlu

1

NOTA: questa soluzione si basa sull'utilizzo di Eclipse Indigo (3.8.2) e potrebbe dover essere implementata in modo leggermente diverso per un altro IDE, sebbene i principi di base siano gli stessi.

Ho avuto problemi simili e ho scoperto che funziona sempre quanto segue:

( NOTA: queste istruzioni servono per creare un nuovo gruppo di progetti da zero. Se hai già costruito parti del gruppo di progetti, potresti dover modificare i tuoi progetti in modo che si colleghino allo stesso modo. )

  1. Crea un nuovo progetto libreria Android selezionando la casella di controllo "Libreria" durante la creazione. (ad esempio un progetto Android denominato "RemingtonAndroidTools").
  2. Compilare il progetto della libreria Android e verificare che abbia creato un file jar nella cartella bin. (ad esempio un file jar denominato "RemingtonAndroidTools.jar".)
  3. Crea un progetto Android vuoto per testare l'app Android che fungerà da app di test Android. (Ad esempio un progetto Android denominato "RemingtonAndroidToolsTestApp"). Non sarà necessario modificare il codice sorgente o le risorse del progetto Android Test App a meno che non si disponga di qualcosa che deve essere aggiunto per il test. Molte cose possono essere testate senza alcuna modifica al progetto Android Test App. Il progetto Android Test App è un ponte tra il tuo progetto Android Library e il progetto Android Junit che rende possibile il test del progetto Android Library tramite Android Junit.
  4. Vai alla scheda Libreria di Java Build Path per il progetto Android Test App ("RemingtonAndroidToolsTestApp" in questo esempio).
  5. Aggiungi il file jar ("RemingtonAndroidTools.jar" in questo esempio) dell'Android Library Project ("RemingtonAndroidTools" in questo esempio) tramite il pulsante "Add Jars ...".
  6. Crea un nuovo progetto Android Test (ad esempio "RemingtonAndroidToolsTester") che fungerà da Android Library Tester e seleziona il progetto Android Test App ("RemingtonAndroidToolsTestApp" in questo esempio) come destinazione.
  7. Vai alla scheda Libreria di Java Build Path per il progetto Android Library Tester ("RemingtonAndroidToolsTester" in questo esempio).
  8. Aggiungi il file jar ("RemingtonAndroidTools.jar" in questo esempio) dell'Android Library Project ("RemingtonAndroidTools" in questo esempio) tramite il pulsante "Add Jars ...".
  9. Trova l'ultima cartella del tuo pacchetto Android nel progetto Android Library Tester ("danny.remington.remington_android_tools_test_app.test" ad esempio) e aggiungi una classe di test ("MainActivityTest" ad esempio) che eredita da ActivityInstrumentationTestCase2.
  10. Modifica la classe di test ("TestActivityTest" in questo esempio) per utilizzare l'attività (ad esempio "TestActivity") dell'app Android Test ("RemingtonAndroidToolsTestApp" in questo esempio) come parametro per ActivityInstrumentationTestCase2.
  11. Modifica la classe di test ("TestActivityTest" in questo esempio) e crea un costruttore predefinito che esegua una chiamata a super (Class) e passi la classe dell'App Android Test ("TestActivity.class" ad esempio).

Dovresti finire con tre progetti (Libreria Android, App Android Test, Android Library Tester) simili a questo:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Dovresti finire con una classe per testare la tua libreria Android simile a questa:

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);
   }

}

Puoi quindi aggiungere qualsiasi test desideri. Non sarà necessario fare ulteriore riferimento all'app di test Android ("RemingtonAndroidToolsTestApp" in questo esempio) per eseguire i test a meno che non richiedano l'accesso a un componente specifico di Android (come la cartella Assets, ad esempio). Se è necessario accedere a componenti specifici di Android, è possibile farlo modificando l'app Android Test ("RemingtonAndroidToolsTestApp" in questo esempio) e quindi referenziandola tramite la strumentazione fornita dall'API Android Junit standard. (Puoi leggere di più su questo qui: http://developer.android.com/tools/testing/testing_android.html )


0

Se le tue classi ulitiy non dipendono da alcun codice specifico di Android, puoi semplicemente utilizzare i test unitari JUnit standard. Non è necessario utilizzare le versioni di Android.


2
Questo non funziona perché JUnit standard è compilato nella JVM standard mentre i file java Android vengono compilati nella VM Dalvik.
Danny Remington - OMS
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.