JUnit বিভ্রান্তি: ব্যবহার 'টেস্টকেস বাড়ায়' বা '@ টেস্ট'?


152

আমি ইউনাইটের সঠিক ব্যবহার (বা কমপক্ষে ডকুমেন্টেশন) খুব বিভ্রান্তিকর পেয়েছি। এই প্রশ্ন উভয় ভবিষ্যতের রেফারেন্স এবং একটি বাস্তব প্রশ্ন হিসাবে কাজ করে।

আমি যদি সঠিকভাবে বুঝতে পারি তবে JUnit পরীক্ষা তৈরি ও পরিচালনা করার জন্য দুটি প্রধান পন্থা রয়েছে:

অ্যাপ্রোচ এ (জুনিট 3-স্টাইল): একটি শ্রেণি তৈরি করুন যা টেস্টকেস প্রসারিত করে এবং শব্দটি দিয়ে পরীক্ষা পদ্ধতিগুলি শুরু করে test। জুনিট টেস্ট হিসাবে (ক্লাসে) ক্লাসটি চালানোর সময়, শব্দটি দিয়ে শুরু হওয়া সমস্ত পদ্ধতি testস্বয়ংক্রিয়ভাবে চালিত হয়।

import junit.framework.TestCase;

public class DummyTestA extends TestCase {

    public void testSum() {
        int a = 5;
        int b = 10;
        int result = a + b;
        assertEquals(15, result);
    }
}

অ্যাপ্রোচ বি (জুনিট 4-স্টাইল): একটি 'সাধারণ' শ্রেণি তৈরি করুন এবং @Testপদ্ধতিটিতে একটি টীকা প্রেরণ করুন । মনে রাখবেন যে শব্দটি দিয়ে আপনাকে পদ্ধতিটি শুরু করতে হবে না test

import org.junit.*;
import static org.junit.Assert.*;

public class DummyTestB {

    @Test
    public void Sum() {
        int a = 5;
        int b = 10;
        int result = a + b;
        assertEquals(15, result);
    }
}

দুটি মিশ্রন করা ভাল ধারণা বলে মনে হচ্ছে না, উদাহরণস্বরূপ দেখুন এই স্ট্যাকওভারফ্লো প্রশ্ন :

এখন, আমার প্রশ্ন (গুলি):

  1. পছন্দসই পদ্ধতিটি কী বা আপনি কখন অন্যটির পরিবর্তে একটি ব্যবহার করবেন?
  2. অ্যাপ্রোচ বি পছন্দসই @ টেস্ট টীকাটি বাড়িয়ে ব্যতিক্রমগুলির জন্য পরীক্ষার অনুমতি দেয় @Test(expected = ArithmeticException.class)তবে আপনি এ পদ্ধতির ব্যবহারের ক্ষেত্রে কীভাবে ব্যতিক্রমগুলি পরীক্ষা করবেন?
  3. এ পদ্ধতির ব্যবহার করার সময়, আপনি পরীক্ষার স্যুটে কয়েকটি পরীক্ষার ক্লাসকে এভাবে গ্রুপ করতে পারেন:

    TestSuite suite = new TestSuite("All tests");
    suite.addTestSuite(DummyTestA.class);
    suite.addTestSuite(DummyTestAbis.class);

    তবে এটিকে বি পদ্ধতির সাথে ব্যবহার করা যাবে না (যেহেতু প্রতিটি টেস্টক্লাসের টেস্টকেস সাবক্লাস করা উচিত)। বি পদ্ধতির জন্য গ্রুপ টেস্টগুলির সঠিক উপায় কী?

সম্পাদনা: আমি উভয় পদ্ধতির সাথে JUnit সংস্করণ যুক্ত করেছি


আমি দেখেছি extends TestCaseএবং তারপরে প্রতিটি পরীক্ষাগুলি @Testকেবল জিনিসগুলিকে বিভ্রান্ত করার জন্যও টীকায়িত । :)
ইএম-ক্রিয়েশনস

উত্তর:


119

