2013-02-11 16 views
7

Sto eseguendo i miei test di junit android utilizzando la riga di comando o eclipse a seconda se sono in modalità dev o in test del dispositivo.come passare un argomento a un test di junit android (test parametrizzati)

un'applicazione Java ha un metodo principale (String [] args) ed è facile passare un argomento ad esso (sia con eclisse nella scheda Argomenti nella sezione di configurazione di esecuzione, o dalla linea di comando)

per un test di junit android è diverso, non esiste un metodo Main e non c'è da nessuna parte che posso impostare alcuni argomenti.

Ho letto qua e là una soluzione sarebbe utilizzare un file di proprietà. E 'l'unica possibilità? Se hai un esempio facile e veloce, sarebbe molto apprezzato.

Grazie

>>> Edit <<< 

Sto usando Robotium, e il JUnit estende ActivityInstrumentationTestCase2 Vedi sotto il test JUnit molto di base:

import android.test.ActivityInstrumentationTestCase2; 
import android.util.Log; 

import com.jayway.android.robotium.solo.Solo; 

public class Test_arg extends ActivityInstrumentationTestCase2 {  
    private static final String TARGET_PACKAGE_ID    = "com.myapp.test"; 
    private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.myapp"; 
    private static Class  launcherActivityClass; 
    private Solo solo; 

    static { 
     try { 
      launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME); 
     } catch (ClassNotFoundException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public Test_arg() throws ClassNotFoundException { 
     super(TARGET_PACKAGE_ID, launcherActivityClass); 

    } 

    @Override 
    protected void setUp() throws Exception { 
     solo = new Solo(getInstrumentation(), getActivity()); 
    } 

    @Override 
    public void tearDown() throws Exception { 
     try { 
      solo.finishOpenedActivities(); 
      solo.finalize(); 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
     super.tearDown(); 
    } 

    public void test_01() throws InterruptedException { 
     Log.i("TEST", "test"); 
    }  
} 

e l'androide manifesta

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myapp.test" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="5" /> 

    <instrumentation   
     android:name="android.test.InstrumentationTestRunner"      
     android:targetPackage="com.slacker.radio" android:functionalTest="true"/> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <uses-library android:name="android.test.runner" /> 
    </application> 
</manifest> 
+0

domande simili: http://stackoverflow.com/questions/683764/passing-junit-command-line-parameters-in-eclipse http://stackoverflow.com/ domande/2884163/pass-command-line-arguments-to-junit-test-case-being-run-programatically –

+0

non è buono practive passare gli argomenti ai test dalla riga di comando. Cosa vuoi passare? Perché non creare diverse suite di test o creare argomenti all'interno dei test. – Leonidos

+0

Ray, come menzionato nella mia domanda sono a conoscenza del modo in cui le proprietà del sistema, sto solo guardando un modo più diretto (come argomento del comando)._ Leonidos. Capisco che non è la migliore pratica per passare argomenti per test unitari. Nel mio caso, alcune modifiche sono fatte lato server, dove accendono e spengono le cose. I miei test vengono eseguiti automaticamente dalla riga di comando, quindi non dover compilare di nuovo i test quando il roba del server cambierebbe il mio tempo – Franck

risposta

13

È può estendere InstrumentationTestRunner e ottenere il argomenti a onCreate:

public class MyTestRunner extends InstrumentationTestRunner { 

    private static final String TAG = null; 
    private String mArgument; 

    /* (non-Javadoc) 
    * @see android.test.InstrumentationTestRunner#onCreate(android.os.Bundle) 
    */ 
    @Override 
    public void onCreate(Bundle arguments) { 
     super.onCreate(arguments); 

     if (arguments != null) { 
      mArgument = arguments.getString("myarg"); 
     } 
    } 

    public String getArgument() { 
     return mArgument; 
    } 

} 

Aggiungi la strumentazione per AndroidManifest.xml, nel tuo caso:

<instrumentation   
     android:name="com.example.my.test.MyTestRunner"      
     android:targetPackage="com.slacker.radio" android:functionalTest="true"/> 

e nella vostra Strumentazione (cioè ActivityInstrumentationTestCase2) test si può fare qualcosa di simile:

public void testSomething() { 
    MyTestRunner myTestRunner = (MyTestRunner)getInstrumentation(); 
    Log.d(TAG, "argument=" + myTestRunner.getArgument()); 
} 

e ottenere gli argomenti che è possibile specificare nella riga di comando come

$ adb shell am instrument -e myarg MYARG com.example.my.test/.MyTestRunner -w 
+0

grazie per la risposta, ho modificato la mia domanda iniziale con un esempio di codice, perché sto utilizzando Robotium e estende ActivityInstrumentationTestCase2. Non so come usare la tua risposta nel mio caso – Franck

0

In funzione di impostazione della classe che estende ActivityInstrumentationTestCase2, aggiungere il seguente codice:

MyTestRunner myTestRunner = (MyTestRunner)getInstrumentation(); 
String argument = myTestRunner.getArgument(); 
solo = new Solo(myTestRunner, getActivity()); 

Struttura di directory dovrebbe essere:

src 
    package.x.y.z.test 
     MainTest.java 
     CustomInstrumentationRunner.java 

Poi nel AndroidManifest.xml, impostare

<manifest package="package.x.y.z" ... 

<instrumentation 
     android:name="package.x.y.z.test.CustomInstrumentationRunner" 

Invoca il pacchetto di cui sopra con la riga di comando:

adb shell am instrumentation -w package.x.y.z/package.x.y.z.test.CustomInstrumentationRunner