JUnit4 এ কীভাবে নির্দিষ্ট পদ্ধতিতে পরীক্ষা পদ্ধতি চালানো যায়?


413

আমি পরীক্ষার পদ্ধতিগুলি সম্পাদন করতে চাই যা @Testনির্দিষ্ট ক্রমে টীকাযুক্ত ।

উদাহরণ স্বরূপ:

public class MyTest {
    @Test public void test1(){}
    @Test public void test2(){}
}

আমি প্রতিবার দৌড়ানোর test1()আগে দৌড়ানোর বিষয়টি নিশ্চিত করতে test2()চাই MyTest, তবে এর মতো টিকা পাওয়া যায় নি @Test(order=xx)

আমি মনে করি এটি JUnit এর জন্য বেশ গুরুত্বপূর্ণ বৈশিষ্ট্য, JUnit এর লেখক যদি অর্ডার বৈশিষ্ট্যটি না চান তবে কেন?


2
তারা উত্স ফাইলে যে ক্রম উপস্থিত হয় তাতে আমার মৃত্যুদণ্ড কার্যকর করা বলে মনে হয়।
মারকুইস লার্নের

84
আপনার কখনই সেই পরীক্ষাগুলি লিখতে হবে না যা নির্দিষ্ট ক্রমে কার্যকর করা দরকার। এটা সত্যিই খারাপ অভ্যাস। প্রতিটি পরীক্ষা স্বতন্ত্র চালাতে সক্ষম হওয়া উচিত।
এফেলসফট

5
@ ইজেপি এটি জাভা প্রাক 7. এর আগে সর্বজনীনভাবে সত্য ছিল Pre প্রাক most, বেশিরভাগ জেভিএম এটি করেছিল, তবে এটির কোনও নিশ্চয়তা দেওয়া হয়নি। জাভা 7 জেভিএম একটি অ-নিরস্তিক ক্রমে পদ্ধতিগুলি ফিরিয়ে দিতে পারে।
ম্যাথু ফারওয়েল

17
চারপাশে কাজ। আপনার পরীক্ষার কেসগুলি থেকে @ টেস্ট সরান, তাদের ব্যক্তিগত ফাংশন হিসাবে রূপান্তর করুন, তারপরে একটি একক পরীক্ষার কেস করুন, এবং ব্যক্তিগত ফাংশনগুলিকে ক্রমে কল করুন।
সাইমন গুও

12
পরীক্ষার কেস থেকে @ টেস্ট সরিয়ে ফেলা JUnit রিপোর্টে গোলমাল করবে। যাইহোক, নির্দিষ্ট আদেশ প্রয়োগ করা ইউনিট পরীক্ষার জন্য একটি খারাপ অভ্যাস, তবে অগত্যা ইন্টিগ্রেশন পরীক্ষার জন্য খারাপ অভ্যাস নয় । সর্বোত্তম পছন্দ (না আদর্শ) সঙ্গে বর্গ টীকা হয় @FixMethodOrder(MethodSorters.NAME_ASCENDING), রাখা @Testসব পরীক্ষা পদ্ধতি জন্য টীকা এবং তাদের বর্ণানুক্রমে নামান্তর সঞ্চালনের পছন্দসই অর্ডার উপর নির্ভর করে, যেমন t1_firstTest(), t2_secondTest()ইত্যাদি
MisterStrickland

উত্তর:


238

আমি মনে করি এটি JUnit এর জন্য বেশ গুরুত্বপূর্ণ বৈশিষ্ট্য, JUnit এর লেখক যদি অর্ডার বৈশিষ্ট্যটি না চান তবে কেন?

আমি নিশ্চিত নই যে জুনিতের সাথে এটি করার একটি পরিষ্কার উপায় আছে, আমার জ্ঞান অনুসারে জুনিত অনুমান করে যে সমস্ত পরীক্ষা একটি স্বেচ্ছাসেবী ক্রমে করা যেতে পারে। এফএকিউ থেকে:

আমি কীভাবে পরীক্ষার জিনিসপত্র ব্যবহার করব?

