วิธีทดสอบ Android Library Project


97

ฉันกำลังเขียนโครงการ Android Library โดยอาศัยคลาส Android Bitmap (เรียกว่า AndroindLib) ซึ่งมีเฉพาะคลาสยูทิลิตี้ (ไม่มีกิจกรรม) ฉันพยายามทดสอบโดยใช้ Android JUnit แต่ก็ยังบ่นว่าไม่พบ AnroidLib.apk

วิธีใดเป็นวิธีที่ถูกต้องในการทดสอบ Unit test Android Library Project


1
หรือ (การแจ้งเตือนปลั๊กไร้ยางอาย ) คุณสามารถใช้โครงการที่ฉันสร้างขึ้น: Android Library Test Harness (สิ่งที่ฉันชอบเรียกว่า "Alt H") มีให้บริการในรูปแบบ git repo: gitorious.org/althโครงการยังอยู่ในระหว่างการพัฒนาและเอกสารมีความเบาบางเล็กน้อยดังนั้นอย่าลังเลที่จะติดต่อฉันหากคุณมีคำถามใด ๆ
i41

คำตอบ:


75

อ้างถึงเอกสาร :

"มีสองวิธีที่แนะนำในการตั้งค่าการทดสอบโค้ดและทรัพยากรในโครงการไลบรารี:

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

  • คุณสามารถตั้งค่าโปรเจ็กต์แอปพลิเคชันมาตรฐานที่ขึ้นอยู่กับไลบรารีและใส่เครื่องมือในโปรเจ็กต์นั้น ซึ่งจะช่วยให้คุณสามารถสร้างโปรเจ็กต์ในตัวที่มีทั้งแบบทดสอบ / เครื่องมือและโค้ดที่จะทดสอบ "


27
ดังนั้นโดยพื้นฐานแล้วสิ่งที่คุณต้องทำคือเพิ่มไลบรารีในโครงการทดสอบของคุณและทดสอบโครงการทดสอบ
njzk2

ลิงก์ไม่สามารถใช้งานได้อีกต่อไปมีโอกาสใดที่คุณสามารถชี้ให้เราเห็นลิงก์ปัจจุบัน
Abdullah Jibaly


4
ไม่แน่ใจว่ามีใครบ้างที่ประสบความสำเร็จกับคำแนะนำเหล่านี้ แต่ฉันไม่ได้ทำ ลองใช้โซลูชันที่สองก่อนและเมื่อฉันพยายามรันใน Eclipse ฉันได้รับสิ่งต่อไปนี้: <ProjectName> ไม่ได้ระบุเครื่องมือ android.test.InstrumentationTestRunner หรือไม่ประกาศใช้ไลบรารี android.test.runner ใน AndroidManifest.xml แม้ว่าฉันจะเพิ่มทั้งเครื่องมือวัดและองค์ประกอบการใช้ไลบรารีลงในไฟล์ Manifest
Bellinghammer

2
มีวิธีที่สอง (และวิธีการทำงานที่ชอบ) สิ่งสำคัญมากที่คุณจะต้องใช้ไลบรารีการใช้งานและองค์ประกอบเครื่องมือในตำแหน่งที่ถูกต้องในรายการของคุณ องค์ประกอบเครื่องมือเป็นลูกขององค์ประกอบรายการรากและองค์ประกอบไลบรารีการใช้เป็นลูกขององค์ประกอบแอปพลิเคชัน ฉันวางไลบรารีการใช้งานไว้ใต้องค์ประกอบรายการและลงท้ายด้วยข้อความแสดงข้อผิดพลาดด้านบนเมื่อพยายามเรียกใช้การทดสอบ
Bellinghammer

17

ในโครงการทดสอบของคุณเพียงแค่เปลี่ยนชื่อแพ็กเกจให้เหมือนกับแพ็กเกจของไลบรารีของคุณ "com.example.lib"ตัวอย่างเช่นคุณมีห้องสมุดที่มีแพคเกจ สร้างโครงการทดสอบที่กำหนดเป้าหมายห้องสมุดของคุณ ในไฟล์รายการคุณจะเห็นpackage="com.example.lib.test"และtargetPackage="com.example.lib". เพียงเปลี่ยนแพ็กเกจจาก "com.example.lib.test" เป็น "com.example.lib" ( targetPackageปล่อยไว้ตามที่เป็นอยู่)

นอกจากนี้ตรวจสอบให้แน่ใจว่าไลบรารีอ้างอิงกับโปรเจ็กต์ทดสอบของคุณไม่ได้อยู่ในพา ธ การสร้าง Java แต่เป็นไลบรารี Android ทั่วไป: ใน Eclipse จะต้องแสดงเป็นไลบรารีในProject->Properties->Androidแท็บ แต่ไม่ใช่ในProject->Properties->Java Build Pathแท็บ

จากนั้นทำการทดสอบ


