শর্তাধীন JUnit 4 এ পরীক্ষা উপেক্ষা করা


365

ঠিক আছে, সুতরাং @Ignoreটীকাগুলি চিহ্নিত করার জন্য ভাল যে পরীক্ষার কেসটি চালানো উচিত নয়।

যাইহোক, কখনও কখনও আমি রানটাইম তথ্যের উপর ভিত্তি করে একটি পরীক্ষা উপেক্ষা করতে চাই। একটি উদাহরণ হতে পারে যদি আমার একটি সমাবর্তন পরীক্ষা থাকে তবে নির্দিষ্ট সংখ্যক কোর সহ একটি মেশিনে চালানো দরকার। যদি এই পরীক্ষাটি কোনও ইউনিপ্রোসেসর মেশিনে চালানো হয়, তবে আমি মনে করি না যে কেবল পরীক্ষা পাস করা সঠিক হবে (যেহেতু এটি চালানো হয়নি), এবং অবশ্যই পরীক্ষাটি ব্যর্থ হওয়া এবং বিল্ডটি ভাঙা ঠিক হবে না ।

সুতরাং আমি রানটাইমে পরীক্ষাগুলি উপেক্ষা করতে সক্ষম হতে চাই, কারণ এটি সঠিক ফলাফলের মতো বলে মনে হচ্ছে (যেহেতু পরীক্ষার কাঠামোটি বিল্ডটি পাস করার অনুমতি দেবে কিন্তু পরীক্ষাগুলি চালানো হয়নি তা রেকর্ড করে)। আমি মোটামুটি নিশ্চিত যে টীকাটি আমাকে এই নমনীয়তাটি দেবে না এবং সন্দেহ করে যে আমাকে প্রশ্নযুক্ত শ্রেণীর জন্য নিজেই পরীক্ষার স্যুট তৈরি করতে হবে suspect তবে ডকুমেন্টেশনে এ সম্পর্কে কিছুই উল্লেখ করা হয়নি এবং এপিআইয়ের মাধ্যমে সন্ধান করা এটিও পরিষ্কার নয় যে এটি কীভাবে প্রোগ্রামক্রমে করা হবে (উদাহরণস্বরূপ আমি কীভাবে অগ্রগতিমূলকভাবে কোনও উদাহরণ তৈরি করতে পারি Testবা এ জাতীয় অনুরূপ যা @Ignoreটীকা দ্বারা নির্মিত এর সমতুল্য ?)।

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

উত্তর:


476

JUnit উপায় রান-টাইমে এটি করা org.junit.Assume

 @Before
 public void beforeMethod() {
     org.junit.Assume.assumeTrue(someCondition());
     // rest of setup.
 }

আপনি এটি কোনও @Beforeপদ্ধতিতে বা পরীক্ষায় নিজেই করতে পারেন, তবে কোনও @Afterপদ্ধতিতে নয়। আপনি যদি পরীক্ষায় এটি করেন তবে আপনার @Beforeপদ্ধতিটি রান হয়ে যাবে। @BeforeClassশ্রেণি সূচনা রোধ করতে আপনি এটি এর মধ্যেও করতে পারেন ।

একটি অনুমান ব্যর্থতা পরীক্ষা উপেক্ষা করা হয়।

সম্পাদনা করুন: জুনিট-এক্সট্রি@RunIf থেকে টীকাগুলির সাথে তুলনা করতে , তাদের নমুনা কোডটি দেখতে এরকম হবে:

@Test
public void calculateTotalSalary() {
    assumeThat(Database.connect(), is(notNull()));
    //test code below.
}

Database.connect()এই পদ্ধতি থেকে এইভাবে সংযোগটি ক্যাপচার এবং ব্যবহার করা অনেক সহজ বলে উল্লেখ করা যায় না ।


1
@ ননুপ, এটি আমার পর্যবেক্ষণ মোটেই নয়। তারা উপেক্ষা করা হয়। আইডিইএ টেস্ট রানার তাদের সেভাবে রিপোর্ট করে এবং ইউএনইটি সোর্স কোডে এক নজরে দেখায় যে এটি পরীক্ষাকে অবহেলিত বলে প্রতিবেদন করেছে।
যিশাই

