জুনিট 4.x এ স্যুট কার্যকর হওয়ার আগে এবং তার পরে execution


84

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

দ্রষ্টব্য: আমরা আমাদের বিল্ডের জন্য ম্যাভেন 2 ব্যবহার করছি। আমি ম্যাভেনের pre-post-integration-testপর্যায়গুলি ব্যবহার করার চেষ্টা করেছি , তবে, যদি কোনও পরীক্ষা ব্যর্থ হয়, ম্যাগেন থামে এবং চালিত না হয় post-integration-test, তবে এটি কোনও সহায়ক নয়।


4
ইন্টিগ্রেশন পরীক্ষার জন্য আপনার নিশ্চিত ফায়ার এর পরিবর্তে ম্যাভেন-ফেইলসেফ-প্লাগইন ব্যবহার করা উচিত । post-integration-testকোনও পরীক্ষা ব্যর্থ হলে এটি এড়িয়ে যাবেন না । আরও দেখুন এই উইকি পাতা
ক্রিস এইচ।

আপনি চূড়ান্ত বাস্তবায়ন ভাগ করতে পারেন দয়া করে?
বিক্রমভি

উত্তর:


114

হ্যাঁ, কোনও পরীক্ষার স্যুটে কোনও পরীক্ষার আগে এবং পরে নির্ভরযোগ্যভাবে সেট আপ করা এবং ছিঁড়ে ফেলা পদ্ধতিগুলি সম্ভব। আমাকে কোডে প্রদর্শন করুন:

package com.test;

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

@RunWith(Suite.class)
@SuiteClasses({Test1.class, Test2.class})
public class TestSuite {

    @BeforeClass
    public static void setUp() {
        System.out.println("setting up");
    }

    @AfterClass
    public static void tearDown() {
        System.out.println("tearing down");
    }

}

সুতরাং আপনার Test1ক্লাসটি এমন কিছু দেখাচ্ছে:

package com.test;

import org.junit.Test;


public class Test1 {
    @Test
    public void test1() {
        System.out.println("test1");
    }

}

... এবং আপনি Test2একই দেখতে দেখতে কল্পনা করতে পারেন । আপনি দৌড়ে TestSuiteগেলে, আপনি পাবেন:

setting up
test1
test2
tearing down

সুতরাং আপনি দেখতে পাচ্ছেন যে সেট আপ / টিয়ার ডাউন কেবল যথাক্রমে সমস্ত পরীক্ষার আগে এবং পরে চালিত হয়।

ক্যাচ: এটি কেবলমাত্র যদি আপনি পরীক্ষার স্যুটটি চালাচ্ছেন এবং টেস্ট 1 এবং টেস্ট 2 স্বতন্ত্র যুবিত পরীক্ষা হিসাবে চালাচ্ছেন না তখনই এটি কাজ করে। আপনি উল্লেখ করেছেন যে আপনি ম্যাভেন ব্যবহার করছেন, এবং ম্যাভেন নিশ্চিত ফায়ার প্লাগইন স্বতন্ত্রভাবে পরীক্ষা চালাতে পছন্দ করে, স্যুটটির অংশ নয়। এই ক্ষেত্রে, আমি একটি সুপারক্লাস তৈরি করার পরামর্শ দেব যা প্রতিটি পরীক্ষার ক্লাস প্রসারিত হয়। সুপারক্লাসের পরে টিকা দেওয়া @ বিফারনক্লাস এবং @ আফটারক্লাস পদ্ধতি রয়েছে। যদিও উপরের পদ্ধতির মতো পুরোপুরি পরিষ্কার না হলেও আমি মনে করি এটি আপনার পক্ষে কার্যকর হবে।