ความคิดของคุณสมเหตุสมผลสำหรับฉันดังนั้นการทดสอบกำหนดเป้าหมายตัวเอง (เป็นแอป) และแอปเชื่อมโยงกับไลบรารี .... แต่ฉันไม่สามารถใช้งานได้ผ่าน ant build หรือ IntelliJ .... ในฐานะ .apk (คาดว่าสำหรับแอปที่อยู่ระหว่างการทดสอบ) ไม่มีอยู่เมื่อพยายามติดตั้งเนื่องจากกำลังคอมไพล์เป็น "test / bin /.- debug.apk"
Andrew Mackenzie

ฉันทำให้มันใช้งานได้โดยเพียงแค่เปลี่ยนชื่อแพ็คเกจของโครงการทดสอบในรายการ (และแพ็คเกจที่อยู่ระหว่างการทดสอบ - ซึ่งควรจะเหมือนกัน) เพื่อไม่ให้ตรงกับชื่อแพ็คเกจของโครงการไลบรารีรวมทั้งลบการอ้างอิงไปยังการทดสอบเป้าหมาย โครงการในไฟล์ ant.properties
Andrew Mackenzie

1
ฉันคิดว่านี่เป็นคำตอบที่ดีกว่าคำตอบที่ได้รับการยอมรับเพียงสะท้อนเอกสาร - IMHO
Andrew Mackenzie


5

ตามเอกสารประกอบ :

การทดสอบโมดูลไลบรารีจะเหมือนกับการทดสอบแอป ความแตกต่างที่สำคัญคือไลบรารีและการอ้างอิงจะรวมเป็นการอ้างอิงของ APK ทดสอบโดยอัตโนมัติ ซึ่งหมายความว่า APK ทดสอบไม่เพียง แต่รวมถึงรหัสของตัวเองเท่านั้น แต่ยังรวมถึง AAR ของไลบรารีและการอ้างอิงทั้งหมดด้วย เนื่องจากไม่มี "แอปที่อยู่ระหว่างการทดสอบ" แยกต่างหากงาน androidTest จึงติดตั้ง (และถอนการติดตั้ง) เฉพาะ APK ทดสอบเท่านั้น เมื่อรวมไฟล์ Manifest หลายไฟล์ Gradle จะทำตามลำดับความสำคัญเริ่มต้นและรวมไฟล์ Manifest ของไลบรารีเข้ากับไฟล์ Manifest หลักของ APK ทดสอบ


งานใดที่จะเรียกใช้การทดสอบ gradle test หรือ gradle androidTest? androidTest ไม่ใช่งาน
Sunnyday

แต่เครื่องมือเช่น Firebase Test Lab ต้องใช้ APK หรือ AAB และไม่ยอมรับไฟล์ AAR ซึ่งเป็นผลลัพธ์ของงานประกอบของห้องสมุด
Mustafa Berkay Mutlu

1

หมายเหตุ: โซลูชันนี้ขึ้นอยู่กับการใช้ Eclipse Indigo (3.8.2) และอาจต้องใช้งานแตกต่างกันเล็กน้อยสำหรับ IDE อื่นแม้ว่าหลักการพื้นฐานจะเหมือนกัน

ฉันมีปัญหาที่คล้ายกันและพบว่าการทำสิ่งต่อไปนี้ใช้ได้ผลเสมอ:

