পরীক্ষার গতিশীল সংখ্যার সাথে জুনিট পরীক্ষা


95

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

অ্যালিপিস টেস্টরুনারের নামের সাথে প্যারামিটারাইজড টেস্ট প্রশ্নের তুলনা করুন ।


4
এছাড়াও দেখুন
স্ট্যাকওভারফ্লো.

উত্তর:


102

জুনেট 4- এ প্যারামিটারাইজড টেস্টগুলি একবার দেখুন ।

আসলে আমি এই কয়েক দিন আগে করেছি। আমি ব্যাখ্যা করার চেষ্টা করব ...

প্রথমে আপনার পরীক্ষার শ্রেণিটি সাধারণত তৈরি করুন, যেখানে আপনি কেবল একটি ইনপুট ফাইল দিয়ে পরীক্ষা করছেন। আপনার ক্লাসটি এর সাথে সাজান:

@RunWith(Parameterized.class)

এমন একটি কনস্ট্রাক্টর তৈরি করুন যা ইনপুট নেয় যা প্রতিটি পরীক্ষার কলে পরিবর্তিত হয় (এই ক্ষেত্রে এটি ফাইলটি নিজেই হতে পারে)

তারপরে, একটি স্থিতিশীল পদ্ধতি তৈরি করুন যা কোনও Collectionঅ্যারে ফিরিয়ে দেবে । সংগ্রহের প্রতিটি অ্যারেতে আপনার শ্রেণি নির্মাতা যেমন ফাইল হিসাবে ইনপুট আর্গুমেন্ট থাকবে। এই পদ্ধতিটি এর সাথে সাজান:

@Parameters

এখানে একটি নমুনা ক্লাস।

@RunWith(Parameterized.class)
public class ParameterizedTest {

    private File file;

    public ParameterizedTest(File file) {
        this.file = file;
    }

    @Test
    public void test1() throws Exception {  }

    @Test
    public void test2() throws Exception {  }

    @Parameters
    public static Collection<Object[]> data() {
        // load the files as you want
        Object[] fileArg1 = new Object[] { new File("path1") };
        Object[] fileArg2 = new Object[] { new File("path2") };

        Collection<Object[]> data = new ArrayList<Object[]>();
        data.add(fileArg1);
        data.add(fileArg2);
        return data;
    }
}

এই উদাহরণটিও পরীক্ষা করে দেখুন


4
ধন্যবাদ! JUnit 4 পদ্ধতি আরেকটি উত্তরে প্রদত্ত JUnit 3 পদ্ধতির চেয়ে ভাল, যেহেতু JUnit 3 গ্রহন পরীক্ষা চালককে বিভ্রান্ত করে এবং JUnit 4 পদ্ধতিতে আপনি পরীক্ষাগুলি পুনরায় সম্পাদন করতে পারেন ইত্যাদি আমি কেবল ভাবছি যে আমি কীভাবে ग्रहण প্রদর্শন করতে পারি? পরীক্ষার নাম - এটি কেবল [0], [1] ইত্যাদি দেখায়
হ্যান্স-পিটার স্টার

@hstoerr, দেখে মনে হচ্ছে এটি JUnit এর পরবর্তী প্রকাশে হবে :-) github.com/
KentBeck/

