JUnit দিয়ে জাভাতে অ্যাবস্ট্রাক্ট ক্লাস কীভাবে পরীক্ষা করবেন?


87

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

আমার সমস্যাটি হ'ল: আমার কিছু বিমূর্ত পদ্ধতি সহ একটি বিমূর্ত শ্রেণি রয়েছে। তবে কিছু পদ্ধতি রয়েছে যা বিমূর্ত নয়। আমি কীভাবে এই ইউনিটটি JUnit এর সাথে পরীক্ষা করতে পারি? উদাহরণ কোড (খুব সাধারণ):

abstract class Car {

    public Car(int speed, int fuel) {
        this.speed = speed;
        this.fuel = fuel;
    }

    private int speed;
    private int fuel;

    abstract void drive();

    public int getSpeed() {
        return this.speed;
    }

    public int getFuel() {
        return this.fuel;
    }
}

আমি পরীক্ষা getSpeed()এবং getFuel()ফাংশন করতে চান ।

এই সমস্যার অনুরূপ প্রশ্নটি এখানে , তবে এটি JUnit ব্যবহার করছে না।

JUnit FAQ বিভাগে, আমি এই লিঙ্কটি পেয়েছি , তবে লেখক এই উদাহরণ দিয়ে কী বলতে চান তা আমি বুঝতে পারি না। কোডের এই লাইনটির অর্থ কী?

public abstract Source getSource() ;

4
দেখুন stackoverflow.com/questions/1087339/... Mockito ব্যবহার দুই সমাধানের জন্য।
ddso

পরীক্ষার জন্য অন্য কাঠামো শেখার কোনও সুবিধা আছে কি? মকিতো কি কেবলই জুটিতের এক্সটেনশান, বা সম্পূর্ণ আলাদা প্রকল্প?
ভাস্কো

মকিতো JUnit প্রতিস্থাপন করে না। অন্যান্য উপহাস ফ্রেমওয়ার্কগুলির মতো এটিও ইউনিট পরীক্ষার কাঠামোর পাশাপাশি ব্যবহৃত হয় এবং আপনাকে পরীক্ষার ক্ষেত্রে মক অবজেক্ট তৈরি করতে সহায়তা করে।
ddso

উত্তর:


105

আপনার যদি ক্লাসের কোনও দৃ concrete় বাস্তবায়ন না হয় এবং পদ্ধতিগুলি staticতাদের পরীক্ষার বিন্দুটি না হয় ? আপনার যদি কংক্রিটের শ্রেণি থাকে তবে আপনি কংক্রিট শ্রেণীর পাবলিক এপিআইয়ের অংশ হিসাবে সেই পদ্ধতিগুলি পরীক্ষা করে দেখবেন।

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


17
100% কোড কভারেজ একটি পৌরাণিক কাহিনী। আপনার অ্যাপ্লিকেশনটি কীভাবে আচরণ করা উচিত (আপনার কাছে লা লা টেস্ট ড্রাইভেন ডেভলপমেন্ট লেখার আগে অগ্রাধিকার সহকারে লেখা উচিত) সম্পর্কে আপনার সমস্ত পরিচিত অনুমানকে আবৃত করার জন্য আপনার যথাযথ পরীক্ষা করা উচিত। আমি বর্তমানে একটি অত্যন্ত কার্যকরী টিডিডি টিমে কাজ করছি এবং আমরা আমাদের শেষ বিল্ড হিসাবে কেবল আমাদের বিকাশ হিসাবে 63% কভারেজ পেয়েছি। সেটা কি ভালো? কে জানে ?, তবে আমি ফিরে যেতে এবং সেই উচ্চতরটিকে উত্সাহিত করার চেষ্টা করা সময়ের অপচয় হিসাবে বিবেচনা করব।
nsfyn55

4
নিশ্চিত কেউ কেউ বলবেন যে এটি ভাল টিডিডির লঙ্ঘন। কল্পনা করুন আপনি একটি দলে রয়েছেন। আপনি এই ধারণাটি শেষ করেন যে পদ্ধতিটি চূড়ান্ত এবং কোনও কংক্রিট বাস্তবায়নের জন্য পরীক্ষা দেবে না। কেউ মোডিফায়ার অপসারণ করে এবং এমন পরিবর্তনগুলি করে যা উত্তরাধিকার শ্রেণিবিন্যাসের পুরো শাখাটি নীচে ফেলে দেয়। আপনি কি চান না যে আপনার টেস্ট স্যুটটি এটি ধরে ফেলবে?
nsfyn55

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

