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(): यह बिल्ड के बारे में जानकारी पाने के लिए, बिल्ड इन्फ़ो टीएफ़ ऑब्जेक्ट दिखाता है.
  • 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>