2013-02-11 26 views
7

मैं कमांड लाइन या ग्रहण का उपयोग कर अपने एंड्रॉइड जूनिट परीक्षण चला रहा हूं, भले ही मैं देव मोड में या डिवाइस परीक्षण में हूं।एंड्रॉइड जूनिट टेस्ट (पैरामीटरेटेड टेस्ट) के लिए तर्क कैसे पारित करें

एक जावा आवेदन एक मुख्य (String [] args) विधि है और यह यह करने के लिए एक तर्क पारित करने के लिए आसान है (या तो रन विन्यास अनुभाग, या कमांड लाइन से में तर्क टैब में ग्रहण के साथ)

एंड्रॉइड जूनिट टेस्ट के लिए यह अलग है, कोई मुख्य विधि नहीं है और कहीं भी मैं कुछ तर्क निर्धारित नहीं कर सकता हूं।

मैंने यहां पढ़ा है और एक गुण फ़ाइल का उपयोग करने के लिए एक समाधान होगा। क्या यह एकमात्र तरीका है? यदि आप एक त्वरित और आसान उदाहरण देते हैं, तो इसकी बहुत सराहना की जाएगी।

धन्यवाद

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

और एंड्रॉयड प्रकट

<?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/ प्रश्न/2884163/पास-कमांड-लाइन-तर्क-टू-जुनीट-टेस्ट-केस-रन-रन-प्रोग्रामेटिक –

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

और उन तर्कों को प्राप्त करें जिन्हें आप कमांड लाइन में

के रूप में निर्दिष्ट कर सकते हैं

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

निर्देशिका संरचना होना चाहिए::

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

आपकी प्रतिक्रिया के लिए धन्यवाद, मैंने अपना प्रारंभिक प्रश्न कोड नमूना के साथ संपादित किया है, क्योंकि मैं रोबोटियम का उपयोग कर रहा हूं और यह ActivityInstrumentationTestCase2 को बढ़ाता है। मुझे नहीं पता कि मेरे मामले में आपके जवाब का उपयोग कैसे करें – Franck

0

क्लास कि ActivityInstrumentationTestCase2 फैली सेटअप समारोह में, निम्न कोड जोड़ें AndroidManifest.xml में फिर

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

,

सेट
<manifest package="package.x.y.z" ... 

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

Invoke कमांड लाइन से ऊपर पैकेज:

adb shell am instrumentation -w package.x.y.z/package.x.y.z.test.CustomInstrumentationRunner 
इसी तरह के सवाल