(...) পরীক্ষা-পদ্ধতি আমন্ত্রণের ক্রমটি গ্যারান্টিযুক্ত নয় , সুতরাং testOneItem Colલેક્શન () টেস্টএম্পটি কালেকশন () এর আগে কার্যকর করা হতে পারে। (...)

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

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


14
হয় আপনার দুটি স্বতন্ত্র পরীক্ষা রয়েছে, অথবা আপনার কেবল একটি পরীক্ষা রয়েছে এবং এর মতো কোড করা উচিত।
জন ফ্রিডম্যান

2
@ জোনফ্রিডম্যান, আমি যেমন প্রশ্নটি বুঝতে পেরেছি, এটি পরীক্ষাগুলি পরস্পর নির্ভরশীল হওয়ার ঘটনা নয়, কেবল পরীক্ষার জন্য কিছু জিনিস রেখেছিল এবং ফলাফল যাতে সেই ক্রমে প্রকাশিত হয় তা প্রত্যাশা করে।
জন ব্রাইট

174
আমি ইউনিট পরীক্ষার জন্য আদেশ প্রয়োগ না করার বিষয়টি বুঝতে পারি, তবে ইন্টিগ্রেশন টেস্টগুলি লিখতে JUnit ব্যবহার করার সময় পরীক্ষাগুলি চালিত ক্রমটি নির্দিষ্ট করতে সক্ষম হওয়াই ভাল হবে। যেমন প্রথমে লগইন পরীক্ষা চালান।
ব্রায়ান ডিকাসা

13
@BrianD। লগইন সম্ভবত একটি পরীক্ষার পরিবর্তে একটি "ফিক্সিং" হয় যা অন্য সকলের আগে চলতে হবে। আমি সম্ভবত একটি পূর্বেক্লাস লিখব যা লগ ইন করে এবং তারপরে যে কোনও ক্রমে সম্পাদন করার জন্য পরীক্ষাগুলি লিখি।
মার্কোস্পেরির

47
"পরীক্ষাগুলি স্বতন্ত্র হওয়া উচিত => পরীক্ষাগুলি অর্ডার স্বতন্ত্র হওয়া উচিত" জড়িত বিষয়টি সত্য নয়। শিক্ষার্থীদের হোমওয়ার্কগুলির স্বয়ংক্রিয় গ্রেডিং বিবেচনা করুন। আমি প্রথমে ছোট ইনপুটগুলির জন্য এবং পরে আরও বড় ইনপুটগুলির জন্য তাদের সমাধানটি পরীক্ষা করতে চাই। যখন সমাধানটি ছোট ইনপুটগুলির জন্য (সময় / মেমরির সীমা জন্য) ব্যর্থ হয়, তবে কেন পরীক্ষাগুলি বৃহত ইনপুটগুলির জন্য চালানো উচিত?
মিরিলন

96

আপনি যদি জুনিতের আপনার বিদ্যমান উদাহরণ থেকে মুক্তি পেয়ে যান এবং জুনেট 4.11 বা তার চেয়ে বেশি বিল্ড পাথ ডাউনলোড করেন, তবে নীচের কোডটি তাদের নাম অনুসারে পরীক্ষার পদ্ধতিগুলি চালিত করবে, আরোহণের ক্রমে সাজানো:

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SampleTest {

    @Test
    public void testAcreate() {
        System.out.println("first");
    }
    @Test
    public void testBupdate() {
        System.out.println("second");
    }
    @Test
    public void testCdelete() {
        System.out.println("third");
    }
}

8
উদাহরণস্বরূপ আমরা একটি অনুরূপ পদ্ধতি টেস্ট_০০১_লগিন () ব্যবহার করে দেখেছি, তবে যদিও এটি বেশিরভাগ ক্ষেত্রে অর্ডার সংরক্ষণে কাজ করে তবে এটির গ্যারান্টি দেওয়া হয় না we আমাদের টেস্ট চালানোর জন্য বেশ কয়েকটি উদাহরণ রয়েছে যেখানে 004, 005 এবং 006 007 পরে চালানো হয় It আপনি "WTF !," বলছেন এবং উত্তরের জন্য স্ট্যাকওভারফ্লোতে চলে যান।
ম্যাক্স পি ম্যাজি

দুর্দান্ত - JUnit 4.12 এ উপলব্ধ
DtechNet

