सीटीएस डेवलपमेंट

Repo क्लाइंट शुरू करना

Android सोर्स कोड पाने और उसे बनाने के लिए, सोर्स डाउनलोड करना में दिए गए निर्देशों का पालन करें. repo init कमांड जारी करते समय, -b का इस्तेमाल करके, किसी खास सीटीएस ब्रांच के बारे में बताएं. इससे यह पक्का होता है कि आपके सीटीएस में किए गए बदलाव, सीटीएस के आने वाले वर्शन में शामिल किए जाएं.

यहां दिए गए उदाहरण कोड में, repo init का इस्तेमाल करने का तरीका बताया गया है.

mkdir android11-tests-dev && cd android11-tests-dev && repo init -c -u https://android.googlesource.com/platform/manifest -b android11-tests-dev --use-superproject --partial-clone --partial-clone-exclude=platform/frameworks/base --clone-filter=blob:limit=10M && repo sync -c -j8

सीटीएस बनाना और चलाना

सीटीएस बनाने और इंटरैक्टिव सीटीएस कंसोल शुरू करने के लिए, यहां दी गई कमांड चलाएं:

सीटीएस (AOSP 14 या इससे पहले का वर्शन) बनाना

cd /path/to/android/root
source build/envsetup.sh
make cts -j32 TARGET_PRODUCT=aosp_arm64
cts-tradefed

CTS (AOSP 15) बनाएं

cd /path/to/android/root
source build/envsetup.sh
make cts -j32 TARGET_PRODUCT=aosp_arm64 TARGET_RELEASE=target-release
cts-tradefed

target-release वैल्यू चुनने के लिए, कृपया यह टेबल देखें:

शाखा टारगेट रिलीज़
android15-tests-dev ap3a

CTS चलाएं

CTS कंसोल में, यह कमांड डालें:

tf> run cts --plan CTS

सीटीएस टेस्ट लिखना

CTS टेस्ट में JUnit और Android टेस्टिंग एपीआई का इस्तेमाल किया जाता है. cts/tests डायरेक्ट्री में मौजूद, अपने ऐप्लिकेशन की जांच करें ट्यूटोरियल और मौजूदा टेस्ट की समीक्षा करें. CTS टेस्ट में, ज़्यादातर उन्हीं नियमों का पालन किया जाता है जिनका इस्तेमाल Android के अन्य टेस्ट में किया जाता है.

CTS, कई प्रोडक्शन डिवाइसों पर चलता है. इसलिए, टेस्ट में इन नियमों का पालन करना ज़रूरी है:

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

Java एनोटेशन जोड़ना

अगर आपके टेस्ट से एपीआई के काम करने के तरीके की पुष्टि होती है, तो अपने टेस्ट कोड को @ApiTest से एनोटेट करें. साथ ही, apis फ़ील्ड में शामिल सभी एपीआई की सूची बनाएं. यहां दिए गए उदाहरणों में से सही फ़ॉर्मैट का इस्तेमाल करें:

एपीआई का टाइप एनोटेशन का फ़ॉर्मैट नोट
Method android.example.ClassA#methodA सबसे ज़्यादा इस्तेमाल किया जाने वाला उदाहरण.
की वैल्यू वाला तरीका android.example.ClassB#methodB(KeyA) इस एनोटेशन का इस्तेमाल सिर्फ़ तब करें, जब आपका टेस्ट किसी फ़ील्ड की पुष्टि करने के लिए एपीआई के किसी तरीके का इस्तेमाल करता हो. जैसे, इस उदाहरण में दिखाया गया है.
फ़ील्ड android.example.ClassC#FieldA इसका इस्तेमाल सिर्फ़ तब करें, जब आपका टेस्ट सीधे तौर पर किसी एपीआई फ़ील्ड की पुष्टि करता हो. जैसे, इस उदाहरण में दिखाया गया है.

अगर आपके टेस्ट से सीडीडी की किसी ज़रूरी शर्त की पुष्टि होती है, तो सीडीडी सेक्शन आईडी और ज़रूरी शर्त के आईडी सहित ज़रूरी शर्त के आईडी को @CddTest के साथ एनोटेट करें. ऐसा CTS टेस्ट कोड में करें, जैसा कि यहां दिए गए उदाहरण में दिखाया गया है. अपने कमिट मैसेज में बताएं कि आपका टेस्ट, सीडीडी की किस ज़रूरी शर्त को पूरा करता है. इसके लिए, सीडीडी की ज़रूरी शर्तों के आईडी का इस्तेमाल करें. सीडीडी की ज़रूरी शर्तों के आईडी, सेक्शन आईडी और ज़रूरी शर्तों के आईडी का कॉम्बिनेशन होते हैं. इन्हें स्लैश (/) से जोड़ा जाता है. जैसे, 7.3.1/C-1-1.


