JUnit: टेस्ट बर्तनों की कक्षाओं में "कोई नहीं चलने योग्य तरीकों" से कैसे बचें


118

मैंने JUnit3.8 से JUnit4.4 पर स्विच कर लिया है। मैं चींटी का उपयोग करके अपने परीक्षण चलाता हूं, मेरे सभी परीक्षण सफलतापूर्वक चलते हैं, लेकिन परीक्षण उपयोगिता वर्ग "नहीं चलने योग्य तरीकों" त्रुटि के साथ विफल हो जाते हैं। मैं जिस पैटर्न का उपयोग कर रहा हूं, वह सभी वर्गों को नाम * टेस्ट * के साथ परीक्षण फ़ोल्डर में शामिल करना है।

मैं समझता हूं कि रनर किसी भी विधि को @Test विशेषता के साथ एनोटेट नहीं कर सकता है। लेकिन उनमें इस तरह की टिप्पणी नहीं है क्योंकि ये कक्षाएं परीक्षण नहीं हैं। आश्चर्यजनक रूप से जब ये परीक्षण ग्रहण में चल रहे हैं, तो यह इन वर्गों के बारे में शिकायत नहीं करता है।

JUnit3.8 में यह समस्या नहीं थी क्योंकि इन उपयोगिता वर्गों ने टेस्टकैसे का विस्तार नहीं किया था, इसलिए धावक ने उन्हें निष्पादित करने का प्रयास नहीं किया।

मुझे पता है कि मैं चींटी स्क्रिप्ट में इन विशिष्ट वर्गों को कनिष्ठ लक्ष्य से बाहर कर सकता हूं। लेकिन मैं अपने द्वारा जोड़े गए हर नए उपयोगिता वर्ग पर बिल्ड फ़ाइल को बदलना नहीं चाहता। मैं भी कक्षाओं का नाम बदल सकता हूं (लेकिन कक्षाओं को अच्छे नाम देना हमेशा मेरी सबसे कमजोर प्रतिभा थी :-))

क्या इस समस्या का कोई सुंदर समाधान है?


क्या आपके परीक्षण ग्रहण / नेटबीन्स / आपके पसंदीदा आईडीई में काम करते हैं?
गेरुआ

मैं ग्रहण का उपयोग करता हूं। वास्तव में वहाँ कोई समस्या नहीं है, किसी भी तरह से ग्रहण इन वर्गों को चलाने की कोशिश नहीं करता है। मुझे आश्चर्य है कि कैसे?
LiorH

मुझे नहीं पता कि क्या हम आपके प्रश्न को समझ पाए हैं। कृपया अपने प्रश्न को पुनः पढ़ें और संभवतः कुछ और जानकारी जोड़ें।
गुराडा

1
@guerda: प्रश्न मुझे बहुत स्पष्ट लगता है। उनका चींटी कार्य उन कक्षाओं को ढूंढ रहा है जिनमें परीक्षण शामिल नहीं हैं, क्योंकि फ़िल्टर उपयोगिता वर्ग उठा रहा है। इसलिए मेरा जवाब, जो मुझे अभी भी पूरी तरह से प्रासंगिक लगता है।
जॉन स्कीट

LiorH: स्पष्टीकरण के लिए धन्यवाद, तो मेरा जवाब बेकार है :)
guerda

जवाबों:


50

मान लें कि आप परीक्षण कक्षाओं को खोजने के लिए उपयोग किए जाने वाले पैटर्न के नियंत्रण में हैं, मेरा सुझाव है कि इसे बदलने के *Testबजाय मिलान करना चाहिए *Test*। इस तरह TestHelperसे मिलान नहीं होगा, लेकिन FooTestहोगा।


1
मुझे नहीं लगता कि इससे मदद मिलेगी, क्योंकि वह JUnit 4.4 में चले गए और इससे कोई फर्क नहीं पड़ना चाहिए।
ग्वारदा

2
लगता है आपको मेरे उत्तर की बात याद आ गई। परीक्षण के रूप में मानी जाने वाली कक्षाओं को निर्धारित करने के लिए उनके पास एक नाम फ़िल्टर है। यदि वह फ़िल्टर बदलता है, तो वह सहायक वर्गों को आसानी से बाहर कर सकता है।
जॉन स्कीट

