TF में होस्ट-साइड डिवाइसलेस टेस्ट लिखना

इस पेज पर, होस्ट-साइड टेस्ट लिखने का तरीका बताया गया है. इसके लिए, डिवाइस की ज़रूरत नहीं होती. जैसे, Linux GCE इंस्टेंस पर चलने वाला टेस्ट. (डिवाइस की ज़रूरत वाले होस्ट-ड्राइव टेस्ट लिखने के बारे में ज़्यादा जानने के लिए, Trade Federation में होस्ट-ड्राइव टेस्ट लिखना लेख पढ़ें.)

होस्ट-साइड टेस्ट के टाइप

Trade Federation (TF) की मदद से, होस्ट-साइड के कई तरह के टेस्ट किए जा सकते हैं.

नेटिव (gtest) टेस्ट

किसी प्लैटफ़ॉर्म को टेस्ट करने के लिए, नेटिव टेस्ट (gtests) बनाएं. अगर टेस्ट के लिए डिवाइस की ज़रूरत नहीं है, तो उसे किसी होस्ट पर चलाएं. इससे टेस्ट बहुत तेज़ी से पूरा होगा. टेस्ट होस्ट पर ऐसे टेस्ट चलाने के लिए, TF रनर HostGTest का इस्तेमाल करें.

यह TradeFed टेस्ट कॉन्फ़िगरेशन का सैंपल है:

<configuration description="Runs hello_world_test.">
    <option name="null-device" value="true" />
    <test class="com.android.tradefed.testtype.HostGTest" >
        <option name="module-name" value="hello_world_test" />
    </test>
</configuration>

टेस्ट कॉन्फ़िगरेशन, होस्ट पर gtest टेस्ट (hello_world_test) चलाता है. उदाहरण के तौर पर दिए गए टेस्ट कॉन्फ़िगरेशन को अपने-आप जनरेट किया जा सकता है. अगर आपके टेस्ट के लिए किसी खास सेटअप या क्लीनअप की ज़रूरत नहीं है, तो टीएफ़ टेस्ट के सही कॉन्फ़िगरेशन बनाने के लिए, टेस्ट कॉन्फ़िगरेशन अपने-आप जनरेट होने की सुविधा का इस्तेमाल किया जा सकता है.

होस्ट-साइड gtest को कॉन्फ़िगर करने और टेस्ट कॉन्फ़िगरेशन अपने-आप जनरेट होने की सुविधा चालू करने के लिए, Android.bp में host_supported को true पर सेट करें. जैसे, hello_world_test में किया गया है.

नेटिव टेस्ट लिखने के बारे में ज़्यादा जानकारी के लिए, नया नेटिव टेस्ट जोड़ने का उदाहरण देखें.

ज़ार होस्ट टेस्ट

JAR (Java) होस्ट टेस्ट, जैसे कि JUnit, ऐसे टेस्ट होते हैं जिन्हें डिवाइस पर चलाने की ज़रूरत नहीं होती. ये आपके Java प्रोजेक्ट के कोड कवरेज की जानकारी देते हैं. ऐसे टेस्ट को, टेस्ट होस्ट पर चलाने के लिए कॉन्फ़िगर किया जा सकता है. इसके लिए, रनर HostTest का इस्तेमाल करें.

TradeFed टेस्ट कॉन्फ़िगरेशन का सैंपल

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.HostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

टेस्ट कॉन्फ़िगरेशन, HelloWorldHostTest का होस्ट-साइड JUnit टेस्ट चलाता है. ध्यान दें कि ऊपर दिया गया टेस्ट कॉन्फ़िगरेशन, अपने-आप जनरेट हो सकता है. अगर आपके टेस्ट के लिए किसी खास सेटअप या क्लीनअप की ज़रूरत नहीं है, तो TradeFed टेस्ट का सही कॉन्फ़िगरेशन बनाने के लिए, टेस्ट-कॉन्फ़िग जनरेट करने की सुविधा पर भरोसा करें.

JAR होस्ट टेस्ट लिखने के तरीके के बारे में ज़्यादा जानने के लिए, JAR (Java) होस्ट टेस्ट पेज पर जाएं.

अलग किए गए Java होस्ट टेस्ट

डिवाइस के बिना Java टेस्ट, आइसोलेशन एनवायरमेंट में चलाए जा सकते हैं. हालांकि, इससे परफ़ॉर्मेंस पर थोड़ा असर पड़ सकता है. हालांकि, इस एनवायरमेंट का इस्तेमाल करने से पहले, कुछ बातों का ध्यान रखना ज़रूरी है.

  • यह Robolectric और JUnit यूनिट टेस्ट के लिए इस्तेमाल किया जाने वाला डिफ़ॉल्ट रनर है
  • Tradefed, आइसोलेशन एनवायरमेंट में सिर्फ़ JUnit टेस्ट के साथ काम करता है.
  • सिर्फ़ स्टैटिक तौर पर लिंक की गई डिपेंडेंसी काम करती हैं. क्लाथपाथ में, lib के साथ कोई डिपेंडेंसी शामिल नहीं की गई है.
  • आइसोलेशन रनर, सिर्फ़ शिम रनर और आपकी टेस्ट जार को क्लासपाथ पर रखता है.
  • इस रनर के साथ किए गए हर टेस्ट रन के लिए, कुछ तय ओवरहेड होता है.

