JUnit: কীভাবে পরীক্ষা ব্যবহারের ক্লাসগুলিতে "কোনও চলমান পদ্ধতি" এড়ানো যায়


117

আমি JUnit3.8 থেকে JUnit4.4 এ স্যুইচ করেছি। আমি পিঁপড়া ব্যবহার করে আমার পরীক্ষা চালাই, আমার সমস্ত পরীক্ষা সফলভাবে চলতে থাকে তবে পরীক্ষার ইউটিলিটি ক্লাসগুলি "কোনও চলমান পদ্ধতি নয়" ত্রুটির সাথে ব্যর্থ হয়। আমি যে প্যাটার্নটিটি ব্যবহার করছি তা হ'ল টেস্ট ফোল্ডারের অধীনে * টেস্ট * নামের সব শ্রেণি অন্তর্ভুক্ত করা।

আমি বুঝেছি যে রানার @ টেস্ট অ্যাট্রিবিউট দিয়ে টীকাযুক্ত কোনও পদ্ধতি খুঁজে পাচ্ছেন না। তবে এগুলিতে এ জাতীয় মন্তব্য নেই কারণ এই শ্রেণিগুলি পরীক্ষা নয় not আশ্চর্যের বিষয় হল যখন এই পরীক্ষাগুলি গ্রহণে চালাচ্ছিল তখন এটি এই ক্লাসগুলির বিষয়ে অভিযোগ করে না।

JUnit3.8 এ মোটেও সমস্যা হয়নি কারণ এই ইউটিলিটি ক্লাসগুলি টেস্ট কেসটি প্রসারিত করেনি তাই রানার তাদের কার্যকর করার চেষ্টা করেনি didn't

আমি জানি আমি পিঁপড়ির স্ক্রিপ্টে জুনিট টার্গেটে এই নির্দিষ্ট ক্লাসগুলি বাদ দিতে পারি। তবে আমি যুক্ত প্রতিটি নতুন ইউটিলিটি ক্লাসের উপরে বিল্ড ফাইলটি পরিবর্তন করতে চাই না। আমি ক্লাসগুলির নতুন নামকরণও করতে পারি (তবে ক্লাসগুলিকে ভাল নাম দেওয়া সবসময়ই আমার দুর্বলতম প্রতিভা ছিল :-))

এই সমস্যার জন্য কি কোনও মার্জিত সমাধান আছে?


আপনার পরীক্ষাগুলি কি Eclipse / NetBeans / আপনার প্রিয় IDE তে কাজ করে?
গেরদা

আমি গ্রহণ করি আসলে সেখানে কোনও সমস্যা নেই, কোনওভাবেই গ্রহন এই ক্লাসগুলি চালানোর চেষ্টা করে না। আমি ভাবছি কিভাবে?
লিয়োরএইচ

আমরা জানি না আমরা আপনার প্রশ্নটি বুঝতে পেরেছি কিনা। আপনার প্রশ্নটি আবার পড়ুন এবং সম্ভবত আরও কিছু তথ্য যুক্ত করুন।
গেরদা

1
@ গুয়েরদা: প্রশ্নটি আমার কাছে বেশ পরিষ্কার মনে হয়েছে। তার পিপীলিকার কাজটি এমন ক্লাসগুলি সন্ধান করছে যাতে পরীক্ষাগুলি নেই, কারণ ফিল্টারটি ইউটিলিটি ক্লাসটি তুলেছে। সুতরাং আমার উত্তর, যা আমি এখনও বিশ্বাস করি এটি সম্পূর্ণ প্রাসঙ্গিক।
জন স্কিটি

লিওরএইচ: স্পষ্টতার জন্য ধন্যবাদ, সুতরাং আমার উত্তরটি নষ্ট :)
গেরদা

উত্তর:


49

ধরে নিই যে আপনি পরীক্ষার ক্লাসগুলি খুঁজে পাওয়ার জন্য ব্যবহৃত প্যাটার্নের নিয়ন্ত্রণে রয়েছেন, আমি এটি *Testপরিবর্তে ম্যাচের পরিবর্তে পরিবর্তনের পরামর্শ দেব *Test*। এই ভাবে TestHelperমিলবে না, তবে FooTestহবে।


