สับสนเกี่ยวกับ testCompile และ androidTestCompile ใน Android Gradle


87

ฉันยังใหม่กับโลกแห่งการทดสอบและอีกมากมายสำหรับโลกแห่งการทดสอบ Android ในขณะที่ทำการวิจัยเกี่ยวกับ Robolectric ที่ช่วยในการทดสอบเกี่ยวกับ Android สิ่งหนึ่งที่ทำให้ฉันสับสนมากที่สุด บางครั้งบนเว็บที่ฉันเห็นคนที่ใช้testCompileคำหลักในการอ้างอิงของสร้างสคริปต์ gradle เมื่ออ้างอิง Robolectric androidTestCompileขณะที่คนอื่นใช้ แน่นอนทั้งสองไม่สามารถใช้ได้?

ใครสามารถอธิบายความแตกต่างระหว่างทั้งสองอย่างและข้อใดที่ควรใช้เมื่อใช้ Robolectric

คำตอบ:


120

testCompileเป็นเพียงการกำหนดค่าสำหรับการทดสอบหน่วย (ที่อยู่ในsrc / test ) และandroidTestCompileใช้สำหรับ API การทดสอบ (ที่อยู่ในsrc / androidTest ) testCompileเนื่องจากคุณมีความประสงค์ที่จะเขียนทดสอบหน่วยที่คุณควรใช้

อัปเดต:ความแตกต่างหลักระหว่างทั้งสองคือชุดtestแหล่งที่ทำงานใน Java JVM ปกติในขณะที่androidTestการทดสอบชุดแหล่งที่มาทำงานบนอุปกรณ์ Android (หรือโปรแกรมจำลอง)


ขอบคุณ. นั่นคือสิ่งที่ฉันคิดในตอนแรก แต่ถ้าเป็นเช่นนั้นทำไมการอ้างอิงถึงการพึ่งพา robolectric กับ testCompile และบางส่วนกับ androidTestCompile นั่นไม่ใช่ไลบรารีที่ช่วยในการเขียนการทดสอบการบูรณาการ ถ้าเป็นเช่นนั้นไม่ควรอ้างอิงกับ androidTestCompile หรือไม่? อย่างไรก็ตามแม้แต่คำแนะนำอย่างเป็นทางการของ robolectric ยังสั่งให้ใช้ testCompile ... ขออภัย แต่มันทำให้ฉันสับสนเกินไปในตอนนี้อย่างที่คุณเห็น
Lucas

3
หลักการตั้งชื่อแปลก ๆ นิดหน่อย โดยทั่วไปหากคุณกำลังเขียนการทดสอบหน่วย (การทดสอบที่จะไม่ถูกเรียกใช้บนอุปกรณ์) จะมีอยู่ใน 'src / test' ดังนั้นการอ้างอิงจึงอยู่ในการtestCompileกำหนดค่า การอ้างอิงที่เพิ่มเข้าไปในการandroidTestCompileกำหนดค่าจะใช้ได้เฉพาะกับซอร์สใน "src / androidTest" ซึ่งสร้างไว้ใน APK และติดตั้งบนอุปกรณ์เท่านั้น
Mark Vieira

ขอบคุณที่ชี้ทางให้ฉัน มันไม่ได้ตอบคำถามของฉันทั้งหมด แต่มันช่วยฉันในระหว่างการค้นคว้า เพียงเพื่อชี้แจงสิ่งที่คุณพูดการทดสอบหน่วยไม่ได้เป็นเพียงการทดสอบในโฟลเดอร์ทดสอบเท่านั้น (โดยค่าเริ่มต้น) Google เรียกแดกดันบางครั้งการทดสอบที่อยู่ใน androidTest ยังเป็นการทดสอบหน่วย ขึ้นอยู่กับวัตถุประสงค์ของการทดสอบโดยเฉพาะ แต่ยังคงเพิ่มความสับสน
Lucas

