Bạn nhầm lẫn về testCompile và androidTestCompile trong Android Gradle


87

Tôi là người mới tham gia thế giới thử nghiệm và thậm chí nhiều hơn nữa đối với thế giới thử nghiệm Android. Trong khi thực hiện nghiên cứu về Robolectric hỗ trợ các bài kiểm tra trên Android, một điều khiến tôi bối rối nhất. Đôi khi trên web, tôi thấy mọi người sử dụng testCompiletừ khóa trong các phần phụ thuộc của tập lệnh xây dựng gradle khi tham chiếu đến Robolectric trong khi những người khác sử dụng androidTestCompile. Chắc chắn cả hai đều không thể hợp lệ?

Ai đó có thể giải thích sự khác biệt giữa cả hai và cái nào trong số này nên được sử dụng khi sử dụng Robolectric?

Câu trả lời:


120

Chỉ đơn giản testCompilelà cấu hình cho các bài kiểm tra đơn vị (những bài kiểm tra nằm trong src / test ) và androidTestCompileđược sử dụng cho api kiểm tra (nằm trong src / androidTest ). Vì bạn đang có ý định viết các bài kiểm tra đơn vị, bạn nên sử dụng testCompile.

Cập nhật: Sự khác biệt chính giữa cả hai là tập testnguồn chạy trong Java JVM thông thường, trong khi các androidTestbài kiểm tra tập nguồn chạy trên thiết bị Android (hoặc trình giả lập).


Cảm ơn. Đó là những gì tôi đã tìm ra lúc đầu, nhưng nếu đó là lý do tại sao một số phụ thuộc rô bốt tham chiếu với testCompile và một số với androidTestCompile. Đó không phải là một thư viện giúp viết các bài kiểm tra tích hợp? Nếu vậy thì nó có nên được tham chiếu với androidTestCompile không? Tuy nhiên, ngay cả hướng dẫn chính thức của robolectric cũng hướng dẫn sử dụng testCompile ... Xin lỗi nhưng tôi thấy nó quá khó hiểu vào thời điểm này.
Lucas

3
Các quy ước đặt tên hơi lạ. Về cơ bản, nếu bạn đang viết các bài kiểm tra đơn vị (các bài kiểm tra sẽ không được chạy trên thiết bị) thì chúng sẽ tồn tại trong 'src / test' và do đó các phụ thuộc của chúng nằm trong testCompilecấu hình. Các phần phụ thuộc được thêm vào androidTestCompilecấu hình sẽ chỉ có sẵn cho nguồn trong 'src / androidTest', thực sự được tích hợp trong APK và triển khai trên thiết bị.
Mark Vieira

Cảm ơn vì đã chỉ cho tôi một số hướng. Nó không trả lời tất cả các câu hỏi của tôi nhưng nó đã giúp tôi trong quá trình nghiên cứu. Chỉ để làm rõ những gì bạn đã nói, Unit Test không chỉ là những cái trong thư mục test (theo mặc định). Trớ trêu thay, google đôi khi gọi các bài kiểm tra nằm trong androidTest cũng là bài kiểm tra của Unit. Tất nhiên phụ thuộc vào mục đích của thử nghiệm cụ thể, nhưng vẫn làm tăng thêm sự hỗn loạn.
Lucas

1
Điều này chủ yếu là ngữ nghĩa, vì vậy tôi sẽ không bị treo vào chúng. Nhiều bài kiểm tra được viết bằng Robo điện được cho là bài kiểm tra tích hợp và không phải bài kiểm tra đơn vị. Điều đó đang được nói, sự khác biệt chính giữa hai là 'src / test' chạy trên máy của nhà phát triển trong JVM tiêu chuẩn và 'src / androidTest' được đóng gói trong một APK và chạy trên thiết bị thực tế (hoặc trình giả lập).
Mark Vieira

1
Tôi nghĩ rằng hỗ trợ cho 'src / test' mà bạn đã thấy trước đây chỉ đơn giản là hỗ trợ có sẵn thông qua plugin Gradle Java tiêu chuẩn. Do đó, không có hỗ trợ cho các loại hoặc hương vị xây dựng. Giờ đây, plugin Android có hỗ trợ đầy đủ cho các bài kiểm tra đơn vị, bao gồm các bộ nguồn kiểm tra đơn vị cho mỗi biến thể.
Mark Vieira

3

Để trả lời câu hỏi của bạn - Sử dụng testCompile cho robolectric

tại sao, vì rô bốt chạy trên JVM chế giễu tất cả các hành vi của thiết bị Android.

testCompile và androidTestCompile là các thư mục android "theo quy ước" mà gradle sử dụng trong khi chạy các tác vụ do plugin android cung cấp.

androidTestDebug chọn các bài kiểm tra từ thư mục androidTest, testDebug chọn các bài kiểm tra từ thư mục kiểm tra,

Một lần nữa, đây chỉ là các thư mục quy ước, bạn có thể cung cấp các bộ nguồn cho các cấu hình này

Lưu ý: cà phê espresso là một thư viện tuyệt vời như vậy, hãy cố gắng tránh xa rô bốt :)


1

//kiểm tra đơn vị

testCompile 'junit:junit:4.12'

Đoạn mã trên là phần phụ thuộc của JUnit 4 trong tệp build.gradle trong android studio. Bạn thấy rằng nó có testCompile, vì JUnit chạy trên JVM và không yêu cầu thiết bị hoặc trình giả lập để chạy. Điều đó cũng có nghĩa là các bài kiểm tra JUnit sẽ không yêu cầu ngữ cảnh ứng dụng chạy và nếu chúng yêu cầu, chúng tôi sẽ cần "MOCK" chúng.

// Kiểm tra đơn vị tức thì

androidTestCompile('com.android.support.test:runner:0.5', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

Bây giờ chúng ta thấy androidTestCompile ở đây, vì lần này chúng ta dự định sử dụng thiết bị hoặc trình giả lập để thử nghiệm, đó là thử nghiệm Instrumentation. Để làm rõ hơn, tôi khuyên bạn nên đọc từ developer.android.com


0

Để thêm Phụ thuộc cho thử nghiệm JVM hoặc Thử nghiệm đơn vị (thử nghiệm những thứ chỉ dựa trên môi trường java, chúng tôi không cần bất kỳ môi trường Android nào).

Chúng tôi sử dụng chỉ thị testCompile. Thí dụ:

dependencies {
    testCompile gradleTestKit()
}

Để thêm Phụ thuộc cho thử nghiệm Công cụ (Những thử nghiệm này chủ yếu dựa vào môi trường Android), chúng tôi sử dụng androidTestCompilechỉ thị.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.