ব্যর্থ পরীক্ষার সমস্যা হিসাবে, আপনি maven.test.error.ignore সেট করতে পারেন যাতে বিল্ডটি ব্যর্থ পরীক্ষাগুলিতে চালিয়ে যায়। এটি একটি চলমান অনুশীলন হিসাবে সুপারিশ করা হয় না, তবে আপনার সমস্ত পরীক্ষা পাস না হওয়া পর্যন্ত এটি আপনাকে কাজ করা উচিত। আরও বিশদের জন্য, ম্যুভেন শিফিয়ার ডকুমেন্টেশন দেখুন


4
এটি একবারে আমি মাভেন-শিফারফায়ার-প্লাগইন এ গিয়ে আমার পক্ষে পুরোপুরি কাজ করে এবং এমন একটি তালিকা তৈরি করে যা স্যুট চালাতে চাই বলে নির্দেশ করে।
ঝেরিকো

4
জুনিয়ট ৪.৮.২ অনুসারে, এটি প্যারামিটারাইজড টেস্টগুলির সাথে ভাল খেলছে না। স্যুটটির @ বিফার ক্লাস পদ্ধতিগুলি @ প্যারামিটারাইজড.পরিমিতি পদ্ধতির পরে চালানো হবে, স্যুটটির সেটআপে কোনও নির্ভরতা রোধ করবে।
আনম

আমার প্রতিক্রিয়া হিসাবে, @ থিওরিগুলি ব্যবহার করার সময় স্যুটটির @ বিফারক্লাসের পরে @ ডেটাপয়েন্টস পদ্ধতিতে কল আসে
আনম

19
নেক্রোর জন্য দুঃখিত - তবে সুপার ক্লাসে বিটারক্লাস / আফটারক্লাস যোগ করা প্রত্যাশার মতো কাজ করে না - প্রতিটি পরীক্ষার ক্লাস শেষ হওয়ার পরেও তাদের ডাকা হয়। এটি উত্তরোত্তর জন্য।
সুব শঙ্করা সুব্রমনিয়ান

4
এটি কি এখনও একটি বৈধ পন্থা? স্যুট ক্লাসের টীকাতে পরীক্ষার শ্রেণীর তালিকা গণনা করার প্রয়োজনীয়তা আপনি কীভাবে এড়াতে পারবেন?
বুরহান আলী

34

আমার এক সহকর্মী নীচের পরামর্শ দিয়েছিলেন: আপনি একটি কাস্টম রানলিস্টনার ব্যবহার করতে পারেন এবং পরীক্ষাআরফিনিশড () পদ্ধতিটি প্রয়োগ করতে পারেন: http://junit.sourceforge.net/javadoc/org/junit/runner/notication/RunListener.html#testRunFinished(org। জুনিট.আরুনার.সাল্ট)

রানলিস্টনারের নিবন্ধন করতে কেবল নীচের মতো নিশ্চিত ফায়ার প্লাগইনটি কনফিগার করুন: "কাস্টম শ্রোতা এবং সাংবাদিক ব্যবহার করে" http://maven.apache.org/surefire/maven-surefire-plugin/example/junit.html বিভাগ "

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


4
+1 এটিই প্রথম ব্যবহারযোগ্য সমাধান যা কোনও স্যুট শ্রেণীর জটিল রক্ষণাবেক্ষণ ছাড়াই আমি দেখেছি!
স্টিফান হ্যাবারেল


6

টীকাগুলি ব্যবহার করে আপনি এর মতো কিছু করতে পারেন:

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

class SomethingUnitTest {
    @BeforeClass
    public static void runBeforeClass()
    {

    }

    @AfterClass
    public static void runAfterClass()
    {  

    }

    @Before  
    public void setUp()
    {

    }

    @After
    public void tearDown()
    {

    }

    @Test
    public void testSomethingOrOther()
    {

    }

}

4
সেট আপ এবং টিয়ারডাউনটি প্রতি রান একবার চালানো দরকার। সমস্ত পরীক্ষাগুলি একটি শ্রেণিতে থাকলে এটি কেবল সহায়তা করবে।
sblundy

