Trade Federation में होस्ट-ड्रिवन टेस्ट लिखना

इस पेज पर, होस्ट के ज़रिए चलाए जाने वाले JUnit4 स्टाइल के डिवाइस टेस्ट को लिखने का तरीका बताया गया है. इसका मतलब है कि हार्नेस के होस्ट साइड से डिवाइस के ख़िलाफ़ कार्रवाइयां ट्रिगर की जाएंगी.

ध्यान दें कि हम "होस्ट-साइड" टेस्ट और "होस्ट-ड्रिवन" टेस्ट को थोड़ा अलग मानते हैं:

  • होस्ट-ड्रिवन टेस्ट: यह होस्ट पर चलने वाला टेस्ट है, जो एक या एक से ज़्यादा डिवाइसों के साथ इंटरैक्ट करता है. जांचा जा रहा सिस्टम (एसयूटी) होस्ट पर नहीं है, लेकिन उसकी जांच होस्ट से की जा रही है.
  • होस्ट-साइड टेस्ट: यह टेस्ट पूरी तरह से होस्ट पर चलता है और सिर्फ़ होस्ट पर किसी चीज़ की जांच करता है. उदाहरण के लिए, यूनिट टेस्ट.

इंस्ट्रूमेंटेशन टेस्ट के बजाय, होस्ट-ड्रिवन टेस्ट क्यों बनाएं?

कुछ टेस्ट के लिए, आपको डिवाइस की पूरी स्थिति पर असर डालना पड़ सकता है. जैसे, रीबूट करने का निर्देश देना. इंस्ट्रूमेंटेशन टेस्ट केस में, रीबूट करने से इंस्ट्रूमेंटेशन बंद हो जाएगा. इससे टेस्ट जारी नहीं रखा जा सकेगा और कोई नतीजा उपलब्ध नहीं होगा.

होस्ट-ड्रिवन टेस्ट, सेटअप के अतिरिक्त चरणों को भी चला सकते हैं. इन चरणों के लिए, उन बाहरी डिवाइसों के साथ इंटरैक्ट करना ज़रूरी होता है जिन पर टेस्ट निर्भर करता है.

होस्ट-ड्रिवन टेस्ट, इन इस्तेमाल के उदाहरणों को मैनेज कर सकता है. साथ ही, ज़्यादा स्थितियों में डिवाइस की बेहतर टेस्टिंग की अनुमति देता है. अगर आप इस स्थिति में हैं, तो होस्ट-ड्रिवन टेस्ट लिखना सबसे सही रहेगा.

TF में होस्ट-ड्रिवन टेस्ट कैसे लिखे जाते हैं?

यहां एक सैंपल दिया गया है:

@RunWith(DeviceJUnit4ClassRunner.class)
public class SampleHostJUnit4DeviceTest extends BaseHostJUnit4Test {
    @Before
    public void setUp() throws Exception {
       // Some setup
    }

    @Test
    public void testCheckWeHaveDevice() throws Exception {
        Assert.assertNotNull(getDevice());
    }
}

Trade Federation में होस्ट-ड्रिवन टेस्ट, DeviceJUnit4ClassRunner JUnit4 टेस्ट रनर से चलाए जाते हैं. टेस्ट क्लास का पूरा स्ट्रक्चर, सामान्य JUnit4 टेस्ट जैसा ही होता है:

  • @BeforeClass
  • @Before
  • @Test
  • @After
  • @AfterClass
  • Assume, Assert

BaseHostJunit4Test को एक्सटेंशन देकर, टेस्टिंग के लिए काम की यूटिलिटी एपीआई को इनहेरिट किया जा सकता है. जैसे:

  • installPackage: टारगेट डिवाइस पर APK इंस्टॉल करने की अनुमति देता है.
  • installPackageAsUser: टारगेट डिवाइस पर उपयोगकर्ता के तौर पर APK इंस्टॉल करने की अनुमति देता है.
  • uninstallPackage: किसी APK को अनइंस्टॉल करने की अनुमति देता है.
  • isPackageInstalled: यह देखना कि कोई पैकेज इंस्टॉल है या नहीं.
  • hasDeviceFeature: देखें कि डिवाइस पर कोई सुविधा काम करती है या नहीं. (pm list features)
  • runDeviceTests(DeviceTestRunOptions options): सभी संभावित विकल्पों को मैनेज करने के लिए, DeviceTestRunOptions का इस्तेमाल करके, टारगेट किए गए डिवाइस के लिए इंस्ट्रुमेंटेशन टेस्ट चलाएं.

Tradefed डिवाइस ऑब्जेक्ट का ऐक्सेस भी दें:

  • getDevice(): डिवाइस में बदलाव करने के लिए, TF डिवाइस ऑब्जेक्ट दिखाता है.
  • getBuild(): बिल्ड के बारे में जानकारी पाने के लिए, बिल्ड की जानकारी वाला TF ऑब्जेक्ट दिखाता है.
  • getAbi(): वह एबीआई दिखाता है जिसके लिए टेस्ट किया जा रहा है.

Tradefed सहायता: हर क्लास के डिवाइस के लिए तैयारी और क्लीन अप

JUnit4 @BeforeClass और @AfterClass सिर्फ़ स्टैटिक तरीकों पर लागू होते हैं. इसलिए, #getDevice() हैंडलर का इस्तेमाल करके, डिवाइस के हिसाब से, हर क्लास के लिए एक बार सेटअप करने या क्लीन अप करने की सुविधा नहीं मिलती. इस समस्या को हल करने के लिए, Tradefed एनोटेशन का इस्तेमाल करें.

  • @BeforeClassWithInfo: यह एनोटेशन, @BeforeClass एनोटेशन से पहले चलता है
  • @AfterClassWithInfo: यह @AfterClass एनोटेशन के बाद चलता है
   @BeforeClassWithInfo
   public static void beforeClassWithDevice(TestInformation testInfo) {
       assertNotNull(testInfo.getDevice());
       testInfo.properties().put("mytest:test-prop", "test");
   }

   @AfterClassWithInfo
   public static void afterClassWithDevice(TestInformation testInfo) {
       assertNotNull(testInfo.getDevice());
       testInfo.properties().put("mytest:test-prop", "test");
   }

TestInformation की मदद से, डिवाइस और स्टोर प्रॉपर्टी का इस्तेमाल किया जा सकता है. इनका इस्तेमाल स्टैटिक या नॉन-स्टैटिक स्कोप में किया जा सकता है. BaseHostJUnit4Test, #getTestInformation() की मदद से TestInformation को नॉन-स्टैटिक स्कोप में पाने की सुविधा देता है.

अगर BaseHostJUnit4Test को एक्सटेंड नहीं किया जा रहा है, तो TestInformation ऑब्जेक्ट पाने के लिए, ITestInformationReceiver को लागू किया जा सकता है.

Tradefed में होस्ट-ड्रिवन टेस्ट को कॉन्फ़िगर कैसे करें?

Tradefed एक्सएमएल कॉन्फ़िगरेशन फ़ाइल में, होस्ट-ड्रिवन टेस्ट, HostTest रननर के ज़रिए चलाए जाते हैं.

<test class="com.android.tradefed.testtype.HostTest" >
    <option name="class" value="android.sample.cts.SampleHostJUnit4DeviceTest" />
</test>