1
উদ্ধৃতি দিতে: "ভবিষ্যতে, এটি পরিবর্তন হতে পারে এবং একটি ব্যর্থ অনুমান পরীক্ষাকে অগ্রাহ্য করার দিকে পরিচালিত করতে পারে।" এটি আসলে পরিবর্তিত হয়েছিল, 4.5 হিসাবে আমি বিশ্বাস করি। বর্তমান জাভাদোক বলেছেন: "ডিফল্ট JUnit রানার ব্যর্থ অনুমানগুলি উপেক্ষা হিসাবে পরীক্ষা করে Custom কাস্টম রানাররা অন্যরকম আচরণ করতে পারে।" github.com/ KentBeck
যিশাই

4
জুনিট ৪.৮.১ এর সাথে cl.cl গ্রহণটি উত্তীর্ণ পরীক্ষা হিসাবে মিথ্যা অনুমানের প্রতিবেদন করে। পিপড়া 1.8.1 সঙ্গে একই।
ফিজিয়ারাওন

8
: অন্ধকার ব্যর্থ পাসিং যেমন অনুমানের যে রিপোর্ট একটি বাগ bugs.eclipse.org/bugs/show_bug.cgi?id=359944
মার্টিন

1
@ জেফস্টোরী, তারপরে আপনি কয়েকটি জিনিস খুঁজছেন। একটি হ'ল @BeforeClassটীকা, যেখানে আপনার অনুমান সেখানে ব্যর্থ হতে পারে, যা পুরো ক্লাসটি এড়িয়ে যাবে। আরেকটি হ'ল @ClassRule(সূক্ষ্ম দানাদার নিয়ন্ত্রণের জন্য, তবে পুরো ক্লাসের উপরে, এক সময়)।
যিশাই

51

আপনার Junit-extপ্রকল্পটি চেকআউট করা উচিত । তাদের RunIfএন্টোটেশন রয়েছে যা শর্তসাপেক্ষ পরীক্ষা করে, যেমন:

@Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
    //your code there
}

class DatabaseIsConnected implements Checker {
   public boolean satisify() {
        return Database.connect() != null;
   }
}

[কোড টিউটোরিয়াল থেকে নেওয়া নমুনা]


3
এই উত্তরের জন্য ধন্যবাদ - কার্যকারিতার জন্য একটি আকর্ষণীয় বিকল্প বাক্য গঠন, যদিও আমি Assumeসরাসরি সাথে যাব যাতে অন্য কোনও নির্ভরতার পরিচয় না দেওয়া হয়।
আন্দ্রেজেজ ডয়েল

3
আমি ব্যক্তিগতভাবে এই সমাধান পছন্দ। যদি আপনার অনেক পরীক্ষা থাকে যা একই শর্তের উপর ভিত্তি করে চালানো উচিত, এটি প্রতিটি পরীক্ষায় Assume ব্যবহার করার চেয়ে অনেক বেশি আদর্শ হবে। এছাড়াও, যদি এটি পদ্ধতি স্তরের পরিবর্তে কোনও শ্রেণির স্তরে ব্যবহার করা যায় তবে এটি আরও আদর্শ হবে।
রিচার্ড

আমি এটি পছন্দ করবো, 'এটি চালুর সময় শর্তসাপেক্ষে পরীক্ষাটি চালাতে সহায়তা করে। এটি বেশ কয়েকটি ইউনিট পরীক্ষা চালাচ্ছে এবং এটি প্রয়োজনীয় ইউনিট পরীক্ষা নির্দিষ্ট পরীক্ষকের উপর চালানো দরকার run আমি সত্যিই অবাক হয়ে দেখলাম যে জুনিট-এক্সট্রিভ ম্যাভেন রিপোজিটরিতে পাওয়া যায় না। আমরা কীভাবে এই প্রকল্পে উপকৃত হব?
শম্ভু

4
@RunIfযখন পরীক্ষাটি আসল পরীক্ষার কোড থেকে চালিত হয় তখন এর মতো একটি টীকা শর্তটি পৃথক করে, যা আমি ভাল বলে মনে করি। আমি যা পছন্দ করি না তা হ'ল এর জন্য একটি নির্দিষ্ট পরীক্ষার রানার প্রয়োজন। অতএব আমি পরীক্ষাগুলিকে উপেক্ষা করার জন্য একটি JUnit বিধি লিখেছি ।
রেডিগার হার্মান