( หมายเหตุ: คำแนะนำเหล่านี้มีไว้สำหรับการสร้างกลุ่มโครงการใหม่ตั้งแต่ต้นหากคุณได้สร้างบางส่วนของกลุ่มโครงการแล้วคุณอาจต้องแก้ไขโครงการของคุณเพื่อให้เชื่อมต่อในลักษณะเดียวกัน )

  1. สร้างโครงการไลบรารี Android ใหม่โดยเลือกช่องทำเครื่องหมาย "Is Library" ระหว่างการสร้าง (ตัวอย่างเช่นโครงการ Android ชื่อ "RemingtonAndroidTools")
  2. สร้างโครงการไลบรารี Android และตรวจสอบว่าสร้างไฟล์ jar ในโฟลเดอร์ bin (ตัวอย่างเช่นไฟล์ jar ชื่อ "RemingtonAndroidTools.jar")
  3. สร้างโครงการ Android เปล่าสำหรับทดสอบแอป Android ที่จะใช้เป็นแอปทดสอบ Android (ตัวอย่างเช่นโครงการ Android ชื่อ "RemingtonAndroidToolsTestApp") คุณไม่จำเป็นต้องแก้ไขซอร์สโค้ดหรือทรัพยากรของโครงการ Android Test App เว้นแต่คุณจะมีบางอย่างที่ต้องเพิ่มสำหรับการทดสอบ หลายสิ่งสามารถทดสอบได้โดยไม่ต้องแก้ไขใด ๆ กับโครงการทดสอบแอป Android โครงการ Android Test App เป็นสะพานเชื่อมระหว่างโครงการ Android Library กับโครงการ Android Junit ที่ทำให้การทดสอบโครงการ Android Library ผ่าน Android Junit เป็นไปได้
  4. ไปที่แท็บ Library ของ Java Build Path สำหรับโครงการ Android Test App ("RemingtonAndroidToolsTestApp" ในตัวอย่างนี้)
  5. เพิ่มไฟล์ jar ("RemingtonAndroidTools.jar" ในตัวอย่างนี้) ของ Android Library Project ("RemingtonAndroidTools ในตัวอย่างนี้) ผ่านปุ่ม" Add Jars ... "
  6. สร้างโครงการทดสอบ Android ใหม่ (เช่น "RemingtonAndroidToolsTester") ที่จะทำหน้าที่เป็นผู้ทดสอบห้องสมุด Android และเลือกโครงการ Android Test App ("RemingtonAndroidToolsTestApp" ในตัวอย่างนี้) เป็นเป้าหมาย
  7. ไปที่แท็บ Library ของ Java Build Path สำหรับโครงการ Android Library Tester ("RemingtonAndroidToolsTester" ในตัวอย่างนี้)
  8. เพิ่มไฟล์ jar ("RemingtonAndroidTools.jar" ในตัวอย่างนี้) ของ Android Library Project ("RemingtonAndroidTools ในตัวอย่างนี้) ผ่านปุ่ม" Add Jars ... "
  9. ค้นหาโฟลเดอร์สุดท้ายของแพ็กเกจ Android ของคุณในโครงการ Android Library Tester (ตัวอย่างเช่น "danny.remington.remington_android_tools_test_app.test") และเพิ่มคลาสทดสอบ (เช่น "MainActivityTest") ที่สืบทอดมาจาก ActivityInstrumentationTestCase2
  10. แก้ไขคลาสทดสอบ ("TestActivityTest" ในตัวอย่างนี้) เพื่อใช้กิจกรรม (เช่น "TestActivity") ของแอปทดสอบ Android ("RemingtonAndroidToolsTestApp" ในตัวอย่างนี้) เป็นพารามิเตอร์สำหรับ ActivityInstrumentationTestCase2
  11. แก้ไขคลาสทดสอบ ("TestActivityTest" ในตัวอย่างนี้) และสร้างตัวสร้างเริ่มต้นที่โทรไปยัง super (Class) และส่งผ่านคลาสของ Android Test App (เช่น "TestActivity.class")

คุณควรจะจบลงด้วยโครงการสามโครงการ (Android Library, Android Test App, Android Library Tester) ที่มีลักษณะคล้ายกับสิ่งนี้:

ป้อนคำอธิบายภาพที่นี่

ป้อนคำอธิบายภาพที่นี่

ป้อนคำอธิบายภาพที่นี่

คุณควรจบลงด้วยคลาสสำหรับทดสอบไลบรารี Android ของคุณที่มีลักษณะคล้ายกับสิ่งนี้:

package danny.remington.remington_android_tools_test_app.test;

import android.test.ActivityInstrumentationTestCase2;
import danny.remington.remington_android_tools_test_app.TestActivity;

/**
 * 
 */
public class TestActivityTest extends
      ActivityInstrumentationTestCase2<TestActivity> {

   public TestActivityTest() {
      super(TestActivity.class);
   }

}

จากนั้นคุณสามารถเพิ่มการทดสอบใดก็ได้ที่คุณต้องการ คุณไม่จำเป็นต้องอ้างอิงแอปทดสอบ Android ("RemingtonAndroidToolsTestApp" ในตัวอย่างนี้) อีกต่อไปเพื่อเรียกใช้การทดสอบของคุณเว้นแต่จะต้องการการเข้าถึงส่วนประกอบเฉพาะของ Android (เช่นโฟลเดอร์ Assets เป็นต้น) หากคุณต้องการเข้าถึงส่วนประกอบเฉพาะของ Android คุณสามารถทำได้โดยการแก้ไขแอปทดสอบ Android ("RemingtonAndroidToolsTestApp" ในตัวอย่างนี้) จากนั้นอ้างอิงผ่านเครื่องมือที่จัดเตรียมโดย Android Junit API มาตรฐาน (คุณสามารถอ่านเพิ่มเติมได้ที่นี่: http://developer.android.com/tools/testing/testing_android.html )


0

หากคลาส ulitiy ของคุณไม่ได้ขึ้นอยู่กับรหัสเฉพาะของ Android คุณสามารถใช้การทดสอบหน่วย JUnit มาตรฐานได้ ไม่จำเป็นต้องใช้เวอร์ชัน Android


2
สิ่งนี้ใช้ไม่ได้เนื่องจาก JUnit มาตรฐานถูกคอมไพล์เป็น JVM มาตรฐานในขณะที่ไฟล์ java ของ Android จะถูกคอมไพล์ไปยัง Dalvik VM
Danny Remington - OMS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.