इस पेज पर, 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
लागू करना होगा. साथ ही, ITestInvocationListener तरीके से run() मिलेगा. इस लिसनर का इस्तेमाल, लॉग फ़ाइलें बनाने के लिए किया जा सकता है. इसके लिए, यह तरीका अपनाएं:
listener.testLog(String dataName, LogDataType type_of_data, InputStreamSource data);
किसी डिवाइस के साथ टेस्ट करना
ऊपर बताया गया कम से कम इंटरफ़ेस, बहुत आसान टेस्ट चलाने की अनुमति देता है. ये टेस्ट अलग-अलग होते हैं और इनके लिए किसी खास संसाधन की ज़रूरत नहीं होती. उदाहरण के लिए, Java यूनिट टेस्ट.
डिवाइस टेस्टिंग के अगले चरण पर जाने के लिए, टेस्ट राइटर को इन इंटरफ़ेस की ज़रूरत होगी:
- IDeviceTest
से,
ITestDeviceऑब्जेक्ट मिलता है. यह ऑब्जेक्ट, टेस्ट किए जा रहे डिवाइस को दिखाता है. साथ ही, इससे इंटरैक्ट करने के लिए एपीआई उपलब्ध कराता है. - IBuildReceiver
से, टेस्ट को
IBuildInfoऑब्जेक्ट मिलता है. यह ऑब्जेक्ट, बिल्ड प्रोवाइडर के चरण में बनाया जाता है. इसमें टेस्ट सेटअप से जुड़ी सभी जानकारी और आर्टफ़ैक्ट शामिल होते हैं.
टेस्ट रनर को आम तौर पर इन इंटरफ़ेस में दिलचस्पी होती है, ताकि एक्ज़ीक्यूशन से जुड़े आर्टफ़ैक्ट मिल सकें. उदाहरण के लिए, अतिरिक्त फ़ाइलें. साथ ही, टेस्ट किए जा रहे डिवाइस की जानकारी मिल सके, जिसे एक्ज़ीक्यूशन के दौरान टारगेट किया जाएगा.
एक से ज़्यादा डिवाइसों के साथ टेस्ट करना
Tradefed, एक ही समय में कई डिवाइसों पर टेस्ट चलाने की सुविधा देता है. यह सुविधा, उन कॉम्पोनेंट की टेस्टिंग के लिए काम की है जिनके लिए बाहरी इंटरैक्शन की ज़रूरत होती है. जैसे, फ़ोन और घड़ी की पेयरिंग.
एक से ज़्यादा डिवाइसों का इस्तेमाल करने वाला टेस्ट रनर लिखने के लिए, आपको
IMultiDeviceTest लागू करना होगा,
जिससे ITestDevice से IBuildInfo का मैप मिलेगा. इसमें
डिवाइस के सभी रेप्रज़ेंटेशन और उनसे जुड़ी बिल्ड की जानकारी शामिल होती है.
इंटरफ़ेस सेटर को हमेशा run तरीके से पहले कॉल किया जाएगा. इसलिए, यह माना जा सकता है कि run को कॉल किए जाने पर, स्ट्रक्चर उपलब्ध होगा.
अपने सेटअप के बारे में जानकारी रखने वाले टेस्ट
कुछ टेस्ट रनर को लागू करने के लिए, पूरे सेटअप के बारे में जानकारी की ज़रूरत हो सकती है. उदाहरण के लिए, इनवोकेशन के बारे में कुछ मेटाडेटा या पहले कौनसे target_preparer चले वगैरह.
ऐसा करने के लिए, टेस्ट रनर उस IConfiguration ऑब्जेक्ट को ऐक्सेस कर सकता है जिसका वह हिस्सा है और जिसमें वह एक्ज़ीक्यूट होता है. ज़्यादा जानकारी के लिए,
कॉन्फ़िगरेशन ऑब्जेक्ट
का ब्यौरा देखें.
टेस्ट रनर को लागू करने के लिए, आपको
IConfigurationReceiver
लागू करना होगा ताकि IConfiguration ऑब्जेक्ट मिल सके.
फ़्लेक्सिबल टेस्ट रनर
टेस्ट रनर, अपने टेस्ट चलाने का फ़्लेक्सिबल तरीका उपलब्ध करा सकते हैं. इसके लिए, उन पर ग्रेन्यूलर कंट्रोल होना चाहिए. उदाहरण के लिए, JUnit टेस्ट रनर, हर यूनिट टेस्ट को अलग-अलग चला सकता है.
इससे, बड़े हार्नेस और इन्फ़्रास्ट्रक्चर को उस फ़ाइन कंट्रोल का फ़ायदा मिलता है. साथ ही, उपयोगकर्ता फ़िल्टरिंग की मदद से, टेस्ट रनर को आंशिक तौर पर चला सकते हैं.
फ़िल्टरिंग की सुविधा के बारे में,
ITestFilterReceiver इंटरफ़ेस में बताया गया है.
इससे, उन टेस्ट के लिए include और exclude फ़िल्टर के सेट मिलते हैं
जिन्हें चलाना चाहिए या नहीं चलाना चाहिए.
हमारी नीति के मुताबिक, कोई टेस्ट तब चलेगा, जब वह एक या उससे ज़्यादा 'शामिल करें' फ़िल्टर से मेल खाता हो और किसी भी 'शामिल न करें' फ़िल्टर से मेल न खाता हो. अगर 'शामिल करें' फ़िल्टर नहीं दिए जाते हैं, तो सभी टेस्ट तब तक चलने चाहिए, जब तक वे किसी भी 'शामिल न करें' फ़िल्टर से मेल न खाते हों.