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>