2013-02-11 21 views
7

私はdevモードまたはデバイステスト中であるかどうかに応じてコマンドラインまたはeclipseを使用してアンドロイドのjunitテストを実行しています。アンドロイドのjunitテスト(パラメータ化されたテスト)に引数を渡す方法

Javaアプリケーションは、メイン(文字列[]引数)メソッドを持っており、それに引数を渡すことは容易である(いずれか、またはコマンドラインによって実行される構成セクションで引数タブでEclipseと)

アンドロイドjunitテストのためにそれは異なっています、メインメソッドはありませんし、私はいくつかの引数を設定することができますどこにもありません。

ここでは、プロパティファイルを使用する方法があります。それが唯一の方法ですか? すばやく簡単な例があれば、非常に感謝しています。

おかげ

>>> Edit <<< 

私はRobotiumを使用しています、とJUnitはActivityInstrumentationTestCase2 は非常に基本的なJUnitテストの下を参照してください。拡張:

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

とAndroidマニフェスト

<?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

同様の質問:http://stackoverflow.com/questions/683764/passing-junit-command-line-parameters-in-eclipse http://stackoverflow.com/ test/2884163/pass-command-line-arguments-to-junit-test-case-being-run-programmatically –

+0

コマンドラインからテストに引数を渡すのは実用的ではありません。何を渡したいですか?異なるテストスイートを作成したり、テスト内で引数を作成したりする理由は何ですか? – Leonidos

+0

レイ、私の質問では、私はシステムのプロパティの方法を認識している、私はちょうど(コマンド引数のような)よりストレートな方法を探していると述べた。_ レオニードス。私は単体テストの議論を渡すのがベストプラクティスではないことを理解しています。私の場合、いくつかの変更はサーバー側で行われ、サーバー側ではオンとオフの切り替えが行われます。私のテストはコマンドラインで自動的に実行されるので、サーバーの変更があったときにテストを再度コンパイルする必要はありません。 – Franck

答えて

13

あなたをInstrumentationTestRunnerを拡張して、 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; 
    } 

} 

はあなたのケースでは、AndroidManifest.xmlに機器を追加します。

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

、あなたはこのような何かを行うことができます計装(すなわちActivityInstrumentationTestCase2)のテストで:

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

を入力し、コマンドラインで指定できる引数を

として取得しますActivityInstrumentationTestCase2を拡張するクラスのセットアップ機能で
$ adb shell am instrument -e myarg MYARG com.example.my.test/.MyTestRunner -w 
+0

私はRobotiumを使用しており、ActivityInstrumentationTestCase2を拡張しているので、私は最初の質問をコードサンプルで編集しました。私はあなたの答えを私の場合に使う方法を知らない – Franck

0

、次のコードを追加します。

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

のディレクトリ構造は次のようになります。

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

その後のAndroidManifest.xmlで、

を設定
<manifest package="package.x.y.z" ... 

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

呼び出しコマンドラインで上記パッケージ:

adb shell am instrumentation -w package.x.y.z/package.x.y.z.test.CustomInstrumentationRunner 
関連する問題