1
আমার পরীক্ষাগুলিতে: টেস্টএকেস - কাজ হয়েছে, টেস্ট_এ_কেস / টেস্টএ_কেস - না!
রডিস্লাভ মলদোভান

6
আমি "মেথডোস্টার্স.জেভিএম", এই এনোটেশন প্যারামিটারটি চেষ্টা করেছি, উদাহরণস্বরূপ "@ ফিক্সমিথোর্ডার (মেথডোস্টার্স.জেভিএম)"। এপিআই থেকে: জেভিএম - জেভিএম ফেরত ক্রমে পরীক্ষার পদ্ধতিগুলি ফেলে দেয়। আমার (সিআরইউডি) আমি যা করছি তার জন্য ঠিকঠাক কাজ করে, তারা
যেভাবে

1
এই টীকাটি প্রকৃতপক্ষে একটি উত্তর, তবে এটির সতর্কতা রয়েছে যে এটি সংজ্ঞায়িত হয়নি (জুনিট 4.12 এ) এর সাথে @Inheritedআমার AbstractTestCaseপিতামাতার ক্লাসে অকার্যকর হয়ে পড়ে ।
AbVog

49

যদি অর্ডারটি গুরুত্বপূর্ণ হয় তবে আপনার নিজেরাই অর্ডারটি করা উচিত।

@Test public void test1() { ... }
@Test public void test2() { test1(); ... }

বিশেষত, আপনার প্রয়োজনে পরীক্ষার জন্য কিছু বা সমস্ত সম্ভাব্য অর্ডার ক্রমবিকাশের তালিকা করা উচিত necessary

উদাহরণ স্বরূপ,

void test1(); 
void test2(); 
void test3(); 


@Test
public void testOrder1() { test1(); test3(); }

@Test(expected = Exception.class)
public void testOrder2() { test2(); test3(); test1(); }

@Test(expected = NullPointerException.class)
public void testOrder3() { test3(); test1(); test2(); }

বা, সমস্ত আদেশের একটি সম্পূর্ণ পরীক্ষা:

@Test
public void testAllOrders() {
    for (Object[] sample: permute(1, 2, 3)) {
        for (Object index: sample) {
            switch (((Integer) index).intValue()) {
                case 1: test1(); break; 
                case 2: test2(); break; 
                case 3: test3(); break; 
            }
        }
    }
}

এখানে, permute()একটি সহজ ফাংশন যা অ্যারে সংগ্রহের মধ্যে সমস্ত সম্ভাব্য পার্মিশনগুলিকে পুনরাবৃত্তি করে।


তবে কি যদি বিভিন্ন ফাইলে পরীক্ষা হয়?
ওলেগ আব্রাজাইভ

3
প্রথম কোড ব্লক সালে test2রান test1 আবার । জুনিট এখনও চালাতে পারে test2আগে test1। এটি সম্ভবত আপনি যা ইচ্ছা করেছিলেন তা নয়, এবং প্রশ্নের কোনও বৈধ উত্তর নয়।
টুলফোজার

47

টেস্টএনজি-তে স্থানান্তর সবচেয়ে ভাল উপায় বলে মনে হচ্ছে তবে আমি এখানে junit- এর কোনও সুস্পষ্ট সমাধান দেখতে পাচ্ছি না। এখানে আমি সর্বাধিক পঠনযোগ্য সমাধান / ফর্ম্যাটিংটি পেয়েছি আমি jUnit এর জন্য:

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class SampleTest {
    @Test
    void stage1_prepareAndTest(){};

    @Test
    void stage2_checkSomething(){};

    @Test
    void stage2_checkSomethingElse(){};

    @Test
    void stage3_thisDependsOnStage2(){};

    @Test
    void callTimeDoesntMatter(){}
}

এটি নিশ্চিত করে যে পর্যায় 2 পদ্ধতিগুলি স্টেজ 1 এর পরে এবং স্টেজ 3 এর আগে ডাকা হবে।


5
এই পদ্ধতিটি দুর্দান্ত, তবে এটি উল্লেখ করা বৈধ হবে যে আপনার যদি 10 টিরও বেশি পরীক্ষা করা থাকে তবে আপনি যদি 0উপসর্গ যোগ না করেন তবে তা ঠিক কাজ করবে নাvoid stage01_prepareAndTest(){ }
এলিএক্স