এটি শুধুমাত্র পৃথক পরীক্ষার স্যুট সেট আপ করে, পুরো পরীক্ষার পদক্ষেপ নয়
বেন

3

এখানে আমরা

  • JUnit 4.5 এ আপগ্রেড করা হয়েছে,
  • প্রতিটি পরীক্ষার শ্রেণি বা পদ্ধতিতে ট্যাগ করার জন্য টীকাগুলি লিখেছিল যা একটি কাজের পরিষেবা প্রয়োজন,
  • প্রতিটি টীকাটির জন্য হ্যান্ডলারগুলি লিখেছেন যাতে পরিষেবার সেটআপ এবং টিয়ারডাউন বাস্তবায়নের স্থির পদ্ধতি রয়েছে,
  • পরীক্ষাগুলিতে টীকাগুলি সনাক্ত করতে যথাযথ রানারকে প্রসারিত করে, যথাযথ পয়েন্টগুলিতে পরীক্ষার সম্পাদন শৃঙ্খলে স্থির হ্যান্ডলার পদ্ধতি যুক্ত করে।

2

যেমনটি "দ্রষ্টব্য: আমরা আমাদের বিল্ডের জন্য ম্যাভেন 2 ব্যবহার করছি ma আমি ম্যাভেনের প্রাক-পূর্ব & ইন্টিগ্রেশন-পরীক্ষার পর্যায়গুলি ব্যবহার করার চেষ্টা করেছি, তবে, যদি কোনও পরীক্ষা ব্যর্থ হয়, তবে ম্যাভেন থামে এবং ইন্টিগ্রেশন-পরবর্তী পরীক্ষা চালায় না , যা কোন সাহায্য নয়। "

পরিবর্তে আপনি ফেইলসেফ-প্লাগইন চেষ্টা করে দেখতে পারেন, আমার মনে হয় সেটআপ বা মধ্যবর্তী পর্যায়ের অবস্থা নির্বিশেষে পরিষ্কার-পরিচ্ছন্নতা ঘটে তা নিশ্চিত করার সুবিধা রয়েছে the


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

2

আপনার সমস্ত পরীক্ষাগুলি একটি "প্রযুক্তিগত" শ্রেণি বাড়িয়ে দিতে পারে এবং একই প্যাকেজে থাকে তবে আপনি কিছুটা কৌশলটি করতে পারেন:

public class AbstractTest {
  private static int nbTests = listClassesIn(<package>).size();
  private static int curTest = 0;

  @BeforeClass
  public static void incCurTest() { curTest++; }

  @AfterClass
  public static void closeTestSuite() {
      if (curTest == nbTests) { /*cleaning*/ }             
  }
}

public class Test1 extends AbstractTest {
   @Test
   public void check() {}
}
public class Test2 extends AbstractTest {
   @Test
   public void check() {}
}

সচেতন হন যে এই সমাধানের অনেকগুলি ত্রুটি রয়েছে:

  • প্যাকেজের সমস্ত পরীক্ষা চালিয়ে যেতে হবে
  • একটি "টেকনিকাল" শ্রেণি অবশ্যই সাবক্লাস করা উচিত
  • আপনি সাবক্লাসের ভিতরে @ বিফার ক্লাস এবং @ আফটারক্লাস ব্যবহার করতে পারবেন না
  • আপনি যদি প্যাকেজে কেবল একটি পরীক্ষা চালান, পরিষ্কার করা হয় না
  • ...

তথ্যের জন্য: listClassIn () => আপনি জাভাতে প্রদত্ত শ্রেণীর সমস্ত উপক্লাগুলি কীভাবে খুঁজে পাবেন?