2
আমাদের স্থানীয় সংগ্রহস্থলে জুনিট-এক্সট জারটি (এখানে কোড. google.com/p/junit-ext/downloads/… পাওয়া যায় ) ইনস্টল করার পরে এবং এই @ রনফটি টীকাগুলি কার্যকর করার জন্য ... কিছুই নেই! এটি সম্পূর্ণরূপে উপেক্ষা করা হয়েছে, এবং আমি মনে করি যে কারণটি হতে পারে যে জুনিট-এক্সট জুনাইট ৪.৫ এর উপর নির্ভর করে। বসন্ত-পরীক্ষার কারণে আমাদের 4.9+ প্রয়োজন। সুতরাং ... কিছু মনে করবেন না।
মার্ক

7

ইউনাইট 4-এ, আপনার জন্য আরেকটি বিকল্প হতে পারে যা বোঝাতে একটি টীকাগুলি তৈরি করা যেতে পারে যে পরীক্ষাটি আপনার কাস্টম মানদণ্ডটি পূরণ করতে হবে, তারপরে আপনার নিজের সাথে ডিফল্ট রানারকে প্রসারিত করুন এবং প্রতিবিম্বটি ব্যবহার করে আপনার সিদ্ধান্তটিকে কাস্টম মানদণ্ডের ভিত্তিতে রাখবেন। এটি দেখতে এরকম কিছু দেখাচ্ছে:

public class CustomRunner extends BlockJUnit4ClassRunner {
    public CTRunner(Class<?> klass) throws initializationError {
        super(klass);
    }

    @Override
    protected boolean isIgnored(FrameworkMethod child) {
        if(shouldIgnore()) {
            return true;
        }
        return super.isIgnored(child);
    }

    private boolean shouldIgnore(class) {
        /* some custom criteria */
    }
}

যদিও এটি দেখতে সুন্দর এবং পরিষ্কার দেখাচ্ছে, এটি JUnit4 হলে বর্তমান সংস্করণগুলির সাথে কাজ করে না, যেহেতু আর পদ্ধতিটি BlockJUnit4ClassRunnerপ্রস্তাব করে isIgnoredনা।
ডেভ

-2

একটি দ্রুত নোট: Assume.assumeTrue(condition)বাকি পদক্ষেপগুলি উপেক্ষা করে কিন্তু পরীক্ষায় উত্তীর্ণ হয়। পরীক্ষায় ব্যর্থ হওয়ার জন্য, org.junit.Assert.fail()শর্তাধীন বিবৃতিটির ভিতরে ব্যবহার করুন । মত কাজ করে Assume.assumeTrue()কিন্তু পরীক্ষায় ব্যর্থ হয়।


5
উপরের উত্তরে উল্লিখিত হিসাবে, একটি ব্যর্থ অনুমান পরীক্ষাটি পাসের কারণ হয় না , এটি একটি পৃথক স্থিতি ফেরত দেয়। কিছু রানার ভুলভাবে এটি জানাতে পারে যেন এটি পাস, তবে এটি পরীক্ষার দৌড়ে একটি দুর্বলতা / বাগ (এবং ডিফল্ট JUnit রানার উপেক্ষা করে পরীক্ষা প্রদর্শন করে)। এবং আপনার চূড়ান্ত বাক্য হিসাবে, পরীক্ষায় ব্যর্থ হওয়া বিশেষত আমি যা করতে চাই তা (এড) নয়।
আন্দ্রেজ ডয়েল

ওহ ঠিক আছে. পরীক্ষাগুলি আমার ক্ষেত্রে ব্যর্থ অনুমানের উপর দিয়ে গেছে তবে আমি চেয়েছিলাম যে সেগুলি ব্যর্থ হিসাবে রিপোর্ট করা হোক (আমি টেস্ট ওয়াচারের ব্যতিক্রমের জন্য যাচ্ছিলাম)। ব্যর্থতা জোর করা আমাকে সাহায্য করেছে।
টিআইএন তিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.