4
@ nsfyn55 কংক্রিটের পদ্ধতি থাকলে কী হত final? বাস্তবায়ন পরিবর্তন করতে না পারলে একই পদ্ধতিটি একাধিকবার পরীক্ষার কারণ আমি দেখতে পাচ্ছি না
ডায়োক্সিন

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

36

বিমূর্ত শ্রেণীর উত্তরাধিকার সূত্রে একটি কংক্রিট শ্রেণি তৈরি করুন এবং তারপরে অ্যাবস্ট্রাক্ট ক্লাস থেকে কংক্রিটের বর্গ উত্তরাধিকার সূত্রে প্রাপ্ত ফাংশনগুলি পরীক্ষা করুন।


আপনি যদি বিমূর্ত শ্রেণীর প্রসারিত 10 টি কংক্রিটের ক্লাস করেন এবং এই কংক্রিট ক্লাসগুলির প্রত্যেকটি কেবল 1 টি পদ্ধতি বাস্তবায়ন করবে এবং আপনি বলি যে অন্যান্য 2 পদ্ধতি এই শ্রেণীর প্রত্যেকের জন্য একই, কারণ তারা বিমূর্তে প্রয়োগ করা হয়েছে ক্লাস? আমার কেসটি হ'ল আমি প্রতিটি উপক্লাসে বিমূর্ত শ্রেণির জন্য পরীক্ষাগুলি অনুলিপি করতে চাই না।
স্ক্র্যাফফেস

12

উদাহরণস্বরূপ আপনি পোস্ট করেছেন এমন শ্রেণীর সাথে এটি পরীক্ষা করার পক্ষে তেমন বুদ্ধিমান মনে হয় না getFuel()এবং getSpeed()যেহেতু তারা কেবল 0 (এখানে কোনও সেটটার নেই) ফিরতে পারে।

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

উদাহরণস্বরূপ, আপনার মধ্যে TestCaseআপনি এটি করতে পারেন:

c = new Car() {
       void drive() { };
   };

তারপরে বাকি পদ্ধতিগুলি পরীক্ষা করুন, যেমন:

public class CarTest extends TestCase
{
    private Car c;

    public void setUp()
    {
        c = new Car() {
            void drive() { };
        };
    }

    public void testGetFuel() 
    {
        assertEquals(c.getFuel(), 0);
    }

    [...]
}

