আমি এলোমেলো ইভেন্টের উপর ভিত্তি করে কোড কভার করতে পরীক্ষার কেসগুলি কীভাবে ডিজাইন করতে পারি?


15

উদাহরণস্বরূপ, যদি কোডটি 0-10 থেকে একটি এলোমেলো int তৈরি করে এবং প্রতিটি ফলাফলের জন্য আলাদা শাখা নেয়, তবে এই জাতীয় কোডটিতে 100% বিবৃতি কভারেজের গ্যারান্টি দেওয়ার জন্য কীভাবে একটি পরীক্ষা স্যুট ডিজাইন করা যায়?

জাভাতে কোডটি এমন কিছু হতে পারে:

int i = new Random().nextInt(10);
switch(i)
{
    //11 case statements
}

উত্তর:


22

ডেভিডের উত্তরটি প্রসারিত করা যাদের সাথে আমি পুরোপুরি একমত যে আপনার এলোমেলোভাবে একটি মোড়ক তৈরি করা উচিত। আমি এটি সম্পর্কে একই একই প্রশ্নে বেশ একই উত্তরটি লিখেছিলাম সুতরাং এটির একটি "ক্লিফের নোট সংস্করণ" এখানে রয়েছে।

আপনার যা করা উচিত তা হ'ল প্রথমে একটি ইন্টারফেস (বা বিমূর্ত শ্রেণি) হিসাবে র‌্যাপার তৈরি করা:

public interface IRandomWrapper {
    int getInt();
}

এবং এর জন্য কংক্রিট শ্রেণিটি দেখতে এইরকম হবে:

public RandomWrapper implements IRandomWrapper {

    private Random random;

    public RandomWrapper() {
        random = new Random();
    }

    public int getInt() {
        return random.nextInt(10);
    }

}

আপনার শ্রেণিটি নিম্নরূপ বলুন:

class MyClass {

    public void doSomething() {
        int i=new Random().nextInt(10)
        switch(i)
        {
            //11 case statements
        }
    }

}

IRandomWrapper সঠিকভাবে ব্যবহার করার জন্য আপনাকে নিজের শ্রেণিটি সদস্য হিসাবে নিতে (কনস্ট্রাক্টর বা সেটারের মাধ্যমে) পরিবর্তন করতে হবে:

public class MyClass {

    private IRandomWrapper random = new RandomWrapper(); // default implementation

    public setRandomWrapper(IRandomWrapper random) {
        this.random = random;
    }

    public void doSomething() {
        int i = random.getInt();
        switch(i)
        {
            //11 case statements
        }
    }

}

আপনি এখন র‌্যাপারটির সাথে মশকরা করে আপনার ক্লাসের আচরণটি পরীক্ষা করতে পারবেন। আপনি এটি একটি উপহাসের কাঠামোর সাহায্যে করতে পারেন, তবে এটি নিজের দ্বারা করাও সহজ:

public class MockedRandomWrapper implements IRandomWrapper {

   private int theInt;    

   public MockedRandomWrapper(int theInt) {
       this.theInt = theInt;
   }

   public int getInt() { 
       return theInt;
   }

}

যেহেতু আপনার ক্লাসটি এমন কিছু প্রত্যাশা করে যা দেখে মনে হয় IRandomWrapperআপনি এখন বিদ্রুপকৃতটিকে আপনার পরীক্ষায় আচরণকে বাধ্য করার জন্য ব্যবহার করতে পারেন। এখানে JUnit পরীক্ষার কয়েকটি উদাহরণ রয়েছে:

@Test
public void testFirstSwitchStatement() {
    MyClass mc = new MyClass();
    IRandomWrapper random = new MockedRandomWrapper(0);
    mc.setRandomWrapper(random);

    mc.doSomething();

    // verify the behaviour for when random spits out zero
}

@Test
public void testFirstSwitchStatement() {
    MyClass mc = new MyClass();
    IRandomWrapper random = new MockedRandomWrapper(1);
    mc.setRandomWrapper(random);

    mc.doSomething();

    // verify the behaviour for when random spits out one
}

আশাকরি এটা সাহায্য করবে.


3
সম্পূর্ণরূপে এটির সাথে একমত। আপনি ইভেন্টের এলোমেলো প্রকৃতি অপসারণ করে একটি এলোমেলো ইভেন্টটি পরীক্ষা করেন। একই তত্ত্বটি টাইমস্ট্যাম্পগুলির জন্য ব্যবহার করা যেতে পারে
রিচার্ড

3
দ্রষ্টব্য: এই টেকনিক, কোনও বস্তুকে তার প্রয়োজন মতো অন্য বস্তু দেওয়ার পরিবর্তে তাকে সেগুলি দমিয়ে দেওয়ার পরিবর্তে তাকে নির্ভরতা ইনজেকশন বলা হয়
ক্লিমেন্ট হেরম্যান