আপনি যদি প্রতিটি রান [বিভিন্ন ডেটা সংমিশ্রণ সহ] থিস টেস্ট রানের নামটি পরিবর্তন করতে চান তবে আপনি এটি কীভাবে রূপান্তর করবেন? [অর্থ পাথ 1 ফাইলটি পরীক্ষা করা হবে: test1P11, test2Path?
ভিক্ষু


27

জুনিট 3

public class XTest extends TestCase {

    public File file;

    public XTest(File file) {
        super(file.toString());
        this.file = file;
    }

    public void testX() {
        fail("Failed: " + file);
    }

}

public class XTestSuite extends TestSuite {

    public static Test suite() {
        TestSuite suite = new TestSuite("XTestSuite");
        File[] files = new File(".").listFiles();
        for (File file : files) {
            suite.addTest(new XTest(file));
        }
        return suite;
    }

}

ইউনাইট 4

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class TestY {

    @Parameters
    public static Collection<Object[]> getFiles() {
        Collection<Object[]> params = new ArrayList<Object[]>();
        for (File f : new File(".").listFiles()) {
            Object[] arr = new Object[] { f };
            params.add(arr);
        }
        return params;
    }

    private File file;

    public TestY(File file) {
        this.file = file;
    }

    @Test
    public void testY() {
        fail(file.toString());
    }

}

11

জুনিট 5 টি প্যারামিটারাইজড টেস্ট

JUnit 5 প্যারামিটারাইজড টেস্টগুলি ডেটা উত্স হিসাবে কোনও পদ্ধতি ব্যবহারের অনুমতি দিয়ে এটি সমর্থন করে :

@ParameterizedTest
@MethodSource("fileProvider")
void testFile(File f) {
    // Your test comes here
}

static Stream<File> fileProvider() {
    return Arrays.asList(new File(".").list()).stream();
}

জুনিট 5 ডায়নামিক টেস্ট

5 ইউনাইট 5 এটিকে ধারণার মাধ্যমে এটি সমর্থন করে DynamicTest, যা @TestFactoryস্থির পদ্ধতিতে একটিতে উত্পন্ন করা হয় dynamicTest

import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import static org.junit.jupiter.api.DynamicTest.dynamicTest;

import java.util.stream.Stream;

@TestFactory
public Stream<DynamicTest> testFiles() {
    return Arrays.asList(new File(".").list())
            .stream()
            .map((file) -> dynamicTest(
                    "Test for file: " + file,
                    () -> { /* Your test comes here */ }));
}

আপনার আইডিইতে চালিত পরীক্ষাগুলি (এখানে ইন্টেলিজ) এখানে প্রদর্শিত হবে:

ইনটেলিজজে আউটপুট


3

JUnit 3 এ ফাইলগুলি তালিকাভুক্ত TestSuiteকরার tests()পদ্ধতিটি উত্তরাধিকারসূত্রে ও ওভাররাইড করে সম্ভব হবে এবং প্রতিটি প্রত্যাবর্তনের জন্য একটি সাবক্লাসের একটি উদাহরণ TestCaseকনস্ট্রাক্টর প্যারামিটার হিসাবে ফাইলের নাম নেয় এবং একটি পরীক্ষার পদ্ধতি যা কনস্ট্রাক্টরে প্রদত্ত ফাইলটি পরীক্ষা করে।

JUnit 4 এ এটি আরও সহজ হতে পারে।


2

আপনি JUnitParams লাইব্রেরি ব্যবহার বিবেচনা করতে পারেন, যাতে আপনার আরও কয়েকটি (ক্লিনার) বিকল্প থাকে:

@org.junit.runner.RunWith(junitparams.JUnitParamsRunner.class)
public class ParameterizedTest {

    @org.junit.Test
    @junitparams.Parameters(method = "data")
    public void test1(File file) throws Exception {  }

    @org.junit.Test
    @junitparams.Parameters(method = "data")
    public void test2(File file) throws Exception {  }

    public static File[] data() {
        return new File[] { new File("path1"), new File("path2") };
    }
}

@org.junit.runner.RunWith(junitparams.JUnitParamsRunner.class)
public class ParameterizedTest {

    @org.junit.Test
    @junitparams.Parameters(value = { "path1", "path2" })
    public void test1(String path) throws Exception {
        File file = new File(path);
    }

    @org.junit.Test
    @junitparams.Parameters(value = { "path1", "path2" })
    public void test2(String path) throws Exception {
        File file = new File(path);
    }
}

আপনি এখানে ব্যবহারের আরও নমুনা দেখতে পারেন ।

JUnitParams সম্পর্কে অতিরিক্ত কেন, কেন এটির সাথে প্যারামিটারাইজড টেস্টগুলি রাইটিং করা সহজ এবং আরও পঠনযোগ্য :

JUnitParams প্রকল্প JUnit- এ একটি নতুন রানার যুক্ত করেছে এবং JUnit> = 4.6 এর জন্য অনেক সহজ এবং পঠনযোগ্য প্যারাম্রিট্রিসড পরীক্ষা সরবরাহ করে।

স্ট্যান্ডার্ড JUnit প্যারামেট্রিসার্ড রানার প্রধান পার্থক্য:

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

1

যদি টেস্টএনজি কোনও বিকল্প হয়, আপনি ডেটাপ্রোভাইডারগুলির সাথে পরামিতিগুলি ব্যবহার করতে পারেন ।

প্রতিটি স্বতন্ত্র ফাইলের পরীক্ষার ফলাফল পাঠ্য-ভিত্তিক প্রতিবেদন বা Eclipse এর TestNG প্লাগইন ইউআইতে প্রদর্শিত হবে। চালিত মোট পরীক্ষার সংখ্যা পৃথকভাবে আপনার প্রতিটি ফাইল গণনা করবে।

JUnit থেকে এই আচরণ পৃথক হয় তত্ত্ব , যা সমস্ত ফলাফল এক "তত্ত্ব" এন্ট্রি অধীনে lumped করা হয় এবং শুধুমাত্র 1 পরীক্ষা হিসেবে গণ্য করা হয়। আপনি JUnit এ পৃথক ফলাফলের প্রতিবেদন করতে চান, আপনি প্যারামিটারাইজড টেস্ট ব্যবহার করতে পারেন ।

পরীক্ষা এবং ইনপুট

public class FileTest {

    @DataProvider(name="files")
    public File[][] getFiles(){
        return new File[][] {
            { new File("file1") },
            { new File("file2") }
        };
        // or scan a directory
    }

    @Test(dataProvider="files")
    public void testFile(File file){
        //run tests on file
    }
}

উদাহরণ আউটপুট

PASSED: testFile(file1)
PASSED: testFile(file2)

===============================================
    Default test
    Tests run: 2, Failures: 0, Skips: 0
===============================================

আমি তত্ত্বগুলি সম্পর্কে জানি না, তবে জুনিতের প্যারামিটারাইজড টেস্টগুলি পৃথকভাবে গ্রহণে দেখানো হয়েছে, একসাথে লম্পট করা হয়নি।
হ্যান্স-পিটার স্টার

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