(এই উদাহরণটি JUnit3 বাক্য গঠনের উপর ভিত্তি করে J JUnit4- এর ক্ষেত্রে কোডটি কিছুটা আলাদা হবে তবে ধারণাটি একই।


উত্তরের জন্য ধন্যবাদ. হ্যাঁ, আমার উদাহরণটি সরল করা হয়েছিল (এবং এত ভাল নয়)। এখানে সমস্ত উত্তর পড়ার পরে, আমি ডামি ক্লাস লিখেছিলাম। তবে তার উত্তরে @ nsfyn55 লিখেছেন, আমি এই বিমূর্ত শ্রেণির প্রতিটি বংশধরের জন্য পরীক্ষা লিখি।
ভাস্কো

9

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

এর বিমূর্ত পরীক্ষা শ্রেণি Car:

abstract class CarTest {

// the factory method
abstract Car createCar(int speed, int fuel);

// all test methods need to make use of the factory method to create the instance of a car
@Test
public void testGetSpeed() {
    Car car = createCar(33, 44);
    assertEquals(car.getSpeed(), 33);
    ...

বাস্তবায়ন Car

class ElectricCar extends Car {

    private final int batteryCapacity;

    public ElectricCar(int speed, int fuel, int batteryCapacity) {
        super(speed, fuel);
        this.batteryCapacity = batteryCapacity;
    }

    ...

ইউনিট পরীক্ষা বর্গ ElectricCarTestক্লাস এর ElectricCar:

class ElectricCarTest extends CarTest {

    // implementation of the abstract factory method
    Car createCar(int speed, int fuel) {
        return new ElectricCar(speed, fuel, 0);
    }

    // here you cann add specific test methods
    ...

5

আপনি এই মত কিছু করতে পারে

public abstract MyAbstractClass {

    @Autowire
    private MyMock myMock;        

    protected String sayHello() {
            return myMock.getHello() + ", " + getName();
    }

    public abstract String getName();
}

// this is your JUnit test
public class MyAbstractClassTest extends MyAbstractClass {

    @Mock
    private MyMock myMock;

    @InjectMocks
    private MyAbstractClass thiz = this;

    private String myName = null;

    @Override
    public String getName() {
        return myName;
    }

    @Test
    public void testSayHello() {
        myName = "Johnny"
        when(myMock.getHello()).thenReturn("Hello");
        String result = sayHello();
        assertEquals("Hello, Johnny", result);
    }
}

4

আমি একটি জাভিত অন্তর্গত শ্রেণি তৈরি করব যা বিমূর্ত শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত। এটি তাত্ক্ষণিকভাবে প্রয়োগ করা যেতে পারে এবং বিমূর্ত শ্রেণিতে সংজ্ঞায়িত সমস্ত পদ্ধতিতে অ্যাক্সেস থাকতে পারে।

public class AbstractClassTest {
   public void testMethod() {
   ...
   }
}


class ConcreteClass extends AbstractClass {

}

4
এটি দুর্দান্ত পরামর্শ। যদিও এটি একটি উদাহরণ সরবরাহ করে উন্নত করা যেতে পারে। আপনি যে শ্রেণীর বর্ণনা দিচ্ছেন তার সম্ভবত একটি উদাহরণ।
এসডিজেএমসি হাট্টি

2

আপনি একটি বেনাম শ্রেণি ইনস্ট্যান্ট করতে পারেন এবং তারপরে সেই শ্রেণিটি পরীক্ষা করতে পারেন test

public class ClassUnderTest_Test {

    private ClassUnderTest classUnderTest;

    private MyDependencyService myDependencyService;

    @Before
    public void setUp() throws Exception {
        this.myDependencyService = new MyDependencyService();
        this.classUnderTest = getInstance();
    }

    private ClassUnderTest getInstance() {
        return new ClassUnderTest() {    
            private ClassUnderTest init(
                    MyDependencyService myDependencyService
            ) {
                this.myDependencyService = myDependencyService;
                return this;
            }

            @Override
            protected void myMethodToTest() {
                return super.myMethodToTest();
            }
        }.init(myDependencyService);
    }
}

মনে রাখবেন যে দৃশ্যমানতা অবশ্যই বিমূর্ত শ্রেণীর protectedসম্পত্তির myDependencyServiceজন্য ClassUnderTest

আপনি এই পদ্ধতির ঝরঝরে মকিতোর সাথে একত্রিত করতে পারেন। এখানে দেখুন ।


2

আমার পরীক্ষার এই পদ্ধতিটি প্রতিটিের মধ্যেই বেশ সহজ abstractUnitTest.java। আমি কেবল অ্যাবস্ট্রাক্ট ইউনাইটটেষ্ট.জভাতে এমন একটি শ্রেণি তৈরি করি যা বিমূর্ত শ্রেণীর প্রসারিত হয়। এবং এটি যেভাবে পরীক্ষা।


0

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

ক্লাসে প্রোগ্রামারকে সোর্স কোডটি লিখতে হবে যা তার যুক্তির জন্য নিবেদিত।

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

আপনার যদি কিছু বিমূর্ত শ্রেণীর বিমূর্ত পদ্ধতির সাথে সম্পর্কিত না প্রধান কার্যকারিতা থাকে তবে কেবলমাত্র একটি অন্য শ্রেণি তৈরি করুন যেখানে বিমূর্ত পদ্ধতিটি কিছু ব্যতিক্রম ছুঁড়ে ফেলবে।


0

একটি বিকল্প হিসাবে, আপনি বিমূর্ত শ্রেণীর অভ্যন্তরে যুক্তিটি আবরণের বিমূর্ত পরীক্ষা শ্রেণি তৈরি করতে এবং প্রতিটি উপক্লাস পরীক্ষার জন্য এটি প্রসারিত করতে পারেন। যাতে আপনি নিশ্চিত করতে পারেন যে এই যুক্তিটি প্রতিটি সন্তানের জন্য আলাদাভাবে পরীক্ষা করা হবে।

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