পার্থক্য বরং সহজ:

  • সম্প্রসারণ TestCaseহ'ল ইউনাইট 3 এ যেভাবে ইউনিট পরীক্ষাগুলি লেখা হয়েছিল (অবশ্যই এটি এখনও জুনিট 4 এ সমর্থিত)
  • @Testটীকাটি ব্যবহার করে ইউএনইটি 4 দ্বারা প্রবর্তিত উপায়

JUnit 3 (এবং / অথবা জাভা 5 এর পূর্বে জাভা সংস্করণ) এর সাথে সামঞ্জস্যতা না লাগলে সাধারণত আপনার টীকাটি পথ বেছে নেওয়া উচিত। নতুন উপায়ে বিভিন্ন সুবিধা রয়েছে:

  • @TestAnnotaton অনেক বেশী সুনিদৃষ্ট এবং সরঞ্জাম সমর্থন করা সহজ (উদাহরণস্বরূপ এটা সব পরীক্ষার এই ভাবে অনুসন্ধান করা সহজ)
  • একাধিক পদ্ধতিতে @Before/ @BeforeClassএবং @After/ @AfterClassআরও নমনীয়তা সরবরাহ করে টীকায়িত করা যেতে পারে
  • পছন্দ মতো বিষয়গুলিতে @Ruleটীকাগুলির জন্য সমর্থনExpectedException
  • @Ignoredটীকা জন্য সমর্থন
  • বিকল্প পরীক্ষা ব্যবহারকারীদের ব্যবহার করে সমর্থন @RunWith

JUnit 3 এ প্রত্যাশিত ব্যতিক্রমগুলির জন্য পরীক্ষা TestCaseকরতে আপনাকে পাঠ্য স্পষ্ট করে তুলতে হবে।

public void testMyException() {
  try {
    objectUnderTest.myMethod(EVIL_ARGUMENT);
    fail("myMethod did not throw an Exception!");
  } catch (MyException e) {
    // ok!
    // check for properties of exception here, if desired
  }
}

JUnit 5 আরও একটি এপিআই পরিবর্তন চালু করেছে, তবে এখনও টীকা ব্যবহার করে। নতুন @Testটীকা হয় org.junit.jupiter.api.Test( "পুরানো 'JUnit 4 অন্যতম org.junit.Test), কিন্তু এটা প্রায় কাছাকাছি JUnit 4 এক হিসাবে একই কাজ করে।


সহায়ক এবং পুঙ্খানুপুঙ্খ উত্তর, তবে আমি "ব্যতিক্রমের বার্তার জন্য চেক করুন" পুরোপুরি বুঝতে পারি না। হার্ডকোডযুক্ত স্ট্রিংয়ের বিরুদ্ধে চেক করা রক্ষণাবেক্ষণের দুঃস্বপ্ন হতে চলেছে। আপনার অবশ্যই বোঝানো উচিত "আপনার নির্দিষ্ট ব্যতিক্রম প্রকারের বৈশিষ্ট্যগুলি পরীক্ষা করুন"।
thSoft

3
@ সোফট: এটি প্রায়শই ব্যবহার করা হয় না তবে মাঝে মাঝে আমি নিশ্চিত করতে চাই যে ব্যতিক্রম পদ্ধতিটি আপত্তিজনক ক্ষেত্রের উল্লেখ করেছে, উদাহরণস্বরূপ। তারপরে একটি সরল কার্যকর assertTrue(e.getMessage().contains("foo"))হতে পারে।
জোচিম সৌর

1
এমনকি JUnit4 এ এটি একটি গুরুত্বপূর্ণ প্রতিমা যখন আপনি বার্তাটি বা ব্যতিক্রমের কোনও অন্য সম্পত্তি (যেমন কারণ হিসাবে) পরীক্ষা করতে হয়। expectedপদ্ধতিটি কেবল টাইপ জন্য চেক।
যিশাই

@ যিশাই: এটি সত্য, তবে বেশিরভাগ সময় আমি ইতিমধ্যে সন্তুষ্ট থাকি যদি পদ্ধতিটি সমস্যাযুক্ত ইনপুটটিতে সঠিক ধরণের ব্যতিক্রমটি ফেলে দেয়।
জোছিম সৌর

যে কারণে, জুনিট 5 ব্যতিক্রম পরীক্ষায় একটি ব্রেকিং পরিবর্তন করেছে। assertThrows () চমত্কার :-)
মার্কাস কে।