1
আমি মনে করি না এটি সাহায্য করবে, কারণ তিনি জুনিয়ট ৪.৪ এ চলে গিয়েছিলেন এবং এটি কোনও বিষয় নয়।
গেরদা

2
আপনি আমার উত্তরটির বিন্দুটি মিস করেছেন বলে মনে হচ্ছে। ক্লাসগুলি পরীক্ষা হিসাবে বিবেচিত হবে তা নির্ধারণ করার জন্য তার একটি নাম ফিল্টার রয়েছে। যদি সে ফিল্টার পরিবর্তন করে তবে সে সহজেই সহায়ক ক্লাসগুলি বাদ দিতে পারে।
জন স্কিটি

1
আপনার পরামর্শটি বৈধ, তবে আমি আমার পরীক্ষার ক্লাসগুলি পরীক্ষা করেছিলাম এবং কিছু পরীক্ষা দিয়ে শুরু করি এবং কিছুটা টেস্ট দিয়ে শেষ হয়। ইউটিলিটি ক্লাস এবং বাস্তব পরীক্ষার শ্রেণীর মধ্যে কোনও স্পষ্ট পার্থক্য নেই। আপনি কি মনে করেন যে আপনি যে কনভেনশনটি প্রস্তাব করেছিলেন এটি একটি ভাল অনুশীলন? (যেমন
ব্যবহারগুলি

4
এটি প্রায় একটি সম্মেলন যা আপনি টেস্টকেস ক্লাসগুলিকে * টেস্টের সাথে সংযুক্ত করে। পরীক্ষার ক্লাসগুলির যথাযথ নাম পরিবর্তন করে আপনার সাহায্যকারীদের নতুন নামকরণের মাধ্যমে আপনার অশোধনকারী প্রয়োজন হতে পারে যাতে তারা প্রত্যয় কনভেনশনটি ব্যবহার না করে।
স্পোকাইক

2
আমি স্পোইকের সাথে একমত - আপনি যদি ক্লাসের নাম থেকে এটি পরীক্ষা বা সাহায্যকারী কিনা তা আপনি যদি বলতে না পারেন তবে আপনার ক্লাসটির নতুন নাম রাখা উচিত। কনভেনশনটি আরও "ক্লাসটি একটি পরীক্ষা হয় এবং যদি এটি টেস্ট দিয়ে শেষ হয় তবেই।" ইউটিলিটি ক্লাসগুলি পরীক্ষা দিয়ে শুরু হতে পারে বা নাও হতে পারে - এটি কোনও ব্যাপার নয়।
জন স্কিটি

142

@ উপেক্ষা সহ আপনার ব্যবহারের ক্লাসগুলি টিকে দিন। এটি JUnit কে পরীক্ষা হিসাবে চালানোর চেষ্টা করবে না এবং তৈরি করবে।


6
আসলে, না, এটা করা উচিত নয়। @ উপেক্ষা করুন অস্থায়ীভাবে পরীক্ষা অক্ষম করার জন্য।
অ্যালিস ইয়ং

1
দুঃখিত তবে এটি একটি খারাপ ধারণা। আপনি কেবলমাত্র পরীক্ষার সম্পর্কিত এনটোটেশনের সাথে আপনার উত্পাদন কোডটি টিকিয়ে দেওয়া শুরু করতে চান কারণ এগুলি কোনও পরীক্ষার ধরণটির সাথে মেলে? যথাযথ উত্তর হ'ল শ্রেণীর নামগুলি যদি তারা পরীক্ষার জন্য প্যাটার্নের সাথে মিল রেখে ট্রিগার করে fix এবং নিশ্চিত করুন যে প্যাটার্নটি পরীক্ষার সাথে সমাপ্ত কেবলমাত্র ক্লাসগুলি খুঁজে পেয়েছে। এটি একটি সাধারণভাবে গৃহীত প্যাটার্ন
কেভিন এম

হ্যাঁ, এটি খারাপ এবং আমি অন্যটিকে অবদানের পরে অবধি বুঝতে পারি নি যে আমি সরাতে পারছি না। আপনার বেস শ্রেণিকে বিমূর্ত করুন, তারপরে জুনিট এটিকে উপেক্ষা করবে। নীচে @ gmoore এর উত্তর দেখুন।
রায়ান শিলিংটন

83

আমার নির্দিষ্ট ক্ষেত্রে নিম্নলিখিত পরিস্থিতি রয়েছে। আমাদের পরীক্ষা

public class VenueResourceContainerTest extends BaseTixContainerTest

সব প্রসারিত

BaseTixContainerTest

এবং জুনিট বেসটিক্স কনটেনার টেস্ট চালানোর চেষ্টা করছিল। দরিদ্র বেসটিক্স কনটেনারটেষ্টটি কেবলমাত্র ধারক সেটআপ করার, ক্লায়েন্টকে সেটআপ করার, কিছু পিজ্জা অর্ডার করার এবং বিশ্রাম দেওয়ার চেষ্টা করছিল ... ম্যান।

পূর্বে উল্লিখিত হিসাবে, আপনি ক্লাসটি সাথে টিকা দিতে পারেন

@Ignore

কিন্তু যার ফলে জুনিত সেই পরীক্ষাকে বাদ দেওয়া হিসাবে রিপোর্ট করেছিল (সম্পূর্ণ উপেক্ষা করার বিরুদ্ধে) opposed

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

এ জাতীয় আমাকে বিরক্ত করে।

তাই আমি বেসটিক্স কনটেনারটেষ্টকে বিমূর্ত করে তুলেছি এবং এখন ইউনাইট সত্যই তা উপেক্ষা করে।

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


আমি @ উপেক্ষা করার পদ্ধতিটি চেষ্টা করে দেখেছি এবং ভেবেছিলাম, ভাল, তবে আমি এই উত্তরটি পড়ে কপালে চড় দিয়েছিলাম, " অবশ্যই !"
ডান্টল

38

JUnit কে আপনার পরীক্ষা বেস ক্লাসটি ইনস্ট্যান্ট করা থেকে বিরত রাখতে কেবল এটি তৈরি করুন

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

(@ অস্থায়ীভাবে উপেক্ষা করা পরীক্ষার জন্য আমি সংরক্ষণ করি যা এটিকে উপেক্ষা হিসাবে প্রতিবেদন করুন ))