/**
* Verify Passpoint configuration management APIs for a Passpoint
* @throws Exception
*/
    @CddTest(requirement="7.4.2.3/C-1-1,C-2-1")
    public void testAddPasspointConfigWithUserCredential() throws Exception {
        if (!WifiFeature.isWifiSupported(getContext())) {
            // skip the test if WiFi is not supported
            return;
        }      testAddPasspointConfig(generatePasspointConfig(generateUserCredential()));
    }

CTS Verifier के लिए, अपने AndroidManifest.xml में मौजूद हर गतिविधि को ज़रूरी सीडीडी आईडी के साथ एनोटेट करें. वैल्यू फ़ील्ड के फ़ॉर्मैट, सीटीएस में Java एनोटेशन के फ़ॉर्मैट के जैसे होते हैं. कमिट मैसेज में, यह बताएं कि सीडीडी की कौनसी ज़रूरी शर्त लागू की गई है. इसके लिए, सीडीडी की ज़रूरी शर्त के आईडी का रेफ़रंस दें.


  <activity>
    ......
    <!-- OPTIONAL: Add a meta data attribute to indicate CDD requirements. -->
    <meta-data android:name="cdd_test" android:value="7.4.1/C-4-1" />

    <!-- OPTIONAL: Add a meta data attribute to indicate APIs being tested. -->
    <meta-data android:name="api_test"
               android:value="com.example.MyClass#myMethod" />

    <!-- OPTIONAL: Add a metadata attribute to indicate the reason why the test doesn't enforce any CDD requirement but still useful in CTS-V. -->
    <meta-data android:name="non_compliance_test"
               android:value="detailed reasons" />
  </activity>

कमिट मैसेज में

साफ़ तौर पर बताएं कि आपके टेस्ट को क्यों जोड़ा जाना चाहिए. साथ ही, सहायता के लिए ज़रूरी लिंक जोड़ें. CTS-D टेस्ट के लिए, उस टेस्ट प्रपोज़ल का लिंक शामिल करें जिसे आपने CTS-D सबमिट करने की प्रोसेस के तहत, Google Issue Tracker में बनाया था.

कोई सबप्लान बनाना

उदाहरण के लिए, android-cts/subplans में SubPlan.xml फ़ाइल इस तरह जोड़ी जा सकती है:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<SubPlan version="2.0">
<Entry include="CtsSystemIntentTestCases" />
<Entry include="CtsSystemUiHostTestCases" />
<Entry include="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testAospFileContexts" />
<Entry include="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testAospServiceContexts" />
</SubPlan>

सबप्लान चलाने के लिए:

run cts --subplan aSubPlan

सबप्लान की एंट्री का फ़ॉर्मैट यह है:

Include a module name as follows:
<Entry include="MODULE_NAME" />

Include a package:
<Entry include="MODULE_NAME PACKAGE_NAME" />

Include a class:
<Entry include="MODULE_NAME PACKAGE_NAME.CLASS_NAME" />

Include an individual test:
<Entry include="MODULE_NAME PACKAGE_NAME.CLASS_NAME#TEST_NAME" />

टेस्ट का नाम और जगह

ज़्यादातर सीटीएस टेस्ट केस, Android API में किसी क्लास को टारगेट करते हैं. इन टेस्ट के Java पैकेज के नाम में cts सफ़िक्स और क्लास के नाम में Test सफ़िक्स होता है. हर टेस्ट केस में कई टेस्ट होते हैं. इनमें से हर टेस्ट, आम तौर पर उस क्लास के किसी खास तरीके का इस्तेमाल करता है जिसकी जांच की जा रही है. इन टेस्ट को डायरेक्ट्री स्ट्रक्चर में व्यवस्थित किया जाता है. इसमें टेस्ट को अलग-अलग कैटगरी में ग्रुप किया जाता है, जैसे कि "विजेट" या "व्यू".

उदाहरण के लिए, Java पैकेज android.widget.TextView के लिए सीटीएस टेस्ट android.widget.cts.TextViewTest है. इसका Java पैकेज का नाम android.widget.cts और क्लास का नाम TextViewTest है.

  • Java पैकेज का नाम
    सीटीएस टेस्ट के लिए Java पैकेज का नाम, उस क्लास का पैकेज नाम होता है जिसकी जांच की जा रही है. इसके बाद, .cts होता है. उदाहरण के लिए, पैकेज का नाम android.widget.cts होगा.
  • क्लास का नाम
    सीटीएस टेस्ट के लिए क्लास का नाम, टेस्ट की जा रही क्लास का नाम होता है. इसके आखिर में "Test" जोड़ा जाता है. उदाहरण के लिए, अगर कोई टेस्ट TextView को टारगेट कर रहा है, तो क्लास का नाम TextViewTest होना चाहिए.
  • मॉड्यूल का नाम (सिर्फ़ CTS v2)
    CTS v2, टेस्ट को मॉड्यूल के हिसाब से व्यवस्थित करता है. मॉड्यूल का नाम आम तौर पर, Java पैकेज के नाम की दूसरी स्ट्रिंग होती है. हमारे उदाहरण में, यह widget है.

