यह हाल ही में ग्रैगल के ब्लॉग पोस्ट स्टॉप पर आपके परीक्षणों को पुन: निर्देशित करने वाला विषय था । लेखक का उपयोग कर एक उदाहरण दिखाता है outputs.upToDateWhen { false }
और बताता है कि क्यों यह गलत है:
यह वास्तव में पुनर्मिलन को मजबूर नहीं करता है
इस स्निपेट के लेखक क्या कहना चाहते थे, "हमेशा मेरे परीक्षणों को फिर से चलाएँ"। हालांकि यह स्निपेट नहीं करता है। यह केवल आउट-ऑफ-डेट को कार्य चिह्नित करेगा, ग्रेडल को आउटपुट को फिर से बनाने के लिए मजबूर करता है। लेकिन यहाँ एक बात है, यदि बिल्ड कैश सक्षम है, तो ग्रेड को आउटपुट को फिर से बनाने के लिए कार्य को चलाने की आवश्यकता नहीं है। यह कैश में एक प्रविष्टि प्राप्त करेगा और परीक्षण के आउटपुट निर्देशिका में परिणाम को अनपैक करेगा।
इस स्निपेट के लिए भी यही सच है:
test.dependsOn cleanTest
ग्रैड आउटपुट को साफ करने के बाद बिल्ड कैशे से परीक्षण के परिणामों को अनपैक करेगा, इसलिए कुछ भी फिर से नहीं होगा। संक्षेप में, ये स्निपेट्स बहुत महंगा नो-ऑप बना रहे हैं।
यदि आप अब सोच रहे हैं "ठीक है, मैं कैश को भी निष्क्रिय कर दूंगा", मुझे आपको बताना चाहिए कि आपको क्यों नहीं करना चाहिए।
इसके बाद, लेखक यह बताता है कि कुछ परीक्षणों को फिर से करना क्यों समय की बर्बादी है:
आपके परीक्षणों का विशाल बहुमत नियतात्मक होना चाहिए, अर्थात समान इनपुट दिए जाने पर उन्हें उसी परिणाम का उत्पादन करना चाहिए।
कुछ मामलों में जहां आप उन परीक्षणों का पुन: परीक्षण करना चाहते हैं जहां कोड नहीं बदला है, आपको उन्हें इनपुट के रूप में मॉडल करना चाहिए। यहां ब्लॉग पोस्ट से दोनों उदाहरण दिए गए हैं जो एक इनपुट जोड़कर दिखाते हैं, इसलिए यह कार्य अपने अप-टू-डेट चेक के दौरान इसका उपयोग करेगा।
task randomizedTest(type: Test) {
systemProperty "random.testing.seed", new Random().nextInt()
}
task systemIntegrationTest(type: Test) {
inputs.property "integration.date", LocalDate.now()
}
मैं पूरे ब्लॉग पोस्ट को पढ़ने की सलाह देता हूं।