1
आपका सुझाव मान्य है, हालाँकि मैंने अपनी परीक्षण कक्षाएं और कुछ परीक्षण के साथ शुरू किए और कुछ परीक्षण के साथ समाप्त हुए। उपयोगिता वर्गों और वास्तविक परीक्षण कक्षाओं के बीच कोई स्पष्ट अंतर नहीं है। क्या आपको लगता है कि आपके द्वारा सुझाया गया सम्मेलन एक अच्छा अभ्यास है? (यानी
बर्तन

4
यह लगभग एक सम्मेलन है जो आप टेस्टकेस कक्षाओं को * टेस्ट के साथ प्रत्यय देते हैं। आपको उचित रूप से परीक्षण कक्षाओं का नाम बदलकर रिफ्लेक्टर की आवश्यकता हो सकती है और सहायकों का भी नाम बदल सकते हैं ताकि वे उस प्रत्यय सम्मेलन का उपयोग न करें।
स्पिकाइ

2
मैं स्पोइक से सहमत हूं - यदि आप कक्षा के नाम से नहीं बता सकते हैं कि क्या यह एक परीक्षण या सहायक है, तो आपको कक्षा का नाम बदलना चाहिए। सम्मेलन अधिक है "वर्ग एक परीक्षा है अगर और केवल अगर यह टेस्ट के साथ समाप्त होता है।" उपयोगिता कक्षाएं टेस्ट से शुरू हो सकती हैं या नहीं भी - इससे कोई फर्क नहीं पड़ता।
जॉन स्कीट

142

@Ignore के साथ अपनी उपयोग कक्षाओं को एनोटेट करें। यह JUnit का प्रयास करने और परीक्षण के रूप में उन्हें चलाने का कारण नहीं होगा।


6
वास्तव में, नहीं, यह नहीं होना चाहिए। @Ignore अस्थायी रूप से परीक्षण अक्षम करने के लिए है।
एलिस यंग

1
क्षमा करें, लेकिन यह एक बुरा विचार है। आप टेस्ट से संबंधित एनोटेशन के साथ अपने प्रोडक्शन कोड को एनोटेट करना शुरू करना चाहते हैं, क्योंकि वे टेस्ट पैटर्न से मेल खा सकते हैं? उचित उत्तर वर्ग के नामों को ठीक करने के लिए है अगर वे परीक्षणों के लिए मिलान वाले पैटर्न को ट्रिगर कर रहे हैं। और सुनिश्चित करें कि पैटर्न केवल उन कक्षाओं को ढूंढता है जो टेस्ट के साथ END हैं। यह आमतौर पर स्वीकृत पैटर्न है
केविन एम

हाँ, यह बुरा है और मुझे तब तक इस बात का एहसास नहीं हुआ जब तक मैं एक और अपवोट का योगदान नहीं कर देता। अपने बेस क्लास को अमूर्त बनाएं, फिर JUnit इसे अनदेखा करेगा। नीचे @ gmoore का उत्तर देखें।
रयान

83

मेरे विशिष्ट मामले में निम्नलिखित परिदृश्य है। हमारे परीक्षण

public class VenueResourceContainerTest extends BaseTixContainerTest

सभी विस्तार करते हैं

BaseTixContainerTest

और JUnit BaseTixContainerTest चलाने की कोशिश कर रहा था। घटिया बेसटिक्सकंटेनरटेस्ट कंटेनर को सेटअप करने, क्लाइंट सेटअप करने, कुछ पिज्जा ऑर्डर करने और आराम करने की कोशिश कर रहा था ... आदमी।

जैसा कि पहले उल्लेख किया गया है, आप वर्ग को एनोटेट कर सकते हैं

@Ignore

लेकिन इसके कारण JUnit ने उस परीक्षण को छोड़ दिया गया था (जैसा कि पूरी तरह से अनदेखा किया गया) विरोध किया।

Tests run: 4, Failures: 0, Errors: 0, Skipped: 1

इस तरह मुझे चिढ़ थी।

इसलिए मैंने BaseTixContainerTest को अमूर्त बनाया, और अब JUnit वास्तव में इसे अनदेखा करता है।

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0

7
इससे काफी बेहतर@Ignore
newworld

मैंने @ इग्नोर दृष्टिकोण की कोशिश की और सोचा, अच्छा है, तो मैंने इस जवाब को पढ़ा और खुद को माथे में थप्पड़ मार दिया, " बिल्कुल !"
कुपोषण

38

JUnit को रोकने के लिए अपने टेस्ट बेस क्लास को तुरंत बनाने से रोकें

public abstract class MyTestBaseClass { ... whatever... }

(@ सरकार ने इसे नजरअंदाज कर दिया, जिसे मैंने अस्थायी रूप से नजरअंदाज किए गए परीक्षणों के लिए आरक्षित किया है ।)


3
JUnit धावक अक्सर अमूर्त कक्षाओं को भी तुरंत करने की कोशिश करते हैं, और फिर एक तात्कालिक त्रुटि के साथ विफल होते हैं।
होली कमिंस

बेस टेस्ट कक्षाओं के लिए मेरे लिए पूरी तरह से काम करता है
ru

3
यह नाम के कारण काम कर रहा है (यह टेस्ट में समाप्त नहीं होता है), न कि अमूर्त संशोधक के कारण। वर्ग नाम को MyBaseClassTest में बदलें और यह @HollyCummins (और विफल) द्वारा उल्लिखित के रूप में त्वरित करने का प्रयास करेगा
हच

मेरे मामले में, यह होना चाहिए protected abstract class
मिस्टिक लिन

18
  1. यदि यह आपके बेस टेस्ट क्लास है उदाहरण के लिए AbstractTest और आपके सभी परीक्षण इसे विस्तारित करते हैं तो इस वर्ग को इस प्रकार परिभाषित करें सार के
  2. अगर यह Util class है तो बेहतर तरीके से हटाएं * Test से क्लास का नाम बदलें यह MyTestUtil या Utils इत्यादि।

10

आयात को जोड़ने के लिए IDE के कोड-पूर्ण का उपयोग करते समय सावधान रहें @Test

उदाहरण के लिए यह होना import org.junit.Testऔर न होना है import org.testng.annotations.Test। यदि आप बाद में करते हैं, तो आपको "कोई रन करने योग्य विधियाँ" त्रुटि नहीं मिलेगी।


यह एक उत्तर के बजाय एक टिप्पणी होनी चाहिए।
१६:०१ पर स्वारंगा सरमा

3
मैं क्यों नहीं देख रहा हूँ। यह एक वैध समाधान है।
श्रीधर सरनोबत

4
Intellij Idea 2017 आयात करने के org.junit.jupiter.api.Testबजाय मेरे दिमाग के साथ खिलवाड़ कर रहा था ! लेकिन धन्यवाद अब यह हल हो गया है
AmiNadimi

आपका बहुत-बहुत धन्यवाद, मैं समस्या के दौरान भ्रमित हो गया "कोई भड़कीली विधि नहीं"।
पीटर एस।

7

चींटी अब उस skipNonTestsविशेषता के साथ आती है जिसे वास्तव में वह करने के लिए डिज़ाइन किया गया था जो आप ढूंढ रहे हैं। अपने आधार वर्गों को अमूर्त करने या उनमें एनोटेशन जोड़ने की आवश्यकता नहीं है।


2
ऐसा लगता है कि skipNonTestsविशेषता केवल चींटी 1.9+ में उपलब्ध है, जो शर्म की बात है, क्योंकि यह अविश्वसनीय रूप से उपयोगी है। यह अमूर्त परीक्षण सुपरक्लेसेस को भी बाहर करेगा।
होली कमिंस

4

इन कक्षाओं में एक खाली परीक्षण विधि जोड़ने के बारे में क्या?

public void avoidAnnoyingErrorMessageWhenRunningTestsInAnt() {
    assertTrue(true); // do nothing;
}

8
लेकिन जो हमारे पास परीक्षणों की संख्या को गलत तरीके से बढ़ाता है :) ऐसा नहीं है कि इसकी बड़ी बात है
सुदर्शन