4
এটি আমার নিজের পরীক্ষাগুলি দেখানো পর্যন্ত সত্য নয়। আমার একটি সুপার ক্লাস রয়েছে যা পূর্ববর্তী ক্লাসে এমবেডেড গ্লাসফিশ শুরু করে এবং ক্লাসের পরে এটিকে বন্ধ করে দেয়। আমার তখন 2 ক্লাস রয়েছে যা সেই সুপার ক্লাস থেকে প্রসারিত। প্রতিটি ক্লাসে সংজ্ঞায়িত পরীক্ষা চালানোর আগে পূর্বক্লাস কার্যকর করা হয় exec
জোনাথন মোরালেস ভেলিজ

0

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


0

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

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.5</version>
            <configuration>
                <includes>
                    <include>**/*Suite.java</include>
                </includes>
                <excludes>
                    <exclude>**/*Test.java</exclude>
                    <exclude>**/*Tests.java</exclude>
                </excludes>
            </configuration>
        </plugin>

0

আপনি যে কার্যকারিতাটি পেতে চান তারপরে একমাত্র উপায় হ'ল এটির মতো কিছু করা

import junit.framework.Test;  
import junit.framework.TestResult;  
import junit.framework.TestSuite;  

public class AllTests {  
    public static Test suite() {  
        TestSuite suite = new TestSuite("TestEverything");  
        //$JUnit-BEGIN$  
        suite.addTestSuite(TestOne.class);  
        suite.addTestSuite(TestTwo.class);  
        suite.addTestSuite(TestThree.class);  
        //$JUnit-END$  
     }  

     public static void main(String[] args)  
     {  
        AllTests test = new AllTests();  
        Test testCase = test.suite();  
        TestResult result = new TestResult();  
        setUp();  
        testCase.run(result);  
        tearDown();  
     }  
     public void setUp() {}  
     public void tearDown() {}  
} 

আমি গ্রহণের মতো এই জাতীয় কিছু ব্যবহার করি, তাই আমি নিশ্চিত নই যে এটি environment পরিবেশের বাইরে এটি কতটা পোর্টেবল


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

0

আপনি যদি স্যুট তৈরি করতে না চান এবং আপনার সমস্ত পরীক্ষার ক্লাস তালিকাভুক্ত করতে চান তবে আপনি পরীক্ষার শ্রেণীর সংখ্যা গতিশীলভাবে খুঁজে পেতে প্রতিফলন ব্যবহার করতে পারেন এবং একবার টিয়ারডাউন করার জন্য বেস ক্লাসে @ আফটারক্লাসে গণনা করতে পারেন:

public class BaseTestClass
{
    private static int testClassToRun = 0;

    // Counting the classes to run so that we can do the tear down only once
    static {
        try {
            Field field = ClassLoader.class.getDeclaredField("classes");
            field.setAccessible(true);

            @SuppressWarnings({ "unchecked", "rawtypes" })
            Vector<Class> classes = (Vector<Class>) field.get(BlockJUnit4ClassRunner.class.getClassLoader());
            for (Class<?> clazz : classes) {
                if (clazz.getName().endsWith("Test")) {
                    testClassToRun++;
                }
            }
        } catch (Exception ignore) {
        }
    }

    // Setup that needs to be done only once
    static {
        // one time set up
    }

    @AfterClass
    public static void baseTearDown() throws Exception
    {
        if (--testClassToRun == 0) {
            // one time clean up
        }
    }
}

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

এখন আপনাকে যা করতে হবে তা হ'ল আপনার সমস্ত পরীক্ষার ক্লাসের জন্য এই শ্রেণিটি বাড়ানো। আমাদের সকল পরীক্ষার জন্য কিছু সাধারণ জিনিস সরবরাহ করার জন্য ইতিমধ্যে আমাদের একটি বেস ক্লাস ছিল তাই এটি আমাদের জন্য সেরা সমাধান ছিল।

অনুপ্রেরণা এই এসও উত্তরটি https://stackoverflow.com/a/37488620/5930242 থেকে আসে

আপনি যদি এই ক্লাসটি যে কোনও জায়গায় প্রসারিত করতে না চান তবে এই শেষ উত্তরটি আপনি যা চান তা করতে পারে।

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