इस पेज पर, Tradefed में नया टेस्ट रनर लिखने का तरीका बताया गया है.
बैकग्राउंड
अगर आपको Tradefed के आर्किटेक्चर में टेस्ट रनर की जगह के बारे में जानना है, तो टेस्ट रनर का स्ट्रक्चर देखें.
नया टेस्ट रनर लिखने के लिए, यह ज़रूरी नहीं है कि आपने पहले कोई टेस्ट रनर लिखा हो. टेस्ट रनर को अलग से भी लिखा जा सकता है.
ज़रूरी शर्तें: इंटरफ़ेस लागू करना
Tradefed टेस्ट रनर के तौर पर शामिल होने के लिए, IRemoteTest इंटरफ़ेस और खास तौर पर run(TestInformation testInfo, ITestInvocationListener listener)
तरीका लागू करना ज़रूरी है.
टेस्ट रनर का इस्तेमाल करते समय, हार्नेस इस तरीके को शुरू करता है. यह Java Runnable की तरह ही होता है.
उस तरीके के हर हिस्से को टेस्ट रनर के एक्सीक्यूशन का हिस्सा माना जाता है.
टेस्ट रनर से मिले नतीजों की रिपोर्ट करना
बेस इंटरफ़ेस में मौजूद run
तरीका, ITestInvocationListener
टाइप के लिसनर ऑब्जेक्ट को ऐक्सेस देता है. यह ऑब्जेक्ट, टेस्ट रनर से हार्नेस तक, स्ट्रक्चर्ड नतीजों को रिपोर्ट करने के लिए अहम है.
स्ट्रक्चर्ड डेटा के नतीजों की रिपोर्टिंग करने पर, टेस्ट रनर में ये प्रॉपर्टी होती हैं:
- चलाए गए सभी टेस्ट की एक सही सूची दें. इसमें उन्हें यह जानकारी दें कि टेस्ट में कितना समय लगा, और वे व्यक्तिगत तौर पर पास हो गए, फ़ेल हुए या किसी और स्थिति में.
- अगर लागू हो, तो टेस्ट से जुड़ी मेट्रिक की रिपोर्ट करें. उदाहरण के लिए, इंस्टॉलेशन के समय की मेट्रिक.
- ज़्यादातर इन्फ़्रास्ट्रक्चर टूल के साथ काम करना, जैसे कि नतीजे और मेट्रिक वगैरह दिखाना.
- आम तौर पर, इसे डीबग करना आसान होता है, क्योंकि इसमें प्रोग्राम के रन होने की पूरी जानकारी होती है.
हालांकि, स्ट्रक्चर्ड डेटा के नतीजों को रिपोर्ट करना ज़रूरी नहीं है. हो सकता है कि टेस्ट रन करने वाला व्यक्ति, रन की स्थिति को 'पास' या 'फेल' के तौर पर ही बताना चाहे.
इवेंट के ट्रिगर होने पर, इन इवेंट को लिसनर पर कॉल किया जा सकता है, ताकि हार्नेस को ट्रिगर होने की मौजूदा स्थिति की सूचना दी जा सके:
- testRunStarted: एक साथ काम करने वाले टेस्ट केस के ग्रुप के शुरू होने की सूचना देता है.
- testStarted: टेस्ट केस शुरू होने की सूचना दें.
- testFailed/testIgnored: इससे, टेस्ट केस की स्थिति में हुए बदलाव की सूचना मिलती है. जिस टेस्ट केस के स्टेटस में कोई बदलाव नहीं होता उसे पास माना जाता है.
- testEnded: टेस्ट केस के खत्म होने की सूचना देता है.
- जांच नहीं हो सकी: सूचना दें कि जांच के मामलों के ग्रुप की जांच पूरी नहीं हो पाई. टेस्ट रन के नतीजे पास या फेल हो सकते हैं. यह इस बात पर निर्भर करता है कि टेस्ट केस के नतीजों के आधार पर, प्रोग्राम को कैसे चलाया गया था. उदाहरण के लिए, कई टेस्ट केस चलाने वाली बाइनरी, सभी टेस्ट केस पास होने की रिपोर्ट दे सकती है. हालांकि, ऐसा गड़बड़ी वाले एग्ज़िट कोड के साथ किया जा सकता है. ऐसा किसी भी वजह से हो सकता है, जैसे कि लीक हुई फ़ाइलें वगैरह.
- testRunEnded: टेस्ट केस के ग्रुप के खत्म होने की सूचना देना.
टेस्ट रनर लागू करने वाले व्यक्ति की यह ज़िम्मेदारी है कि वह कॉलबैक के सही क्रम को बनाए रखे और पक्का करे. उदाहरण के लिए, यह पक्का करना कि finally
क्लॉज़ का इस्तेमाल करके अपवाद के मामले में testRunEnded
को कॉल किया जाए.
टेस्ट केस कॉलबैक (testStarted
, testEnded
वगैरह) ज़रूरी नहीं हैं. किसी भी टेस्ट केस के बिना भी टेस्ट रन हो सकता है.
आपको यह दिख सकता है कि इवेंट का यह स्ट्रक्चर, सामान्य JUnit स्ट्रक्चर से प्रेरित है. ऐसा इसलिए किया गया है, ताकि डेवलपर को उन बुनियादी चीज़ों के बारे में जानकारी मिल सके जिनके बारे में आम तौर पर उन्हें पता होता है.
टेस्ट रनर से रिपोर्ट लॉग
अगर आप अपनी खुद की ट्रेडेड टेस्ट क्लास लिख रहे हैं या रनर है, तो आपको 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
फ़िल्टर के सेट पाए जा सकते हैं जिन्हें चलाना या नहीं चलाना चाहिए.
हमारा नियम है कि कोई टेस्ट तब ही चलेगा, जब वह शामिल किए गए एक या एक से ज़्यादा फ़िल्टर से मेल खाए और बाहर रखे गए किसी भी फ़िल्टर से मेल न खाए. अगर फ़िल्टर शामिल करने का कोई फ़िल्टर नहीं दिया गया है, तो सभी टेस्ट तब तक चलाए जाने चाहिए, जब तक वे किसी भी फ़िल्टर से मैच न करते हों.