যদি আপনার 10 টিরও বেশি পর্যায় থাকে (পরীক্ষা নয়) - হ্যাঁ। আমি যখন সম্ভব তখন প্রতিটি পর্যায়ে সংখ্যা সীমাবদ্ধ করা এবং আরও পরীক্ষা করা পছন্দ করি।
জোড়ো

18

আমি জুনিতের সাথে কাজ করার সময় এটির একটি প্রধান সমস্যা যার মুখোমুখি হয়েছিল এবং আমি নিম্নলিখিত সমাধান নিয়ে এসেছি যা আমার পক্ষে ভাল কাজ করে:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;

public class OrderedRunner extends BlockJUnit4ClassRunner {

    public OrderedRunner(Class<?> clazz) throws InitializationError {
        super(clazz);
    }

    @Override
    protected List<FrameworkMethod> computeTestMethods() {
        List<FrameworkMethod> list = super.computeTestMethods();
        List<FrameworkMethod> copy = new ArrayList<FrameworkMethod>(list);
        Collections.sort(copy, new Comparator<FrameworkMethod>() {

            @Override
            public int compare(FrameworkMethod f1, FrameworkMethod f2) {
                Order o1 = f1.getAnnotation(Order.class);
                Order o2 = f2.getAnnotation(Order.class);

                if (o1 == null || o2 == null) {
                    return -1;
                }

                return o1.order() - o2.order();
            }
        });
        return copy;
    }
}

নীচের মত একটি ইন্টারফেসও তৈরি করুন:

 @Retention(RetentionPolicy.RUNTIME)


@Target({ ElementType.METHOD})

public @interface Order {
public int order();
}

এখন ধরুন আপনার ক্লাস এ রয়েছে যেখানে আপনি নীচের মতো বেশ কয়েকটি পরীক্ষার কেস লিখেছেন:

(@runWith=OrderRunner.class)
Class A{
@Test
@Order(order = 1)

void method(){

//do something

}

}

সুতরাং কার্যকর পদ্ধতি "পদ্ধতি ()" নামক পদ্ধতি থেকে শুরু হবে। ধন্যবাদ!


পাওয়ারমকের সাথে আরও একটি জুনিত রানার ব্যবহার করা সংস্করণ ১.6.০ থেকে পাওয়ারম্যাকের কাছে জাউনিত রুল ব্যবহার না করেই পরীক্ষাটি কার্যকর করার জন্য অন্য JUnit রানারকে দায়িত্ব অর্পণ করার পক্ষে সমর্থন রয়েছে। এটি আপনার পছন্দের অন্য রানারকে প্রকৃত পরীক্ষা-সম্পাদন ছেড়ে দেয়। @RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(OrderedRunner.class)
কিরিয়াকোস জর্জিওপল্লোস

11

JUnit বর্তমানে ক্লাস টীকাগুলি ব্যবহার করে পরীক্ষা পদ্ধতিগুলি অর্ডারিং চালানোর অনুমতি দেয়:

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@FixMethodOrder(MethodSorters.JVM)
@FixMethodOrder(MethodSorters.DEFAULT)

ডিফল্টরূপে পরীক্ষা পদ্ধতিগুলি বর্ণানুক্রমিক ক্রমে চালিত হয়। সুতরাং, নির্দিষ্ট পদ্ধতির অর্ডার সেট করতে আপনি তাদের নাম রাখতে পারেন:

a_estWorkUnit_WithCertainState_ShouldDoSome ਕੁਝ bestestWorkUnit_WithCertainState_ShouldDoSomething c_TestWorkUnit_WithCertainState_ShouldDoSomething

আপনি এখানে উদাহরণ খুঁজে পেতে পারেন ।


8

(হিসাবে এখনও অপ্রকাশিত) পরিবর্তন https://github.com/junit-team/junit/pull/386 পরিচয় করিয়ে দেয় a @SortMethodsWithhttps://github.com/junit-team/junit/pull/293 অন্তত তা ছাড়া অর্ডারটি পূর্বাভাসযোগ্য করে তুলেছিল (জাভা 7 এ এটি বেশ এলোমেলো হতে পারে)।


