2015-07-21 20 views
16

Dự án của tôi có 2 nhóm kiểm tra khác nhau. Một nhóm chỉ chạy với mặc định AndroidJUnitRunner thiết bị khác phải được chạy với triển khai tùy chỉnh .Làm thế nào để chuyển đổi/thay đổi testInstrumentationRunner động với gradle

Hiện nay tôi chuyển testInstrumentationRunner bằng cách chỉnh sửa mỗi khi tôi cần phải chạy nhóm khác kiểm tra các build.gradle:

android{ 
     defaultConfig { 
      //testInstrumentationRunner "my.custom.TestRunner" 
      testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     } 
} 

Tôi biết rằng hương vị có thể có riêng testInstrumentationRunner nhưng ứng dụng hiện tại của tôi đã có 2 flavourDimensions của họ. Sử dụng hương vị thực sự có ý định có các phiên bản ứng dụng khác nhau. Tôi cần 2 phiên bản của ứng dụng thử nghiệm, cả hai đều kiểm tra cùng một ứng dụng với testInstrumentationRunner s khác nhau.

Tôi đã cố gắng thay đổi testInstrumentationRunner bằng cách lặp qua tất cả các biến thể thử nghiệm. Thực tế, có nhiều testInstrumentationRunner tính:

android.testVariants.all { TestVariant variant -> 
    //readonly 
    variant.variantData.variantConfiguration.instrumentationRunner 

    variant.variantData.variantConfiguration.defaultConfig.testInstrumentationRunner 

} 

Nhưng càng sớm càng android.testVariants được gọi là xây dựng được cấu hình và tất cả những thay đổi không được phản ánh trong việc xây dựng.

Làm cách nào để thay đổi testInstrumentationRunner (từ plugin bổ túc) động?

Tôi muốn có 2 tác vụ gradle khác nhau, mỗi tác vụ sử dụng một khác nhau testInstrumentationRunner nhưng thử nghiệm cùng một biến thể. Bởi vì tôi có ý định tạo một plugin gradle nên giải pháp cũng sẽ hoạt động như một plugin.

Trả lời

2

Tôi gặp vấn đề tương tự, tôi đã sử dụng biểu đồ nhiệm vụ của gradle. Dựa trên tuyên bố của bạn "Dự án của tôi có 2 nhóm kiểm tra khác nhau". Tôi sẽ giả sử bạn đã được xác định nhiệm vụ khác nhau, tôi sẽ gọi cho họ testGroupOne và testGroupTwo:

