इस पेज पर, Tradefed में नया टेस्ट रनर लिखने का तरीका बताया गया है.
बैकग्राउंड
अगर आपको Tradefed के आर्किटेक्चर में टेस्ट रनर की जगह के बारे में जानना है, तो टेस्ट रनर का स्ट्रक्चर देखें.
नया टेस्ट रनर लिखने के लिए, यह ज़रूरी नहीं है. टेस्ट रनर को अलग से लिखा जा सकता है.
ज़रूरी शर्तें: इंटरफ़ेस लागू करना
Tradefed टेस्ट रननर के तौर पर शामिल होने के लिए, IRemoteTest इंटरफ़ेस और खास तौर पर run(TestInformation testInfo, ITestInvocationListener listener)
तरीका लागू करना ज़रूरी है.
टेस्ट रनर का इस्तेमाल करते समय, हार्नेस इस तरीके को शुरू करता है. यह Java Runnable की तरह ही होता है.
उस तरीके के हर हिस्से को टेस्ट रनर के एक्सीक्यूशन का हिस्सा माना जाता है.
टेस्ट रनर से मिले नतीजे
बेस इंटरफ़ेस में run
तरीका, ITestInvocationListener
टाइप के किसी लिसनर ऑब्जेक्ट का ऐक्सेस देता है. यह ऑब्जेक्ट, टेस्ट रनर से हार्नेस तक, स्ट्रक्चर्ड नतीजों को रिपोर्ट करने के लिए अहम है.
स्ट्रक्चर्ड डेटा के नतीजों की रिपोर्टिंग करने पर, टेस्ट रनर में ये प्रॉपर्टी होती हैं:
- उन सभी टेस्ट की सही सूची दें जो चलाए गए, उन्हें पूरा होने में कितना समय लगा, और क्या वे अलग-अलग पास हुए, फ़ेल हुए या किसी दूसरी स्थिति में हैं.
- अगर लागू हो, तो टेस्ट से जुड़ी मेट्रिक की रिपोर्ट करें. उदाहरण के लिए, इंस्टॉलेशन के समय की मेट्रिक.
- ज़्यादातर इन्फ़्रास्ट्रक्चर टूल के साथ काम करना, जैसे कि नतीजे और मेट्रिक वगैरह दिखाना.
- आम तौर पर, इसे डीबग करना आसान होता है, क्योंकि इसमें प्रोग्राम के रन होने की पूरी जानकारी होती है.
हालांकि, स्ट्रक्चर्ड डेटा के नतीजों को रिपोर्ट करना ज़रूरी नहीं है. हो सकता है कि टेस्ट रन करने वाला व्यक्ति, रन की स्थिति को 'पास' या 'फेल' के तौर पर ही बताना चाहे.
इवेंट के ट्रिगर होने पर, इन इवेंट को लिसनर पर कॉल किया जा सकता है, ताकि हार्नेस को ट्रिगर होने की मौजूदा स्थिति की सूचना दी जा सके:
- testRunStarted: एक साथ काम करने वाले टेस्ट केस के ग्रुप के शुरू होने की सूचना देता है.
- testStarted: किसी टेस्ट केस के शुरू होने की सूचना देता है.
- testFailed/testIgnored: इससे, टेस्ट केस की स्थिति में हुए बदलाव की सूचना मिलती है. जिस टेस्ट केस के स्टेटस में कोई बदलाव नहीं होता उसे पास माना जाता है.
- testEnded: टेस्ट केस के खत्म होने की सूचना देता है.
- testRunFailed: इससे पता चलता है कि टेस्ट केस के ग्रुप को चलाने का स्टेटस 'पूरी तरह से गड़बड़ी' है. टेस्ट रन के नतीजे पास या फ़ेल हो सकते हैं. यह इस बात पर निर्भर करता है कि टेस्ट केस के नतीजों के आधार पर, प्रोग्राम को कैसे चलाया गया था. उदाहरण के लिए, कई टेस्ट केस चलाने वाली बाइनरी, सभी टेस्ट केस पास होने की रिपोर्ट दे सकती है. हालांकि, ऐसा गड़बड़ी वाले एग्ज़िट कोड के साथ किया जा सकता है. ऐसा कई वजहों से हो सकता है, जैसे कि लीक हुई फ़ाइलें वगैरह.
- testRunEnded: टेस्ट केस के ग्रुप के खत्म होने की सूचना देना.
टेस्ट रनर लागू करने वाले व्यक्ति की यह ज़िम्मेदारी है कि वह कॉलबैक के सही क्रम को बनाए रखे और पक्का करे. उदाहरण के लिए, यह पक्का करना कि finally
क्लॉज़ का इस्तेमाल करके अपवाद के मामले में testRunEnded
को कॉल किया जाए.
टेस्ट केस कॉलबैक (testStarted
, testEnded
वगैरह) ज़रूरी नहीं हैं. ऐसा हो सकता है कि कोई टेस्ट केस मौजूद न होने पर भी टेस्ट रन हो जाए.
आपको यह दिख सकता है कि इवेंट का यह स्ट्रक्चर, सामान्य JUnit स्ट्रक्चर से प्रेरित है. ऐसा इसलिए किया गया है, ताकि डेवलपर को उन बुनियादी चीज़ों के बारे में जानकारी मिल सके जिनके बारे में आम तौर पर उन्हें पता होता है.
टेस्ट रनर से रिपोर्ट लॉग
अगर आपको अपनी Tradefed टेस्ट क्लास या रननर लिखनी है, तो आपको IRemoteTest लागू करना होगा और run()
तरीके से ITestInvocationListener
मिलेगा. इस लिसनर का इस्तेमाल, फ़ाइलों को लॉग करने के लिए इस तरह किया जा सकता है:
listener.testLog(String dataName, LogDataType type_of_data, InputStreamSource data);
किसी डिवाइस से जांच करना
ऊपर दिए गए इंटरफ़ेस की मदद से, अलग-अलग टेस्ट चलाए जा सकते हैं. ये टेस्ट बहुत आसान होते हैं और इनके लिए किसी खास संसाधन की ज़रूरत नहीं होती. जैसे, Java यूनिट टेस्ट.
टेस्ट राइटर को डिवाइस टेस्टिंग के अगले चरण पर जाने के लिए, इन इंटरफ़ेस की ज़रूरत होगी:
- IDeviceTest की मदद से,
ITestDevice
ऑब्जेक्ट को ऐक्सेस किया जा सकता है. यह ऑब्जेक्ट, टेस्ट किए जा रहे डिवाइस की जानकारी देता है. साथ ही, उससे इंटरैक्ट करने के लिए एपीआई भी उपलब्ध कराता है. - IBuildReceiver की मदद से, टेस्ट में बिल्ड प्रोवाइडर चरण में बनाया गया
IBuildInfo
ऑब्जेक्ट पाया जा सकता है. इसमें, टेस्ट सेटअप से जुड़ी सारी जानकारी और आर्टफ़ैक्ट शामिल होते हैं.
टेस्ट रनर आम तौर पर इन इंटरफ़ेस में दिलचस्पी लेते हैं, ताकि वे रन करने से जुड़े आर्टफ़ैक्ट पा सकें. जैसे, अतिरिक्त फ़ाइलें. साथ ही, वे टेस्ट किए जा रहे उस डिवाइस को भी पा सकें जिसे रन करने के दौरान टारगेट किया जाएगा.
कई डिवाइसों पर टेस्ट करना
Tradefed की मदद से, एक ही समय पर कई डिवाइसों पर टेस्ट चलाए जा सकते हैं. यह उन कॉम्पोनेंट की जांच करते समय मददगार होता है जिनके लिए बाहरी इंटरैक्शन की ज़रूरत होती है. जैसे, फ़ोन और स्मार्टवॉच को जोड़ना.
एक ऐसा टेस्ट रनर लिखने के लिए जो कई डिवाइसों का इस्तेमाल कर सके, आपको IMultiDeviceTest लागू करना होगा. इससे आपको ITestDevice
से IBuildInfo
तक का मैप मिलेगा. इसमें डिवाइस के रिप्रज़ेंटेशन और उनसे जुड़ी बिल्ड की पूरी जानकारी शामिल होगी.
इंटरफ़ेस से सेटर को हमेशा run
तरीके से पहले कॉल किया जाएगा. इसलिए, यह मान लेना सुरक्षित है कि run
को कॉल करने पर स्ट्रक्चर उपलब्ध होगा.
ऐसे टेस्ट जिनके सेटअप के बारे में जानकारी होती है
कुछ टेस्ट रनर को सही तरीके से काम करने के लिए, पूरे सेटअप के बारे में जानकारी की ज़रूरत पड़ सकती है. उदाहरण के लिए, कॉल करने के बारे में कुछ मेटाडेटा या पहले कौनसा target_preparer
चला था वगैरह.
ऐसा करने के लिए, टेस्ट रनर उस IConfiguration
ऑब्जेक्ट को ऐक्सेस कर सकता है जिसका वह हिस्सा है और जिसमें उसे चलाया जाता है. ज़्यादा जानकारी के लिए, कॉन्फ़िगरेशन ऑब्जेक्ट का ब्यौरा देखें.
टेस्ट रनर लागू करने के लिए, आपको IConfiguration
ऑब्जेक्ट पाने के लिए,
IConfigurationReceiver को लागू करना होगा.
फ़्लेक्सिबल टेस्ट रनर
टेस्ट रनर, टेस्ट को चलाने का आसान तरीका उपलब्ध करा सकते हैं. हालांकि, इसके लिए ज़रूरी है कि उनके पास टेस्ट को पूरी तरह से कंट्रोल करने की सुविधा हो. उदाहरण के लिए, JUnit टेस्ट रनर, हर यूनिट टेस्ट को अलग-अलग चला सकता है.
इससे बड़े हार्नेस और इन्फ़्रास्ट्रक्चर को बेहतर कंट्रोल का फ़ायदा मिलता है. साथ ही, उपयोगकर्ता फ़िल्टर करने की सुविधा की मदद से, टेस्ट रनर को कुछ हद तक चला सकते हैं.
फ़िल्टर करने की सुविधा के बारे में ITestFilterReceiver इंटरफ़ेस में बताया गया है. इसकी मदद से, उन टेस्ट के लिए include
और exclude
फ़िल्टर के सेट पाने की अनुमति मिलती है जिन्हें चलाया जाना चाहिए या नहीं.
हमारा नियम है कि कोई टेस्ट तब ही चलेगा, जब वह शामिल किए गए एक या उससे ज़्यादा फ़िल्टर से मेल खाए और बाहर रखे गए किसी भी फ़िल्टर से मेल न खाए. अगर शामिल करने वाले कोई फ़िल्टर नहीं दिया गया है, तो सभी टेस्ट तब तक चलाए जाने चाहिए, जब तक वे बाहर रखने वाले किसी भी फ़िल्टर से मैच नहीं करते.