1
দেখে মনে হচ্ছে যে # 386 টি 4.11 এ একীভূত করা হয়েছে।
জেসি গ্লিক 21

এই পৃষ্ঠার নীচে আরও উল্লিখিত হিসাবে, এটি আসলে বলা হয় @FixMethodOrder না @SortMethodsWithযে 4.11
vorburger

6

জুনিতের একটি প্রতিবেদন দেখুন। JUnit ইতিমধ্যে প্যাকেজ দ্বারা সংগঠিত। প্রতিটি প্যাকেজটিতে টেস্টসুইট ক্লাস থাকে (বা থাকতে পারে) যার মধ্যে প্রতিটি একাধিক টেস্ট কেস চালায়। প্রতিটি টেস্টকেসে ফর্মের একাধিক পরীক্ষার পদ্ধতি থাকতে পারেpublic void test*() , যার প্রতিটিই প্রকৃতপক্ষে তারা যার যার সাথে সম্পর্কিত টেস্ট কেস শ্রেণির উদাহরণ হয়ে উঠবে। প্রতিটি পরীক্ষার পদ্ধতিতে (টেস্টকেস উদাহরণ) একটি নাম এবং একটি পাস / ব্যর্থ মানদণ্ড থাকে।

আমার পরিচালনার জন্য যা প্রয়োজন তা হ'ল পৃথক টেস্টস্টেপ আইটেমগুলির ধারণা , যার মধ্যে প্রতিটি তাদের নিজস্ব পাস / ব্যর্থতার মাপদণ্ডের প্রতিবেদন করে। কোনও পরীক্ষার পদক্ষেপের ব্যর্থতা অবশ্যই পরবর্তী পরীক্ষার পদক্ষেপগুলি কার্যকর করতে বাধা দেয় না।

অতীতে, আমার অবস্থানের পরীক্ষার বিকাশকারীরা টেস্টকেস ক্লাসগুলি প্যাকেজগুলিতে সংগঠিত করে যা পরীক্ষার অধীনে পণ্যটির অংশ (গুলি) এর সাথে সামঞ্জস্য করে, প্রতিটি পরীক্ষার জন্য একটি টেস্টকেস ক্লাস তৈরি করে, এবং প্রতিটি পরীক্ষার পদ্ধতিটিকে পরীক্ষায় পৃথক "পদক্ষেপ" করে তোলে, JUnit আউটপুটে নিজস্ব পাস / ব্যর্থ মানদণ্ড সহ সম্পূর্ণ করুন। প্রতিটি টেস্টকেস একটি স্বতন্ত্র "পরীক্ষা", তবে স্বতন্ত্র পদ্ধতিগুলি বা টেস্টক্যাসের মধ্যে "পদক্ষেপ" পরীক্ষা অবশ্যই একটি নির্দিষ্ট ক্রমে ঘটে থাকে।

টেস্টকেস পদ্ধতিগুলি টেস্টকেসের পদক্ষেপ ছিল এবং পরীক্ষা ডিজাইনাররা পরীক্ষার ধাপে পৃথক পাস / ব্যর্থ মাপদণ্ড পায়। এখন পরীক্ষার পদক্ষেপগুলি ঝাঁপিয়ে পড়েছে, এবং পরীক্ষাগুলি (অবশ্যই) ব্যর্থ হয়।

উদাহরণ স্বরূপ:

Class testStateChanges extends TestCase

public void testCreateObjectPlacesTheObjectInStateA()
public void testTransitionToStateBAndValidateStateB()
public void testTransitionToStateCAndValidateStateC()
public void testTryToDeleteObjectinStateCAndValidateObjectStillExists()
public void testTransitionToStateAAndValidateStateA()
public void testDeleteObjectInStateAAndObjectDoesNotExist()
public void cleanupIfAnythingWentWrong()