डायरेक्ट्री स्ट्रक्चर और सैंपल कोड, इस बात पर निर्भर करते हैं कि CTS v1 या CTS v2 में से किसका इस्तेमाल किया जा रहा है.

CTS v1

Android 6.0 या इससे पहले के वर्शन के लिए, CTS v1 का इस्तेमाल करें. CTS v1 के लिए, सैंपल कोड cts/tests/tests/example पर दिया गया है.

CTS v1 के टेस्ट में डायरेक्ट्री स्ट्रक्चर इस तरह दिखता है:

cts/
  tests/
    tests/
      package-name/
        Android.mk
        AndroidManifest.xml
        src/
          android/
            package-name/
              SampleDeviceActivity.java
              cts/
                SampleDeviceTest.java

CTS v2

Android 7.0 या इसके बाद के वर्शन के लिए, CTS v2 का इस्तेमाल करें. ज़्यादा जानकारी के लिए, Android ओपन सोर्स प्रोजेक्ट (AOSP) में सैंपल टेस्ट देखें.

CTS v2 डायरेक्ट्री का स्ट्रक्चर ऐसा दिखता है:

cts/
  tests/
    module-name/
      Android.mk
      AndroidManifest.xml
      src/
        android/
          package-name/
            SampleDeviceActivity.java
            cts/
              SampleDeviceTest.java

नए सैंपल पैकेज

नई जांच जोड़ते समय, हो सकता है कि आपकी जांच को रखने के लिए कोई मौजूदा डायरेक्ट्री न हो. ऐसे मामलों में, आपको डायरेक्ट्री बनानी होगी और सही सैंपल फ़ाइलें कॉपी करनी होंगी.

CTS v1

अगर CTS v1 का इस्तेमाल किया जा रहा है, तो cts/tests/tests/example में दिए गए उदाहरण देखें और नई डायरेक्ट्री बनाएं. साथ ही, पक्का करें कि आपने Android.mk से CTS_COVERAGE_TEST_CASE_LIST तक, cts/CtsTestCaseList.mk में अपने नए पैकेज के मॉड्यूल का नाम जोड़ा हो. build/core/tasks/cts.mk इस मेकफ़ाइल का इस्तेमाल करके, सभी टेस्ट को एक साथ जोड़ता है और फ़ाइनल सीटीएस पैकेज बनाता है.

CTS v2