3
JUnit দৌড়বিদরা প্রায়শই পাশাপাশি বিমূর্ত ক্লাস ইনস্ট্যান্ট করার চেষ্টা করে এবং তারপরে তাত্ক্ষণিক ত্রুটির সাথে ব্যর্থ হয়।
হলি কামিন্স

বেস টেস্ট ক্লাসগুলির জন্য আমার জন্য পুরোপুরি কাজ করে
রুक्स

3
এটি নামের কারণে কাজ করছে (এটি টেস্টে শেষ হয় না), বিমূর্ত সংশোধকটির কারণে নয়। MyBaseClassTest ক্লাসের নাম পরিবর্তন করুন এবং @HollyCummins উল্লেখ এটা instantiate করার চেষ্টা করবে (এবং ব্যর্থ)
হাচ

আমার ক্ষেত্রে এটি হওয়া উচিত protected abstract class
মিস্টিক লিন

18
  1. যদি এটি আপনার বেস পরীক্ষার উদাহরণ হিসাবে যেমন অ্যাবস্ট্রাক্ট টেস্ট এবং আপনার সমস্ত পরীক্ষাগুলি এটি প্রসারিত করে তবে এই শ্রেণিকে বিমূর্ত হিসাবে সংজ্ঞায়িত করুন
  2. যদি এটি ইউটিলি ক্লাস হয় তবে ক্লাসের নাম পরিবর্তন করে পরীক্ষাটি আরও ভাল করে সরিয়ে দিন এটি মাই টেস্টটিল বা ইউটিলস ইত্যাদি

10