1

अपने परीक्षण वर्ग में यदि आयात लिखा है। org.junit.jupiter.api.Test; इसे हटाएं और आयात को लिखें। इस मामले में इसने मेरे साथ भी काम किया।


1
आश्चर्यजनक रूप से, इसने काम किया। मैं विंडोज कमांड लाइन में मैन्युअल रूप से निष्पादित किया गया। हालांकि, एक और समस्या यह है कि है @BeforeAllऔर @AfterAllनहीं चलाए जा रहे हैं।
बिंगली २२४

प्रतीत होता है, JUnit4 ने काम किया (साथ @BeforeClassऔर @AfterClass, लेकिन JUnit5 का नहीं। संदर्भ: junit.org/junit5/docs/current/user-guide/#migrating-from-junit4
BingLi224

0

मैं भी इसी तरह के मुद्दे का सामना कर रहा था (कोड के सरल टुकड़े को चलाने पर) (@Test, @Before आदि का सरलतम) चलाने पर और समाधान कहीं नहीं मिला। मैं Junit4 और Eclipse SDK संस्करण 4.1.2 का उपयोग कर रहा था। नवीनतम ग्रहण एसडीके 4.2.2 का उपयोग करके मेरी समस्या का समाधान किया। मुझे उम्मीद है कि यह उन लोगों की मदद करता है जो कुछ इसी तरह के मुद्दे से जूझ रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.