2013-02-11 40 views
7

Tôi đang chạy thử nghiệm junit android của tôi bằng cách sử dụng dòng lệnh hoặc nhật thực phụ thuộc vào tôi đang ở chế độ dev hoặc trong thử nghiệm thiết bị.làm thế nào để vượt qua một đối số cho một bài kiểm tra junit android (thử nghiệm tham số)

Một ứng dụng java có một phương thức Main (String [] args) và nó rất dễ dàng để vượt qua một cuộc tranh cãi với nó (hoặc với nhật thực toàn phần trong tab Arguments trong phần cấu hình chạy, hoặc bằng dòng lệnh)

cho một bài kiểm tra junit android nó là khác nhau, không có phương pháp chính và không có nơi nào tôi có thể thiết lập một số đối số.

Tôi đã đọc ở đây và có giải pháp sẽ là sử dụng tệp thuộc tính. Có phải đó là cách duy nhất? Nếu bạn có một ví dụ nhanh chóng và dễ dàng, nó sẽ rất được đánh giá cao.

Cảm ơn

>>> Edit <<< 

Tôi đang sử dụng Robotium, và junit kéo dài ActivityInstrumentationTestCase2 Xem dưới thử nghiệm junit rất cơ bản:

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

và android manifest

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

câu hỏi tương tự: http://stackoverflow.com/questions/683764/passing-junit-command-line-parameters-in-eclipse http://stackoverflow.com/ câu hỏi/2884163/pass-command-line-arguments-to-junit-test-case-đang-chạy-programmatically –

+0

nó không phải là thực tế tốt để vượt qua đối số để kiểm tra từ dòng lệnh. Bạn muốn vượt qua điều gì? Tại sao bạn không tạo các bộ thử nghiệm khác nhau hoặc tạo các đối số bên trong các thử nghiệm. – Leonidos

+0

Ray, như đã đề cập trong câu hỏi của tôi, tôi biết về cách tính chất hệ thống, tôi chỉ đang tìm kiếm một cách thẳng thắn (như đối số lệnh)._ Leonidos. Tôi hiểu nó không phải là thực hành tốt nhất để vượt qua các đối số cho các bài kiểm tra đơn vị. Trong trường hợp của tôi, một số thay đổi được thực hiện phía máy chủ, nơi họ chuyển đổi và tắt mọi thứ. Các bài kiểm tra của tôi được chạy theo dòng lệnh tự động, vì vậy không phải biên dịch lại các bài kiểm tra khi thay đổi công cụ máy chủ sẽ tiết kiệm thời gian của tôi – Franck

Trả lời

13

Bạn có thể mở rộng InstrumentationTestRunner và nhận lập luận trong 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; 
    } 

} 

Thêm thiết bị đo đạc để AndroidManifest.xml, trong trường hợp của bạn:

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

và trong bạn Instrumentation (tức ActivityInstrumentationTestCase2) kiểm tra, bạn có thể làm một cái gì đó như thế này:

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

và nhận các đối số mà bạn có thể chỉ định trong dòng lệnh dưới dạng

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

cảm ơn bạn đã trả lời, tôi đã chỉnh sửa câu hỏi ban đầu của mình bằng mẫu mã, vì tôi đang sử dụng Robotium và nó mở rộng ActivityInstrumentationTestCase2. Tôi không biết cách sử dụng câu trả lời của bạn trong trường hợp của tôi – Franck

0

Trong chức năng lập danh sách các lớp mà kéo dài ActivityInstrumentationTestCase2, thêm đoạn mã sau:

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

Cấu trúc thư mục nên là:

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

Sau đó, trong AndroidManifest.xml, thiết

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

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

Gọi gói ở trên với dòng lệnh:

adb shell am instrumentation -w package.x.y.z/package.x.y.z.test.CustomInstrumentationRunner 
Các vấn đề liên quan