আমদানি যুক্ত করতে কোনও IDE- এর কোড-সমাপ্তি ব্যবহার করার সময় সাবধান হন @Test

উদাহরণস্বরূপ এটি হতে হবে import org.junit.Testএবং হবে না import org.testng.annotations.Test। আপনি যদি পরবর্তীটি করেন তবে আপনি "কোনও রানযোগ্যযোগ্য পদ্ধতি" ত্রুটি পাবেন।


এটি একটি উত্তর চেয়ে মন্তব্য করা উচিত।
স্বরঙ্গ সরমা

3
কেন দেখছি না। এটি একটি কার্যকর সমাধান।
শ্রীধর সারনোবাত

4
ইন্টেলিজ আইডিয়া 2017 এর org.junit.jupiter.api.Testপরিবর্তে আমদানি করে আমার মন নিয়ে গোলমাল করছে ! তবে আপনাকে ধন্যবাদ এটি এখনই সমাধান হয়ে গেছে
অমিতিদিমি

আপনাকে অনেক ধন্যবাদ, "কোন চালানোযোগ্য পদ্ধতি নেই" সমস্যা হওয়ার সময় আমি বিভ্রান্ত হয়ে পড়েছিলাম।
পিটার এস

7

পিপীলিকা এখন সেই skipNonTestsবৈশিষ্ট্যটি নিয়ে আসে যা আপনি যা খুঁজছেন তা হুবহু করতে ডিজাইন করা হয়েছিল। আপনার বেস ক্লাসগুলি বিমূর্ত করতে বা এগুলিতে টীকাগুলি যুক্ত করার দরকার নেই।


2
দেখে মনে হচ্ছে skipNonTestsঅ্যাট্রিবিউটটি কেবল পিঁপড় 1.9+ এ উপলব্ধ যা এটি লজ্জাজনক, যেহেতু এটি অবিশ্বাস্যভাবে দরকারী বলে মনে হচ্ছে। এটি বিমূর্ত পরীক্ষা সুপারক্লাসগুলিও বাদ দেবে।
হলি কামিন্স

4

এই ক্লাসে একটি খালি পরীক্ষা পদ্ধতি যুক্ত করার বিষয়ে কী?

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

8
তবে আমাদের পরীক্ষাগুলি ভুয়াভাবে সংখ্যা বাড়িয়ে দিয়েছে :) এটি বড় কথা নয়
সুদর্শন

1

আপনার পরীক্ষার শ্রেণিতে যদি org.junit.jupiter.api.Test আমদানি লিখে থাকে; এটি মুছুন এবং org. জুনit.Test আমদানি লিখুন; এই ক্ষেত্রে এটি আমার পাশাপাশি কাজ করেছে।


1
আশ্চর্যজনকভাবে, এটি কাজ করে। আমি উইন্ডোজ কমান্ড লাইনে ম্যানুয়ালি মৃত্যুদন্ড কার্যকর করেছি। তবে আরেকটা সমস্যা হল @BeforeAllএবং @AfterAllচালাতে না হয়।
বিংলিআই ২৪

আপাতদৃষ্টিতে, JUnit4 সঙ্গে (কাজ @BeforeClassএবং @AfterClass: কিন্তু JUnit5 রেফারেন্স নয়। junit.org/junit5/docs/current/user-guide/#migrating-from-junit4
BingLi224

0

আমি কোডের সহজতম টুকরোটি (@ টেস্ট, @ পূর্ব ইত্যাদি ব্যবহার করে) চালানোর বিষয়ে একই ধরণের সমস্যার ("কোনও চলমান পদ্ধতি ..") এর মুখোমুখি হয়েছি এবং এর সমাধান কোথাও পাইনি। আমি জুনিট 4 এবং এক্সিলিপ এসডিকে সংস্করণ 4.1.2 ব্যবহার করছিলাম। সর্বশেষগ্রহণের এসডিকে ৪.২.২ ব্যবহার করে আমার সমস্যা সমাধান করুন। আমি আশা করি এটি কিছুটা অনুরূপ ইস্যুতে লড়াই করা লোকদের সহায়তা করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.