2012-04-24 42 views
16

Câu hỏi của tôi là: Làm cách nào để tạo một dự án thử nghiệm độc lập Android Android cho thư viện Android?Dự án thử nghiệm độc lập cho dự án thư viện trên Android

Tôi đã có thư viện Android (được đánh dấu là "Thư viện" trong cài đặt dự án) và dự án Android chứa các lớp kiểm tra JUnit của tôi. Dự án kiểm tra tham chiếu chính xác thư viện Android (trong cài đặt dự án trong "Android").

Thư viện của tôi nằm trong gói com.mayastudios. Tất cả các trường hợp thử nghiệm của tôi cũng nằm trong cùng một gói (nhưng trong một dự án khác). Vì vậy, về cơ bản tôi có một cái gì đó như thế này:

+- MyLibraryProject 
    +- src 
     +- com/mayastudios/MyClass.java 
    +- AndroidManifest.xml 
    +- ... 
+- MyTestProject (references MyLibraryProject) 
    +- test 
     +- com/mayastudios/MyClassTests.java 
    +- AndroidManifest.xml 
    +- ... 

Dưới đây là manifest Android cho dự án kiểm tra:

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

    <uses-sdk android:minSdkVersion="10" /> 

    <instrumentation 
     android:name="android.test.InstrumentationTestRunner" 
     android:targetPackage="com.mayastudios" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

    <application android:label="Spatialite-NewApi-UnitTests"> 
     <uses-library android:name="android.test.runner" /> 
    </application> 

</manifest> 

Tuy nhiên, khi tôi chạy dự án kiểm tra (từ Eclipse với ADT, sử dụng "Chạy dưới dạng -> Android JUnit Test") Tôi nhận được lỗi sau:

Unable to find instrumentation target package: com.mayastudios 

Đây là đồng Nhật ký bảng điều khiển mplete:

[2012-04-24 17:24:20 - spatialite-test] Android Launch! 
[2012-04-24 17:24:20 - spatialite-test] adb is running normally. 
[2012-04-24 17:24:20 - spatialite-test] Performing android.test.InstrumentationTestRunner JUnit launch 
[2012-04-24 17:24:20 - spatialite-test] Automatic Target Mode: using device '3732FBC2711300EC' 
[2012-04-24 17:24:20 - spatialite-test] Uploading spatialite-test.apk onto device '3732FBC2711300EC' 
[2012-04-24 17:24:20 - spatialite-test] Installing spatialite-test.apk... 
[2012-04-24 17:24:22 - spatialite-test] Success! 
[2012-04-24 17:24:22 - spatialite-test] Launching instrumentation android.test.InstrumentationTestRunner on device 3732FBC2711300EC 
[2012-04-24 17:24:22 - spatialite-test] Collecting test information 
[2012-04-24 17:24:23 - spatialite-test] Test run failed: Unable to find instrumentation target package: com.mayastudios 

Tôi đã cố xóa thẻ <instrumentation> khỏi tệp kê khai không hoạt động. Cách duy nhất để làm việc này cho đến nay là tạo dự án Android mặc định (với Hoạt động), tham khảo dự án thử nghiệm của tôi và sử dụng tên gói của dự án Android mặc định này là targetPackage theo <instrumentation>. Nhưng đó không phải là điều tôi muốn. Tôi muốn một dự án thử nghiệm độc lập.

Mọi đề xuất?

+1

Thiết bị đo lườngTestRunner phải nhắm mục tiêu trên một gói ứng dụng cụ thể, trong khi chính dự án thư viện không cho phép xuất dưới dạng apk. Tôi đã giải thích điều này chi tiết hơn tại [ở đây] (http://stackoverflow.com/questions/10172636/unable-to-find-instrumentation-target-package-com-xyz/10173034#10173034). – yorkw

+0

Vâng, tôi hiểu rồi. Tôi chỉ nghĩ rằng test.apk có thể tự chạy vì nó được cài đặt trên thiết bị. –

+0

Nó hoạt động như tôi mong đợi. Xem câu trả lời của tôi dưới đây. –

Trả lời

25

Ah, câu trả lời rất đơn giản. Lỗi nằm trong tệp kê khai Android của dự án kiểm tra trong dòng 3: Đây là gói sai được đề cập. Vì vậy, tệp kê khai đã sửa sẽ trông giống như sau:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.mayastudios" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="10" /> 

    <instrumentation 
     android:name="android.test.InstrumentationTestRunner" 
     android:targetPackage="com.mayastudios" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

    <application android:label="Spatialite-NewApi-UnitTests"> 
     <uses-library android:name="android.test.runner" /> 
    </application> 

</manifest> 

Và với tất cả những ai nói rằng bạn cần ba dự án (thư viện, dự án thử nghiệm dự án thử nghiệm): Chúng sai. Một dự án thư viện và một dự án thử nghiệm là đủ. Dự án thử nghiệm thậm chí không cần chứa Hoạt động.

+0

Tôi cho rằng 'com.mayastudios' là dự án Thử nghiệm của bạn. Một dự án thử nghiệm có thể nhắm mục tiêu vào chính nó, hãy xem câu trả lời của tôi [ở đây] (http://stackoverflow.com/questions/9518514/is-it-possible-to-define-activity-inside-android-test-project-and- run-a-test-aga/9525354 # 9525354). Những gì bạn thực sự đã làm chỉ đơn giản là làm cho test.apk runnable và đích đến chính nó (** bạn không phải là mục tiêu vào mã thư viện của bạn **).Nó đã được nêu rõ trong hướng dẫn dev chính thức mà bạn cần một dự án ứng dụng để kiểm tra dự án thư viện gián tiếp. – yorkw

+0

@yorkw: Trên thực tế, giả sử liên kết 'com.mayastudios' vào dự án thư viện Android mong muốn được kiểm tra, mẫu này phù hợp [dấu đầu dòng thứ hai của trang bạn đã liên kết trong nhận xét của bạn về câu trả lời đã xóa bây giờ] (http://developer.android.com/guide/developing/projects/index.html#testing). – CommonsWare

+0

@CommonsWare, Ahhhhh, tôi hiểu rồi. Sebastian, Vâng, bạn là chính xác. Không bao giờ sử dụng mẫu này trước đây, đáng để biết. – yorkw

Các vấn đề liên quan