task testGroupOne{ 
} 
task testGroupTwo{ 
} 
gradle.taskGraph.whenReady {taskGraph -> 
    if(taskGraph.hasTask(testGroupOne)){ 
     testInstrumentationRunner "my.custom.TestRunner" 
    } else if (taskGraph.hasTask(testGroupTwo)){ 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
} 

này cho phép bạn thiết lập giá trị của testInstrumentationRunner sau khi cấu hình nhưng trước khi thực hiện.

+0

Plugin android sau đó đã được định cấu hình và sử dụng testInstrumentationRunner từ giai đoạn cấu hình. – thaussma

0

Đây là một giải pháp một phần, nhưng có thể điều này sẽ làm cho mọi thứ hơi cồng kềnh hơn với bạn: Nó không cho phép bạn chạy thử nghiệm với cả hai người chạy thử trong cùng một bản dựng. Nếu bạn muốn rằng bạn sẽ phải sao chép tất cả các phiên bản nhiệm vụ của DeviceProviderInstrumentTestTask, theo ý kiến ​​của tôi, là quá phức tạp và mong manh.

Điều này phù hợp với tôi (Gradle 2.4 và công cụ xây dựng Android 1.2.3). Nó sử dụng các API nội bộ, vì vậy có khả năng nó không còn hoạt động với bản phát hành tiếp theo của các công cụ xây dựng Android.

Bạn nên sửa đổi các tác vụ được tạo bởi plugin Android sau khi dự án đã được đánh giá. Sau đó, các thay đổi sẽ được sử dụng bởi các nhiệm vụ kiểm tra. Thuộc tính thực sự thay đổi Á hậu thử nghiệm đã sử dụng là task.testVariantData.variantConfiguration.testedConfig.mergedFlavor.testInstrumentationRunner. Thay vì thực hiện những thay đổi này trong giai đoạn cấu hình (tức là bên ngoài một nhiệm vụ), các thay đổi được áp dụng bằng cách sử dụng tác vụ, do đó, người thử nghiệm của bạn chỉ được sử dụng khi được yêu cầu.Bằng cách buộc các nhiệm vụ kiểm tra để chạy sau khi useMyTestRunner (nếu sau này là một phần của việc xây dựng), tên lớp của Á hậu kiểm tra sẽ được thay đổi khi một nhiệm vụ kiểm tra bắt đầu:

project.afterEvaluate { 
    task useMyTestRunner << { 
     tasks.withType(com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask.class) { task -> 
      task.testVariantData.variantConfiguration.testedConfig.mergedFlavor.testInstrumentationRunner = 'com.mycompany.MyTestRunner' 
     } 
    } 

    tasks.withType(com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask.class) { task -> 
     task.mustRunAfter useMyTestRunner 
    } 
} 

Bây giờ bạn có thể chạy các bài kiểm tra sử dụng các Á hậu kiểm tra mặc định cấu hình cho các hương vị (s) với:

gradle :myApp:connectedAndroidTest 

Khi bạn muốn chạy thử nghiệm với việc sử dụng runner thử nghiệm của bạn:

gradle :myApp:connectedAndroidTest :myApp:useMyTestRunner 

tôi đã làm không thêm séc cho null cho bất kỳ thuộc tính nào được truy xuất bằng cách sử dụng task.testVariantData.variantConfiguration.testedConfig.mergedFlavor.testInstrumentationRunner. Bạn nên thêm chúng cho sự vững mạnh. Tôi nghĩ ít nhất testedConfig cần được chú ý. Xem getInstrumentationRunner() tại https://android.googlesource.com/platform/tools/build/+/master/builder/src/main/java/com/android/builder/VariantConfiguration.java

Bạn có thể sử dụng nhập cho com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask ở đầu tệp xây dựng của mình, vì vậy bạn chỉ phải sử dụng tên đơn giản của lớp.

2

Bạn đã cân nhắc sử dụng tham số bảng điều khiển làm công tắc giữa hai cấu hình? Đơn giản như vậy:

android { 
     defaultConfig { 
      if (project.ext.has("customRunner")) { 
       testInstrumentationRunner "my.custom.TestRunner" 
      } else { 
       testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
      } 
     } 
} 

Và sau đó ví dụ như chạy gradlew aDeb -PcustomRunner nếu bạn muốn kiểm tra sử dụng tùy chỉnh hoặc Á hậu gradlew aDeb sử dụng mặc định.

Tôi biết đó không phải là khoa học tên lửa nhưng đơn giản hơn, đúng không? Bạn cũng có thể sử dụng nó trong plugin của mình, chỉ cần lấy đối tượng Project và làm điều tương tự.

+0

cách viết điều tương tự trong tệp Android.mk? bất kỳ ý tưởng? – Ambi

+0

Có thể kích hoạt chuyển đổi này từ cấu hình chạy Android Studio không? – funkybro

+0

hãy xem xét điều này: http://stackoverflow.com/questions/21972581/how-to-pass-a-parameter-in-run-debug-configuration-from-android-studio – Dmide

4

Vì plugin gradle android 1.3 có thể tạo các mô-đun thử nghiệm riêng biệt. Mỗi mô-đun thử nghiệm có thể có testInstrumentationRunner riêng của nó.

Để biết ví dụ chi tiết, hãy xem dự án ví dụ AndroidTestingBlueprint trên github.

Giải pháp từ @ johan-stuyts có tiền thưởng hoạt động tốt (hoặc ít nhất nó đã làm với plugin android gradle 1.2). Nhưng nó sử dụng các API riêng và tạo ra một mô-đun riêng biệt dễ dàng hơn và bằng chứng trong tương lai.

+2

Dự án ví dụ đó không minh họa nhiều mô-đun thử nghiệm trong một dự án duy nhất, trên thực tế nó không xây dựng chính xác. – funkybro

+0

Ví dụ dự án không hoạt động và không có cấu hình cho TestRunner khác nhau. –

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