23

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


5

আপনি একটি নির্দিষ্ট পরিসীমা (0-10) এবং একটি নির্দিষ্ট গ্রানুলারিটি (পুরো সংখ্যা) পেয়েছেন। সুতরাং পরীক্ষার সময়, আপনি এলোমেলো সংখ্যা দিয়ে পরীক্ষা করবেন না। আপনি এমন একটি লুপের মধ্যে পরীক্ষা করেন যা প্রতিটি ক্ষেত্রে ঘুরবে। আমি কেস স্টেটমেন্ট সম্বলিত একটি উপ-ফাংশনে এলোমেলো নম্বরটি পাস করার পরামর্শ দেব, যা আপনাকে কেবল উপ-ফাংশনটি পরীক্ষা করতে দেয়।


আমি যে পরামর্শ দিয়েছি তার চেয়ে অনেক বেশি ভাল (কারণ আরও সহজ), আশা করি আমি আমার উপন্যাসগুলি স্থানান্তর করতে পারব :)
ডেভিড

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

3

আপনি পাওয়ারমক লাইব্রেরিটি এলোমেলো শ্রেণীর উপহাস করার জন্য ব্যবহার করতে পারেন এবং প্রত্যাশিত মানটি ফিরে পেতে তার পরবর্তী আইটেম () পদ্ধতিটি আটকে রাখতে পারেন। আপনি না চাইলে আপনার মূল কোডটি পরিবর্তন করার দরকার নেই।

আমি পাওয়ারমোকিটো ব্যবহার করছি এবং কেবল আপনার মতো একটি পদ্ধতি পরীক্ষা করেছি। আপনি JUnit পরীক্ষা পোস্ট করেছেন এমন কোডের জন্য এমন কিছু দেখতে পাওয়া উচিত:

@RunWith(PowerMockRunner.class)
@PrepareForTest( { Random.class, ClassUsingRandom.class } ) // Don't forget to prepare the Random class! :)

public void ClassUsingRandomTest() {

    ClassUsingRandom cur;
    Random mockedRandom;

    @Before
    public void setUp() throws Exception {

        mockedRandom = PowerMockito.mock(Random.class);

        // Replaces the construction of the Random instance in your code with the mock.
        PowerMockito.whenNew(Random.class).withNoArguments().thenReturn(mockedRandom);

        cur = new ClassUsingRandom();
    }

    @Test
    public void testSwitchAtZero() {

        PowerMockito.doReturn(0).when(mockedRandom).nextInt(10);

        cur.doSomething();

        // Verify behaviour at case 0
     }

    @Test
    public void testSwitchAtOne() {

        PowerMockito.doReturn(1).when(mockedRandom).nextInt(10);

        cur.doSomething();

        // Verify behaviour at case 1
     }

    (...)

আপনি যদি আপনার স্যুইচটিতে আরও কেস যুক্ত করতে চান তবে আপনি যে কোনও প্যারামিটারটি পেতে পরবর্তী (অন্তর্) কলটিও আটকে রাখতে পারেন:

PowerMockito.doReturn(0).when(mockedRandom).nextInt(Mockito.anyInt());

বেশ, তাই না? :)


2

ব্যবহার কুইকচেক ! আমি সম্প্রতি এটি নিয়ে খেলতে শুরু করেছি এবং এটি আশ্চর্যজনক। বেশিরভাগ দুর্দান্ত ধারণার মতো এটি হাস্কেল থেকে আসে তবে মূল ধারণাটি হ'ল পরীক্ষার প্রাক ক্যানড পরীক্ষার কেস দেওয়ার পরিবর্তে আপনি আপনার এলোমেলো নম্বর জেনারেটরটি আপনার জন্য তৈরি করতে দিন build XUnit এ আপনি সম্ভবত যে 4-6 কেস নিয়ে আসবেন তার পরিবর্তে আপনি কম্পিউটারে কয়েকশো বা হাজারো ইনপুট চেষ্টা করে দেখতে পারেন এবং কোনটি আপনার দ্বারা নির্ধারিত নিয়ম মানছে না তা দেখুন।

এছাড়াও কুইকচেক যখন একটি ব্যর্থ কেসটি খুঁজে পায় তখন এটি সরল করার চেষ্টা করবে যাতে এটি ব্যর্থ হওয়া সহজতম সম্ভাব্য কেসটি খুঁজে পেতে পারে। (এবং অবশ্যই যখন আপনি একটি ব্যর্থ কেসটি খুঁজে পান তবে আপনি এটি এক্স-ইউনাইট পরীক্ষায়ও তৈরি করতে পারেন)

জাভাটির কমপক্ষে দুটি সংস্করণ উপস্থিত রয়েছে যাতে অংশটি কোনও সমস্যা না হয়।

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