প্রতিটি পরীক্ষার পদ্ধতি তার নিজস্ব পৃথক পাস / ব্যর্থ মানদণ্ডকে দৃ as় প্রতিবেদন করে এবং রিপোর্ট করে। অর্ডার দেওয়ার জন্য "এটিকে একটি বড় পরীক্ষা পদ্ধতিতে" ভেঙে ফেলা JUnit সারাংশ প্রতিবেদনে প্রতিটি "পদক্ষেপ" এর পাস / ব্যর্থ মানদণ্ডের গ্রানুলারিটি হারায়। ... এবং এটি আমার পরিচালকদের মন খারাপ করে। তারা বর্তমানে অন্য একটি বিকল্প দাবি করছে।

যে কেউ কীভাবে ব্যাখ্যা করতে পারে যে স্ক্র্যাম্বল্ড পরীক্ষার পদ্ধতিতে অর্ডার সহ একজন জুনিয়ট প্রতিটি অনুক্রমিক পরীক্ষার ধাপের পৃথক পাস / ব্যর্থ মানদণ্ডকে সমর্থন করবে, যেমন উপরে আমার উদাহরণ অনুসারে উদাহরণস্বরূপ এবং প্রয়োজনীয়?

ডকুমেন্টেশন নির্বিশেষে, আমি এটিকে JUnit কাঠামোর একটি গুরুতর প্রতিরোধ হিসাবে দেখছি যা প্রচুর পরীক্ষা বিকাশকারীদের জীবনকে কঠিন করে তুলছে।


6

পাঁচটি আপডেট (এবং আমার মতামত)

আমি মনে করি এটি JUnit এর জন্য বেশ গুরুত্বপূর্ণ বৈশিষ্ট্য, JUnit এর লেখক যদি অর্ডার বৈশিষ্ট্যটি না চান তবে কেন?

ডিফল্টরূপে, ইউনিট পরীক্ষার লাইব্রেরিগুলি উত্স ফাইলে যে ক্রম ঘটে তা পরীক্ষা করে চালানোর চেষ্টা করে না।
JUnit 5 হিসাবে JUnit 4 সেইভাবে কাজ করে। কেন? কারণ যদি অর্ডারের বিষয়টি বিবেচনা করে তবে এর অর্থ হ'ল কিছু পরীক্ষা তাদের মধ্যে মিলিত হয়েছে এবং এটি ইউনিট পরীক্ষার জন্য অযাচিত
সুতরাং @NestedJUnit 5 দ্বারা প্রবর্তিত বৈশিষ্ট্যটি একই ডিফল্ট পদ্ধতির অনুসরণ করে।

তবে ইন্টিগ্রেশন পরীক্ষার জন্য, পরীক্ষা পদ্ধতির ক্রমটি বিবেচনা করতে পারে কারণ একটি পরীক্ষা পদ্ধতি অন্য পরীক্ষার পদ্ধতির দ্বারা প্রত্যাশিত উপায়ে প্রয়োগের অবস্থার পরিবর্তন করতে পারে। উদাহরণস্বরূপ, আপনি যখন কোনও ই-শপ চেকআউট প্রসেসিংয়ের জন্য ইন্টিগ্রেশন টেস্ট লেখেন, কার্যকর করার জন্য প্রথম পরীক্ষার পদ্ধতিটি একজন ক্লায়েন্টকে নিবন্ধভুক্ত করা হয়, দ্বিতীয়টি ঝুড়িতে আইটেম যুক্ত করছে এবং শেষটি চেকআউট করছে। যদি পরীক্ষক রানার সেই আদেশটিকে সম্মান না করে তবে পরীক্ষার দৃশ্যটি ত্রুটিযুক্ত এবং ব্যর্থ হবে।
সুতরাং জুনিয়ট 5-এ (5.4 সংস্করণ থেকে) আপনি পরীক্ষার ক্লাসটি @TestMethodOrder(OrderAnnotation.class)বর্নিত করে এবং আদেশের সাথে সম্পর্কিত @Order(numericOrderValue)পদ্ধতিগুলির সাথে অর্ডার নির্দিষ্ট করে নির্বাহের আদেশ সেট করার সম্ভাবনা একই রকম রয়েছে ।

উদাহরণ স্বরূপ :

@TestMethodOrder(OrderAnnotation.class) 
class FooTest {

    @Order(3)
    @Test
    void checkoutOrder() {
        System.out.println("checkoutOrder");
    }

