इस पेज में बताया गया है कि ट्रेडफ़ेड में, टेस्ट रनर का नया प्रोग्राम कैसे लिखें.
बैकग्राउंड
अगर आपको 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
फ़िल्टर के सेट पाने की अनुमति मिलती है जिन्हें चलाया जाना चाहिए या नहीं.
हमारा मानना है कि टेस्ट आईएफ़एफ़ चलाया जाता है. यह एक या एक से ज़्यादा इनक्लूड फ़िल्टर से मैच होता है और किसी भी एक्सक्लूज़न फ़िल्टर से मैच नहीं करता है. अगर फ़िल्टर शामिल करने का कोई फ़िल्टर नहीं दिया गया है, तो सभी टेस्ट तब तक चलाए जाने चाहिए, जब तक वे किसी भी फ़िल्टर से मैच न करते हों.