Tradefed टेस्ट कॉन्फ़िगरेशन का सैंपल (आइसोलेट किया गया)

<configuration description="Executes HelloWorldHostTest">
    <test class="com.android.tradefed.testtype.IsolatedHostTest" >
        <option name="jar" value="HelloWorldHostTest.jar" />
    </test>
</configuration>

अपने-आप जनरेट होने की सुविधा के लिए, Soong कॉन्फ़िगरेशन का सैंपल

ऊपर दिए गए तरीके से टेस्ट कॉन्फ़िगरेशन को मैन्युअल तरीके से बनाने के बजाय, Soong इस उदाहरण में दिए गए एलान का इस्तेमाल करके, कॉन्फ़िगरेशन को अपने-आप जनरेट कर सकता है.

java_test_host {
    name: "HelloWorldHostTest",

    test_options: {
        unit_test: true,
    },

    test_suites: ["general-tests"],

    srcs: ["test/**/*.java"],

    static_libs: [
        "junit",
    ],
}

Robolectric टेस्ट

Robolectric टेस्ट, आइसोलेटेड होस्ट टेस्ट की तरह ही रनर का इस्तेमाल करते हैं. हालांकि, इनमें कुछ खास विकल्प होते हैं.

  • robolectric-resources विकल्प, Robolectric के लिए खास तौर पर बनाए गए कुछ कमांड लाइन विकल्पों को सबप्रोसेस में पास करने की सुविधा देता है. साथ ही, android-all के ट्री बिल्ड को सबप्रोसेस क्लासपाथ में जोड़ता है. अन्य दो विकल्प सबसे सही तरीके हैं, लेकिन इस विकल्प का इस्तेमाल करना ज़रूरी है, ताकि Robolectric टेस्ट को सही तरीके से चलाया जा सके.
  • java-folder विकल्प की मदद से, सबप्रोसेस के लिए इस्तेमाल किए जाने वाले Java रनटाइम को बदला जा सकता है. ऐसा करना इसलिए ज़रूरी है, क्योंकि Robolectric कुछ खास Java वर्शन को प्राथमिकता देता है. ऐसा हो सकता है कि ये वर्शन, होस्ट सिस्टम के पसंदीदा JVM के साथ काम न करें.
  • exclude-paths विकल्प की मदद से, सबप्रोसेस रनर को कुछ मॉड्यूल लोड करने से रोका जा सकता है. यह विकल्प तब काम आता है, जब JAR में ऐसी अतिरिक्त क्लास शामिल हों जिनकी वजह से लोड करने में गड़बड़ियां हो सकती हैं. java. को आम तौर पर शामिल नहीं किया जाता है, ताकि SecurityException अपवाद न दिखें.

Robolectric कॉन्फ़िगरेशन का सैंपल

<configuration description="Executes a Sample Robolectric Test">
    <option name="java-folder" value="prebuilts/jdk/jdk9/linux-x86/" />
    <option name="exclude-paths" value="java" />
    <option name="use-robolectric-resources" value="true" />
    <test class="com.android.tradefed.testtype.IsolatedHostTest">
        <option name="jar" value="RobolectricExampleTest.jar" />
    </test>
</configuration>

Robolectric की अपने-आप जनरेट होने वाली सुविधा के लिए, Soong कॉन्फ़िगरेशन का सैंपल

ऊपर दिए गए उदाहरण की तरह, टेस्ट कॉन्फ़िगरेशन को मैन्युअल तरीके से बनाने के बजाय, Soong इस उदाहरण में दिए गए एलान का इस्तेमाल करके, कॉन्फ़िगरेशन को अपने-आप जनरेट कर सकता है.

android_robolectric_test {
    name: "HelloWorldRoboTest",
    srcs: [
        "src/**/*.java",
    ],

    // Include the testing libraries
    static_libs: [
        "mockito-robolectric-prebuilt",
        "platform-test-annotations",
        "testng",
        "truth-prebuilt",
    ],

    instrumentation_for: "HelloWorldApp",
}

Python टेस्ट

अगर टेस्ट लॉजिक को Python में लिखा गया है, तो python_test_host बिल्ड टाइप का इस्तेमाल करके एक par फ़ाइल बनाएं. इसे TF PythonBinaryHostTest से चलाया जा सकता है.

TradeFed टेस्ट कॉन्फ़िगरेशन का सैंपल

<configuration description="Config to run atest unittests">
    <test class="com.android.tradefed.testtype.python.PythonBinaryHostTest" >
        <option name="par-file-name" value="atest_unittests" />
        <option name="test-timeout" value="2m" />
    </test>
</configuration>

टेस्ट सुइट की सेटिंग

किसी बिल्ड के लिए, होस्ट-साइड टेस्ट को टीएफ़ के लिए ऐक्सेस किया जा सके, इसके लिए टेस्ट मॉड्यूल की `test_suites` सेटिंग को `general-tests` पर सेट करें:

test_suites: ["general-tests"],

इस सेटिंग की मदद से, टेस्ट को general-tests.zip पर test_suites टारगेट के हिसाब से पैकेज किया जाता है.