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