2015-07-30 18 views
7

Tôi muốn hiểu thêm về nhiệm vụ của ConnectedAndroidTest Gradle. Tôi thấy rằng nó được sử dụng để cài đặt các ứng dụng và kiểm tra apks và chạy các bài kiểm tra.Danh sách các tác vụ mà ConnectedAndroidTest thực thi là gì?

Nhưng các bước riêng lẻ là gì? (các tác vụ gradle nếu có)

"xây dựng gradle" dường như tạo ra gói ứng dụng. Nhiệm vụ nào tạo ra gói thử nghiệm? Và làm thế nào nó (ConnectedAndroidTest) cài đặt ứng dụng và thử nghiệm apk? Và nó bắt đầu các bài kiểm tra như thế nào?

Cảm ơn rất nhiều.

Trả lời

17

My đầu tiên SO trả lời, xin vui lòng được nhẹ nhàng;)

Nhưng các bước cá nhân mà nó là gì? (Nhiệm vụ gradle nếu có)

Vì vậy, nếu bạn muốn có một cái nhìn tổng quan cấp cao về những gì nhiệm vụ ConnectedAndroidTest phụ thuộc vào, chỉ cần chạy ./gradlew connectedAndroidTest hoặc ./gradlew cAT (không có tùy chọn -q) sẽ đưa ra tên của mỗi nhiệm vụ đó cAT phụ thuộc vào trước khi nó được thực hiện. Nhiệm vụ chính nó không thể có các nhiệm vụ khác bên trong nó, nhưng có thể phụ thuộc vào những nhiệm vụ khác trước đó.

Từ this câu trả lời, nhiệm vụ gradle build thực sự là một cái gì đó liên quan đến java và không chịu trách nhiệm về việc xây dựng gói thử nghiệm. Thay vào đó, đó là nhiệm vụ assembleAndroidTest xuất hiện ngay trước connectedAndroidTest. Bạn đã đúng về số connectedAndroidTest mặc dù, nó thực sự cài đặt và chạy gói thử nghiệm. Nhưng tôi sẽ đến một chút. Phần còn lại của câu trả lời của tôi là đi vào chi tiết hơn là cần thiết để sử dụng tác vụ một cách hiệu quả, nhưng rất hữu ích nếu bạn muốn hiểu cách nó hoạt động.

Một số nền
Giống như nhiều người khác Android gradle plug-in nhiệm vụ, connectedAndroidTest là thực sự đặt lại với nhau tại một số điểm trong giai đoạn thực hiện vì việc xây dựng các biến thể khác nhau (debug, phát hành, hương vị 1, hương vị 2 vv). Vì vậy, connectedAndroidTest không có sẵn cho bạn trong giai đoạn cấu hình (khi hầu hết logic tập lệnh xây dựng của bạn được thực hiện). Thay vào đó, khi nó được tạo, nó được đặt là thuộc tính connectedInstrumentTest (về cơ bản là một trường) của thuộc tính testVariants trong đối tượng android.

Như một ví dụ để làm rõ, nếu bạn muốn truy cập hiện nhiệm vụ này để vận dụng nó bằng cách nào đó (có thể thêm một Action đến phần cuối của nó), bạn có thể làm một cái gì đó như thế này trong tập tin build.gradle của bạn:

android { 
    testVariants.all { variant -> 
    variant.connectedInstrumentTest.doLast { 
     println "This will be executed right after our connectedInstrumentTest!" 
     println "The name of the test type: $connectedInstrumentTest.name" 
     println "The type of test $connectedInstrumentTest.class"  
    } 
    } 
} 

và sau đó chạy ./gradlew -q cAT

Vì vậy, ở đây, tôi thêm một hành động để kết thúc bất cứ nhiệm vụ đã được xây dựng và giao cho connectedInstrumentTest bất động sản, mà được lồng khá sâu trong đối tượng android. Tác vụ này có thể là connectedDebugAndroidTest hoặc một nội dung tương tự.

Nhiệm vụ là gì?
Bây giờ, từ thuộc tính loại tôi đặt trong println cuối cùng, chúng ta có thể thấy rằng lớp của tác vụ thực sự là com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask_Decorated.Thành thật mà nói, tôi không quá chắc chắn nơi mà _Decorated một phần đến từ, nhưng một tìm kiếm google cho phần còn lại của tên lớp cung cấp cho chúng tôi với source code cho lớp cơ sở của nhiệm vụ.

Chính Action của tác vụ được gọi là runTests() và hiển thị cho bạn nhiều hay ít cách tác vụ hoàn thành công việc của nó. Nếu bạn làm theo mã nguồn xung quanh một chút, cuối cùng bạn sẽ thấy rằng lệnh adb pm install sẽ được sử dụng để cài đặt gói ứng dụng.

Mặc dù tôi không thể tìm thấy nó hoàn toàn, tôi nghi ngờ rằng ở một nơi khác lệnh adb adb shell am instrument -w com.package.name/android.support.test.runner.AndroidJUnitRunner đang được sử dụng để cuối cùng lái thử nghiệm.

Vì vậy, tôi hy vọng điều đó không quá khó hiểu - tôi đã học hầu hết điều này gần đây vì vậy một số điều có thể không phải là 100%. Tôi sẽ đề nghị làm việc thông qua các tài liệu gradle, đặc biệt là làm thế nào để tạo ra một plugin tùy chỉnh và một nhiệm vụ tùy chỉnh, và cũng có thể kiểm tra các tài liệu công cụ Android gradle plug-in.

+0

Vậy 'connectionAndroidTest' thực sự chạy 'build' và' compile' là gì? –

+0

'@IgorGanapolsky,' connectedAndroidTest' phụ thuộc trực tiếp vào 'assembleDebug' (lắp ráp gỡ lỗi APK) và' assembleDebugAndroidTest' (lắp ráp APK thử nghiệm). Hai nhiệm vụ đó biên dịch mọi thứ. Ngoài ra còn có 'installDebug' và' installDebugAndroidTest' nhiệm vụ, nhưng tôi không rõ ràng chính xác nơi họ đang ở trên cây phụ thuộc. Chúng phải xảy ra sau khi các nhiệm vụ 'lắp ráp *', và trước khi các thử nghiệm thực sự chạy (tất nhiên), nhưng tôi không chắc chắn chính xác vị trí của nó. – AutonomousApps

2

Để trả lời câu hỏi chung chung hơn "danh sách nhiệm vụ mà nhiệm vụ <taskName> thực hiện là gì?", Có hai cách đơn giản để tìm ra điều đó cho bất kỳ tác vụ cụ thể nào.

Đầu tiên là:

./gradlew tasks --all | grep <taskName> 

nơi <taskName> nên được thay thế bằng bất cứ nhiệm vụ mà bạn quan tâm. Ví dụ: ./gradlew tasks --all | grep connectedDebugAndroidTest. Lưu ý rằng tôi đang đường ống qua grep để tự khắc phục sự cố khi chọn lọc thủ công thông qua danh sách tất cả các tác vụ.

Thứ hai là:

Sử dụng các plugin task-tree. Sau khi áp dụng, sử dụng như sau:

./gradlew <taskName> taskTree 

Hoặc, như tôi thường thích nó:

./gradlew <taskName> taskTree --no-repeat -quiet 

Lựa chọn thứ hai làm cho sản lượng một chút ít lộn xộn.

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