    @Order(2)
    @Test
    void addItemsInBasket() {
        System.out.println("addItemsInBasket");
    }

    @Order(1)
    @Test
    void createUserAndLogin() {
        System.out.println("createUserAndLogin");
    }
}

আউটপুট:

createUserAndLogin

addItemsInBasket

checkoutOrder

উপায় দ্বারা, নির্দিষ্ট করা @TestMethodOrder(OrderAnnotation.class) মনে হচ্ছে (কমপক্ষে আমি পরীক্ষিত 5.4.0 সংস্করণে)।

পার্শ্ব নোট
প্রশ্ন সম্পর্কে: সম্মিলন 5 কি ইন্টিগ্রেশন টেস্ট লেখার সেরা পছন্দ? আমি মনে করি না যে এটি বিবেচনা করার প্রথম সরঞ্জাম হওয়া উচিত (শসা এবং কো প্রায়শই আরও বেশি নির্দিষ্ট মান এবং ইন্টিগ্রেশন পরীক্ষার জন্য বৈশিষ্ট্যগুলি আনতে পারে) তবে কিছু সংহতকরণ পরীক্ষার ক্ষেত্রে জাউনিত কাঠামো যথেষ্ট। সুতরাং এটি একটি সুসংবাদ যা বৈশিষ্ট্যটি বিদ্যমান।


4

আমি একমত নই, আমি যদি 'ফাইল আপলোড' পরীক্ষা করতে চাই এবং তারপরে 'ফাইল আপলোড দ্বারা প্রবেশ করা ডেটা' পরীক্ষা করতে চাই তবে কেন আমি এগুলি একে অপরের থেকে স্বতন্ত্র থাকতে চাই না? পুরোপুরি যুক্তিযুক্ত আমি মনে করি যে এগুলি উভয়কে গলিয়াথ পরীক্ষার ক্ষেত্রে রাখার চেয়ে আলাদা করে চালাতে সক্ষম হবে।


3

স্যুট হিসাবে পরীক্ষার কেসগুলি চালিত হওয়ার সময় আপনি যা চান তা পুরোপুরি যুক্তিসঙ্গত।

দুর্ভাগ্যক্রমে এখনই একটি সম্পূর্ণ সমাধান দেওয়ার সময় নেই, তবে শ্রেণিতে একবার দেখুন:

org.junit.runners.Suite

যা আপনাকে নির্দিষ্ট ক্রমে পরীক্ষার কেসগুলি (যে কোনও পরীক্ষার শ্রেণি থেকে) কল করতে দেয়।

এগুলি কার্যকরী, সংহতকরণ বা সিস্টেম পরীক্ষা তৈরি করতে ব্যবহৃত হতে পারে।

এটি আপনার ইউনিট পরীক্ষাগুলি সুনির্দিষ্ট অর্ডার ছাড়াই (প্রস্তাবিত হিসাবে) ছেড়ে দেয়, আপনি সেগুলি চালিত করেন কি না এবং তারপরে পরীক্ষাগুলি আরও বড় ছবির অংশ হিসাবে পুনরায় ব্যবহার করুন।

আমরা ইউনিট, সংহতকরণ এবং সিস্টেম পরীক্ষার জন্য একই কোডটি পুনরায় ব্যবহার / উত্তরাধিকারী করি, কখনও ডেটা চালিত, কখনও চালিত প্রতিশ্রুতিবদ্ধ এবং কখনও কখনও স্যুট হিসাবে চালিত করি run


2
২০১৪ সাল থেকে আপনার এই উত্তরটি সম্পূর্ণ করার সময় নেই? ;)
চার্লি

2

আমার সমাধানটি এখানে দেখুন: "জুনিট এবং জাভা"। "

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

http://intellijava.blogspot.com/2012/05/junit-and-java-7.html

তবে পাস্কাল থিভেন্ট যেমন বলেছিলেন, এটি কোনও ভাল অনুশীলন নয়।


আমি আপনার ব্লগ পোস্টটি দেখেছি (রাশিয়ান ভাষায়!) তবে এটি খুব জটিল।
নিকোলাস বারবুলেসকো

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