25

আমার কাছে JUnit 4 (টীকাগুলি পদ্ধতির) এর জন্য একটি পছন্দ আছে কারণ আমি এটিকে আরও নমনীয় মনে করি।

আপনি JUnit 4 এ পরীক্ষা স্যুট বানাতে চাইলে আপনাকে এই জাতীয় সমস্ত পরীক্ষার গ্রুপিং তৈরি করতে হবে:

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;


@RunWith(Suite.class)
@SuiteClasses({
    Test1.class,
    Test2.class,
    Test3.class,
    Test4.class
})public class TestSuite
{
 /* empty class */
}

15

আপনার প্রশ্নের একটি উত্তরহীন অংশ রয়েছে, এবং এটি "বি পদ্ধতির জন্য গ্রুপ টেস্টের সঠিক উপায় কী?"

সরকারী উত্তরটি হ'ল আপনি একটি @ রুনউইথ (স্যুটক্লাস) সহ একটি ক্লাস টিকা দিয়েছিলেন এবং তারপরে ক্লাসগুলি তালিকা করতে @ স্যুট.সুয়েট ক্লাসের টীকাটি ব্যবহার করুন। JUnit বিকাশকারীরা এটিই করেন (ম্যানুয়ালি একটি স্যুটে প্রতিটি শ্রেণি তালিকাভুক্ত)। অনেক ক্ষেত্রে এই পদ্ধতির একটি উন্নতি, এটি স্যুট এর আগে এবং স্যুট আচরণের পরে যুক্ত করা তুচ্ছ এবং স্বজ্ঞাত (কেবলমাত্র @RunWith দ্বারা বর্ণিত শ্রেণিতে একটি @BeforeClass এবং @AfterClass পদ্ধতি যুক্ত করুন - পুরাতন টেস্ট ফিকচারের চেয়ে অনেক ভাল )।

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


1
এই জন্য +1। কোনও টেস্টসুয়েটে টেস্ট যুক্ত করার জন্য একটি গতিশীল সমাধান লেখার জন্য কোনও কাজ শুরু করার পরে, আমাকে আমার প্রতিটি টেস্টে টেস্টকেস প্রসারিত করতে হয়েছিল। এর ফলে প্রত্যাশিত ব্যতিক্রমগুলি সংজ্ঞায়িত করতে JUnit4 টীকা ব্যবহার করা পূর্বে ওয়ার্কিং ইউনিট টেস্টগুলি ভেঙে গেছে। একটি টেস্ট স্যুটটি
গতিশীলরূপে পপুলেশন করার উপায়ের

4

আপনার JUnit 4 ব্যবহার করা উচিত It's এটি আরও ভাল।

অনেক কাঠামো JUnit 3.8 সমর্থন অবমূল্যায়ন শুরু করেছে।

এটি স্প্রিং 3.0 রেফারেন্স ডকুমেন্টেশন থেকে এসেছে:

[সতর্কতা] লিগ্যাসি JUnit 3.8 শ্রেণি শ্রেণিবিন্যাস হ্রাস করা হয়েছে

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


1
  1. "পছন্দের" পদ্ধতিরটি হ'ল টানা 4 টি জুনিট থেকে যে টীকাগুলি চালু হয়েছিল সেগুলি ব্যবহার করুন তারা অনেক কিছু সহজ করে তোলে (আপনার দ্বিতীয় প্রশ্নটি দেখুন)

  2. আপনি এটির জন্য একটি সাধারণ চেষ্টা / ক্যাপ ব্লক ব্যবহার করতে পারেন:


public void testForException() {
    try {
        Integer.parseInt("just a string");
        fail("Exception should have been thrown");
    } catch (final Exception e) {
        // expected
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.