सैंपल टेस्ट का इस्तेमाल करें /cts/tests/sample/ ताकि इन चरणों को पूरा करके, नए टेस्ट मॉड्यूल को तुरंत शुरू किया जा सके:

  1. टेस्ट डायरेक्ट्री बनाने और सैंपल फ़ाइलों को कॉपी करने के लिए, यह कमांड चलाएं:
    mkdir cts/tests/module-name && cp -r cts/tests/sample/* cts/tests/module-name
  2. cts/tests/module-name पर जाएं और "[Ss]ample" के सभी इंस्टेंस को ऊपर दिए गए नाम रखने के सुझाए गए तरीके से बदलें.
  3. जिस सुविधा को टेस्ट किया जा रहा है उसका इस्तेमाल करने के लिए, SampleDeviceActivity को अपडेट करें.
  4. SampleDeviceTest को अपडेट करें, ताकि यह पक्का किया जा सके कि गतिविधि पूरी हो गई है या इसकी गड़बड़ियों को लॉग किया गया है.

अन्य डायरेक्ट्री

assets, jni, libs, और res जैसी अन्य Android डायरेक्ट्री भी जोड़ी जा सकती हैं. जेएनआई कोड जोड़ने के लिए, प्रोजेक्ट के रूट में src के बगल में एक डायरेक्ट्री बनाएं. इसमें नेटिव कोड और Android.mk मेकफ़ाइल होनी चाहिए.

मेकफ़ाइल में आम तौर पर ये सेटिंग होती हैं:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libCtsSample_jni

# don't include this package in any target
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := list of source code files
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)

# Tag this module as a cts test artifact
LOCAL_COMPATIBILITY_SUITE := cts
LOCAL_SHARED_LIBRARIES := libnativehelper
LOCAL_SDK_VERSION := current
include $(BUILD_SHARED_LIBRARY)

Android.mk फ़ाइल

आखिर में, नेटिव कोड बनाने और उस पर निर्भर रहने के लिए, प्रोजेक्ट के रूट में मौजूद Android.mk फ़ाइल में बदलाव करें. इसके लिए, यहां दिया गया तरीका अपनाएं:

# All tests should include android.test.runner.
LOCAL_JAVA_LIBRARIES := android.test.runner

# Includes the jni code as a shared library
LOCAL_JNI_SHARED_LIBRARIES := libCtsSample_jni

# Include for InstrumentationCtsTestRunner
LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner...
LOCAL_SDK_VERSION := currentinclude $(BUILD_CTS_PACKAGE)

#Tells make to look in subdirectories for more make files to include
include $(call all-makefiles-under,$(LOCAL_PATH))

जांचों को ठीक करना या उन्हें हटाना

नए टेस्ट जोड़ने के साथ-साथ, BrokenTest या KnownFailure के तौर पर एनोटेट किए गए टेस्ट को ठीक किया जा सकता है या हटाया जा सकता है.

किए गए बदलाव सबमिट करना

CTS में बदलावों का योगदान देते समय, कोड में किए गए बदलाव सबमिट करने के वर्कफ़्लो का पालन करें.

  • एपीआई लेवल के आधार पर, डेवलपमेंट ब्रांच चुनें.
  • कमिट मैसेज में DO NOT MERGE या RESTRICT AUTOMERGE का इस्तेमाल करके, सही टेस्ट ब्रांच में बदलाव करें या उन्हें चुनें.

आपके बदलाव की समीक्षा करने के लिए, एक समीक्षक को असाइन किया जाता है. इसके बाद, वह समीक्षक आपके बदलाव को Gerrit के इंटरनल वर्शन में शामिल करता है.

रिलीज़ करने का शेड्यूल और ब्रांच की जानकारी

सीटीएस की रिलीज़, इस शेड्यूल के हिसाब से होती हैं.

वर्शन API स्तर डेवलपमेंट ब्रांच रिलीज़ होने की फ़्रीक्वेंसी
16+ 36+ इंटरनल Gerrit तीन महीने में एक बार
15 35 android15-tests-dev तीन महीने में एक बार
14 34 android14-tests-dev तीन महीने में एक बार
13 33 android13-tests-dev तीन महीने में एक बार

रिलीज़ के दौरान की अहम तारीखें

  • पहले हफ़्ते के आखिर में: कोड फ़्रीज़ हो जाता है. कोड फ़्रीज़ होने तक, ब्रांच में मर्ज किए गए बदलावों को सीटीएस के आने वाले वर्शन के लिए माना जाता है. कोड फ़्रीज़ होने के बाद या रिलीज़ के लिए उम्मीदवार चुनने के बाद, ब्रांच में सबमिट किए गए बदलावों को अगली रिलीज़ के लिए माना जाता है.
  • दूसरा या तीसरा हफ़्ता: CTS को Compatibility Test Suite के डाउनलोड पेज पर पब्लिश किया जाता है.

अपने-आप मर्ज होने की सुविधा

CTS की डेवलपमेंट ब्रांच सेट अप की गई हैं, ताकि हर ब्रांच में सबमिट किए गए बदलाव, अपने-आप बड़ी ब्रांच में मर्ज हो जाएं.

अगर AOSP की टेस्ट देव ब्रांच में सीधे तौर पर बदलाव किए जाते हैं, तो ऑटोमर्ज का पाथ यह होगा:
android13-tests-dev > android14-tests-dev > android15-tests-dev

  • CTS 16+ वर्शन के लिए, समीक्षक बदलाव को इंटरनल Gerrit में अपनी पसंद के मुताबिक चुनेगा.

अगर कोई बदलाव सूची (सीएल) सही तरीके से मर्ज नहीं होती है, तो पैच के लेखक को एक ईमेल भेजा जाता है. इसमें टकराव को हल करने के बारे में निर्देश दिए जाते हैं. ज़्यादातर मामलों में, पैच का लेखक निर्देशों का इस्तेमाल करके, टकराव वाले सीएल को अपने-आप मर्ज होने से रोक सकता है.

अगर किसी पुरानी ब्रांच में बदलाव करना है, तो पैच को नई ब्रांच से चेरी-पिक करना होगा.

अगर आपको Android के अगले वर्शन पर लागू होने वाले बदलावों को टेस्ट करना है, तो बदलाव अपलोड करने के बाद Google उसकी समीक्षा करता है. अगर बदलाव स्वीकार कर लिया जाता है, तो Google उसे इंटरनल Gerrit में शामिल कर लेता है.