1
এই পোস্টে একটি সত্য উত্তর নেই। দয়া করে লিঙ্কটি ছাড়াও কমপক্ষে প্রাথমিক ব্যাখ্যাটি বিবেচনা করুন।
ডিফল্ট লোকেল

1

JUnit 5.4 দিয়ে, আপনি অর্ডারটি নির্দিষ্ট করতে পারবেন:

@Test
@Order(2)
public void sendEmailTestGmail() throws MessagingException {

আপনার শুধু আপনার ক্লাসটি টিকিয়ে দেওয়া দরকার

@TestMethodOrder(OrderAnnotation.class)

https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order

আমি আমার প্রকল্পে এটি ব্যবহার করছি এবং এটি খুব ভাল কাজ করে!


0

আমি কয়েকটি উত্তর পড়েছি এবং এর সর্বোত্তম অনুশীলনের সাথে একমত নই, তবে আপনার পরীক্ষাগুলির অর্ডার দেওয়ার সবচেয়ে সহজ উপায় - এবং ইউইনিত যেভাবে ডিফল্টরূপে পরীক্ষা চালায় তা হ'ল বর্ণানুক্রমিক নাম দ্বারা আরোহণ।

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

test12 টেস্ট 2 এর আগে চলবে

তাই:

টেস্টএ_মায় ফার্স্ট টেস্ট টেস্ট সি_হির্ড টেস্ট বি_এটিস্টট্যাটরংসসেকেন্ড


0

দয়া করে এটি দেখুন: https://github.com/TransparentMarket/ junit । এটি নির্ধারিত ক্রমে পরীক্ষা চালায় (সংকলিত শ্রেণীর ফাইলের মধ্যে সংজ্ঞায়িত)। এছাড়াও এটিতে প্রথম সাব প্যাকেজ দ্বারা সংজ্ঞায়িত পরীক্ষা চালানোর জন্য একটি অলটেস্ট স্যুট বৈশিষ্ট্যযুক্ত। অল টেস্ট বাস্তবায়ন ব্যবহার করে সম্পত্তিগুলির ফিল্টারিংয়ের ক্ষেত্রে সমাধানটি প্রসারিত করতে পারে (আমরা @ দ্রুত টীকা ব্যবহার করতে পারি তবে সেগুলি এখনও প্রকাশিত হয়নি)।


0

এখানে JUnit- এ একটি বর্ধিতকরণ রয়েছে যা পছন্দসই আচরণ তৈরি করতে পারে: https://github.com/aafuks/aaf- জুনit

আমি জানি যে এটি JUnit দর্শনের লেখকদের বিরুদ্ধে, কিন্তু JUnit ব্যবহার করার সময় এমন পরিবেশে যেগুলি কঠোর ইউনিট টেস্টিং নয় (জাভা হিসাবে অনুশীলন করা হয়েছে) এটি খুব সহায়ক হতে পারে।


0

আমি এখানে এই ভেবে শেষ করেছি যে আমার পরীক্ষাগুলি যথাযথভাবে চালানো হয়নি, তবে সত্যটি হল যে এই গোলযোগ আমার অ্যাসিঙ্ক জবগুলিতে ছিল। সমঝোতা নিয়ে কাজ করার সময় আপনার পরীক্ষার মধ্যেও একযোগে চেক করতে হবে perform আমার ক্ষেত্রে, চাকরি এবং পরীক্ষাগুলি একটি সেমফোর ভাগ করে, তাই চলমান চাকরিটি লকটি প্রকাশ না হওয়া পর্যন্ত পরবর্তী পরীক্ষাগুলি স্তব্ধ।

আমি জানি এটি এই প্রশ্নের সাথে পুরোপুরি সম্পর্কিত নয়, তবে সম্ভবত সঠিক সমস্যাটি লক্ষ্য করে সহায়তা করতে পারে


0

আপনি এই কোডগুলির একটি অংশ ব্যবহার করতে পারেন:

@FixMethodOrder(MethodSorters.JVM)OR `@FixMethodOrder(MethodSorters.DEFAULT)` OR `@FixMethodOrder(MethodSorters.NAME_ASCENDING)` before your test class like this:


@FixMethodOrder(MethodSorters.NAME_ASCENDING)


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