1
นี่คือความหมายเป็นหลักดังนั้นฉันจะไม่วางสายกับพวกเขา การทดสอบจำนวนมากที่เขียนด้วย Roboelectric เป็นการทดสอบแบบบูรณาการเนื้อหาไม่ใช่การทดสอบหน่วยอยู่ดี ดังที่กล่าวไว้ความแตกต่างหลักระหว่างทั้งสองคือ 'src / test' ทำงานบนเครื่องของนักพัฒนาใน JVM มาตรฐานและ 'src / androidTest' บรรจุใน APK และทำงานบนอุปกรณ์จริง (หรือโปรแกรมจำลอง)
Mark Vieira

1
ฉันคิดว่าการรองรับ 'src / test' ที่คุณเห็นก่อนหน้านี้เป็นเพียงสิ่งที่มีให้ผ่านปลั๊กอิน Gradle Java มาตรฐาน ดังนั้นจึงไม่มีการสนับสนุนการสร้างรสชาติหรือประเภท ตอนนี้ปลั๊กอิน Android ได้รับการสนับสนุนอย่างเต็มที่สำหรับการทดสอบหน่วยเพื่อรวมชุดแหล่งที่มาของการทดสอบหน่วยต่อตัวแปร
Mark Vieira

3

เพื่อตอบคำถามของคุณ - ใช้ testCompile สำหรับ robolectric

ทำไมเพราะ robolectric ทำงานบน JVM ซึ่งล้อเลียนพฤติกรรมอุปกรณ์ Android ทั้งหมด

testCompile และ androidTestCompile เป็นโฟลเดอร์ android "ตามแบบแผน" ซึ่ง gradle ใช้ในขณะที่รันงานที่จัดเตรียมโดยปลั๊กอิน Android

androidTestDebug เลือกการทดสอบจากโฟลเดอร์ androidTest, testDebug เลือกการทดสอบจากโฟลเดอร์ทดสอบ

อีกครั้งเหล่านี้เป็นเพียงโฟลเดอร์การประชุมเท่านั้นที่คุณสามารถให้ชุดซอร์สสำหรับการกำหนดค่าเหล่านี้ได้

หมายเหตุ: เอสเปรสโซเป็นห้องสมุดที่ยอดเยี่ยมที่พยายามย้ายออกจากโรโบอิเล็กทริก :)


1

// การทดสอบหน่วย

testCompile 'junit:junit:4.12'

โค้ดด้านบนเป็นการอ้างอิงของ JUnit 4 ในไฟล์ build.gradle ใน android studio คุณจะเห็นว่ามี testCompile, beacuse JUnit ทำงานบน JVM และไม่ต้องใช้อุปกรณ์หรือโปรแกรมจำลองเพื่อทำงาน นั่นหมายความว่าการทดสอบ JUnit จะไม่ต้องใช้บริบทของแอปพลิเคชันในการรันและหากต้องการเราจะต้อง "MOCK"

// การทดสอบหน่วยคำสั่ง

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

ตอนนี้เราเห็น androidTestCompile แล้วเพราะคราวนี้เราตั้งใจจะใช้อุปกรณ์หรืออีมูเลเตอร์ในการทดสอบนั่นคือการทดสอบเครื่องมือ สำหรับคำชี้แจงที่ดีกว่าฉันขอแนะนำให้อ่านจาก developer.android.com


0

ในการเพิ่ม Dependency สำหรับการทดสอบ JVM หรือการทดสอบหน่วย (การทดสอบเหล่านั้นอาศัยสภาพแวดล้อม java เท่านั้นเราไม่จำเป็นต้องมีสภาพแวดล้อม Android)

เราใช้คำสั่ง testCompile ตัวอย่าง:

dependencies {
    testCompile gradleTestKit()
}

ในการเพิ่มการทดสอบการพึ่งพาสำหรับเครื่องมือวัด (การทดสอบเหล่านี้ส่วนใหญ่อาศัยสภาพแวดล้อมของ Android) เราใช้androidTestCompileคำสั่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.