জুনিট: বিভাজক সংহত পরীক্ষা এবং ইউনিট পরীক্ষা


126

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

সুতরাং আমি এগুলি আসলে আলাদা করার জন্য একটি উপায় চিন্তা করার চেষ্টা করছি, যাতে আমি ইউনিট পরীক্ষাটি সুন্দর এবং দ্রুত চালাতে পারি এবং এর পরে ইন্টিগ্রেশন টেস্টগুলি চালিয়ে যেতে পারি।

বিকল্পগুলি হল ..

  1. এগুলি আলাদা ডিরেক্টরিতে বিভক্ত করুন।

  2. জুনিট 4 এ যান (ভি 3 থেকে) এবং ক্লাসগুলি আলাদা করার জন্য এনেটেট করুন।

  3. ক্লাস কী, তা বলতে অ্যাডাপ্টারএস্টেস্ট এবং অ্যাডাপ্টারেরএন্টেরগ্রেশন টেস্ট বলতে ফাইলের নামকরণের কনভেনশন ব্যবহার করুন।

3 এ ইস্যুতে রয়েছে যে "নির্বাচিত প্রকল্প / প্যাকেজ বা ফোল্ডারটিতে সমস্ত পরীক্ষা চালানো" বিকল্প গ্রহণের বিকল্প রয়েছে। সুতরাং এটি কেবলমাত্র সংহতকরণ পরীক্ষা চালানো খুব কঠিন করে তুলবে।

2: বিকাশকারীরা ইউনিট পরীক্ষা ক্লাসে ইন্টিগ্রেশন পরীক্ষা লিখতে শুরু করে এবং এটি কেবল অগোছালো হয়ে যায় এমন ঝুঁকিটি চালায়।

1: নেস্টেস্ট সলিউশনের মতো মনে হচ্ছে, তবে আমার অন্ত্রে বলেছে যে এর চেয়ে আরও ভাল সমাধান অবশ্যই হবে।

সুতরাং এটি আমার প্রশ্ন, আপনি কীভাবে পৃথকীকরণের পরীক্ষা এবং সঠিক ইউনিট পরীক্ষাগুলি ভাঙবেন?


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

উত্তর:


10

আমি বর্তমানে সাংগঠনিক নীতি (এবং জুনিট 3 উত্তরাধিকার) এর কারণে পৃথক ডিরেক্টরি ব্যবহার করি তবে আমি টীকাগুলিতে রূপান্তরিত হতে দেখছি এখন আমি জুনেটে 4 এ আছি।

বিকাশকারীরা আপনার ইউনিট পরীক্ষার ক্লাসে ইন্টিগ্রেশন টেস্ট রাখার বিষয়ে অতিরিক্ত উদ্বিগ্ন হবেন না - প্রয়োজনে আপনার কোডিং মানগুলিতে একটি বিধি যুক্ত করুন।

টীকাগুলি বা শারীরিকভাবে ক্লাস পৃথকীকরণের বাইরে কী কী অন্যান্য সমাধান থাকতে পারে তা জানতে আগ্রহী আমি ..


145

আপনি তাদের খুব সহজেই JUnit বিভাগ এবং মাভেন ব্যবহার করে বিভক্ত করতে পারেন।

বিভক্ত ইউনিট এবং ইন্টিগ্রেশন পরীক্ষার দ্বারা এটি খুব নীচে দেখানো হয়েছে।

একটি চিহ্নিতকারী ইন্টারফেস সংজ্ঞায়িত করুন

বিভাগগুলি ব্যবহার করে একটি পরীক্ষাকে গ্রুপিংয়ের প্রথম পদক্ষেপটি একটি মার্কার ইন্টারফেস তৈরি করা।

আপনি ইন্টিগ্রেশন পরীক্ষা হিসাবে চালাতে চান এমন সমস্ত পরীক্ষার চিহ্নিত করতে এই ইন্টারফেসটি ব্যবহার করা হবে।

public interface IntegrationTest {}

আপনার পরীক্ষা ক্লাস চিহ্নিত করুন

আপনার পরীক্ষার শ্রেণির শীর্ষে বিভাগটি টীকা যুক্ত করুন। এটি আপনার নতুন ইন্টারফেসের নাম নেয়।

import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
  @Test
  public void longRunningServiceTest() throws Exception {
  }
}

ম্যাভেন ইউনিট টেস্টগুলি কনফিগার করুন

এই দ্রষ্টব্যটির সৌন্দর্যটি হ'ল কোনও বিষয়গুলির ইউনিট পরীক্ষার দিকের জন্য সত্যিই পরিবর্তন হয় না।

কোনও ইন্টিগ্রেশন টেস্ট উপেক্ষা করার জন্য আমরা কেবল মেন সিফারফায়ার প্লাগইনে কিছু কনফিগারেশন যুক্ত করি।

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.11</version>
  <dependencies>
   <dependency>
     <groupId>org.apache.maven.surefire</groupId>
     <artifactId>surefire-junit47</artifactId>
     <version>2.12</version>
   </dependency>
  </dependencies>
  <configuration>
    <includes>
      <include>**/*.class</include>
    </includes>
    <excludedGroups>com.test.annotation.type.IntegrationTest</excludedGroups>
  </configuration>
</plugin>

আপনি যখন এমভিএন ক্লিন পরীক্ষা করেন কেবলমাত্র আপনার অচিহ্নিত ইউনিট পরীক্ষাগুলি চলবে।

মাভেন ইন্টিগ্রেশন টেস্টগুলি কনফিগার করুন

আবার এর জন্য কনফিগারেশনটি খুব সাধারণ।

শুধুমাত্র ইন্টিগ্রেশন পরীক্ষা চালাতে, এটি ব্যবহার করুন:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.11</version>
  <dependencies>
   <dependency>
     <groupId>org.apache.maven.surefire</groupId>
     <artifactId>surefire-junit47</artifactId>
     <version>2.12</version>
   </dependency>
  </dependencies>
  <configuration>
    <groups>com.test.annotation.type.IntegrationTest</groups>
  </configuration>
</plugin>

আপনি যদি আইডির সাথে কোনও প্রোফাইলে এটি মুড়ে রাখেন তবে আপনি ITকেবল দ্রুত ব্যবহার করে দ্রুত পরীক্ষা চালাতে পারেন mvn clean install। কেবল ইন্টিগ্রেশন / ধীর পরীক্ষা চালাতে, ব্যবহার করুন mvn clean install -P IT

তবে বেশিরভাগ ক্ষেত্রে, আপনি ডিফল্টরূপে এবং সমস্ত পরীক্ষার মাধ্যমে দ্রুত পরীক্ষা চালাতে চান -P IT। যদি এটি হয় তবে আপনাকে একটি কৌশল ব্যবহার করতে হবে:

<profiles>
    <profile>
        <id>IT</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <excludedGroups>java.io.Serializable</excludedGroups> <!-- An empty element doesn't overwrite, so I'm using an interface here which no one will ever use -->
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

আপনি দেখতে পাচ্ছেন যে, আমি পরীক্ষাগুলি বাদ দিচ্ছি যা দিয়ে টীকায়িত java.io.Serializable। এটি প্রয়োজনীয় কারণ প্রোফাইলে শিওরফায়ার প্লাগইনটির ডিফল্ট কনফিগারেশন উত্তরাধিকার সূত্রে প্রাপ্ত হবে, তাই আপনি বললেও <excludedGroups/>বা <excludedGroups></excludedGroups>মানটি com.test.annotation.type.IntegrationTestব্যবহৃত হবে।

আপনি noneএটি ব্যবহার করতে পারবেন না কারণ এটি ক্লাসপথে একটি ইন্টারফেস হতে হবে (মাভেন এটি পরীক্ষা করবে)।

মন্তব্য:

  • নির্ভরতা কেবল surefire-junit47তখনই প্রয়োজনীয় যখন মেভেন স্বয়ংক্রিয়ভাবে JUnit 4 রানারটিতে স্যুইচ না করে। groupsবা excludedGroupsউপাদান ব্যবহার করে স্যুইচটি ট্রিগার করা উচিত। এখানে দেখুন
  • উপরের বেশিরভাগ কোডটি মাভেন ফেইলসেফ প্লাগইনের জন্য ডকুমেন্টেশন থেকে নেওয়া হয়েছিল। এই পৃষ্ঠায় "JUnit বিভাগ ব্যবহার করে" বিভাগটি দেখুন ।
  • আমার পরীক্ষার সময়, আমি দেখতে পেলাম যে আপনি @RunWith()স্যুট বা স্প্রিং-ভিত্তিক পরীক্ষা চালানোর জন্য টীকাগুলি ব্যবহার করলেও এটি কাজ করে।

18
আমি মনে করি আপনার শেষ pom.xml টুকরাটিতে একটি ত্রুটি আছে। আপনি "পরীক্ষার" পর্যায়ে যেমন স্নিপেট আটকান। এটি এখনও ইন্টিগ্রেশন টেস্টগুলি বাদ দেয় এবং কোনও মেভেন পর্বেও আবদ্ধ হয় না।
অ্যালেক্স

1
আসলে, শেষ পম খণ্ডটি একটি অনুলিপি এবং পেস্ট ভুল। এটি maven-failsafe- প্লাগইন প্রদর্শন করা উচিত।
পাওলো মেরসন

2
তাহলে দ্বিতীয় এক্সএমএলটি কী হওয়া উচিত? : ও
লিভ

আপনি কৌতুকটি ব্যবহার করতে হবে না (সিরিয়ালাইজেবলের সাথে শেষ ম্যাজিক) আপনি যদি ডিফল্ট মাভেন প্রোফাইল ব্যবহার করেন
user831217

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

40

আমরা ইউনিট পরীক্ষা চালাতে ম্যাভেন শিওরফায়ার প্লাগইন এবং ইন্টিগ্রেশন টেস্টগুলি চালানোর জন্য মাভেন ফেইলসেফ প্লাগইন ব্যবহার করি। ইউনিট টেস্টগুলি **/Test*.java **/*Test.java **/*TestCase.javaনামকরণের সম্মেলনগুলি অনুসরণ করে , ইন্টিগ্রেশন টেস্টগুলি - **/IT*.java **/*IT.java **/*ITCase.java। সুতরাং এটি আসলে আপনার বিকল্প নম্বর তিন।

কয়েকটি প্রকল্পে আমরা টেস্টএনজি ব্যবহার করি এবং ইন্টিগ্রেশন / ইউনিট পরীক্ষার জন্য বিভিন্ন পরীক্ষার গোষ্ঠী সংজ্ঞায়িত করি তবে এটি সম্ভবত আপনার পক্ষে উপযুক্ত নয়।


1
ম্যাভেন + শিফারফায়ার + ব্যর্থসেইফ + জুনিট কম্বোর জন্য +1। আমি বুঝতে পারি নি যে ব্যর্থতাফায়া স্বয়ংক্রিয়ভাবে "আইটি *" চালাবে। মিষ্টি।
পাপাফ্রেড

13

আমি এটি থাকার জন্য জুনিট 4-এ চলে যাব :)

আপনি এগুলিকে বিভিন্ন পরীক্ষার স্যুটে আলাদা করতে পারেন। আমি জানি না যে তারা জুনিট 3 এ কীভাবে সংগঠিত হয়েছে তবে জুনিট 4 এ কেবল সহজ পরীক্ষা তৈরি করা সহজ হওয়া উচিত এবং এর মধ্যে একটি আসল ইউনিট পরীক্ষা করা এবং তারপরে ইন্টিগ্রেশন পরীক্ষার জন্য দ্বিতীয় স্যুট ব্যবহার করা উচিত।

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


9

IfProfileValue বসন্তের টীকাটি ব্যবহার করা কোনও মভেন প্লাগইন বা কনফিগারেশন প্রয়োজন ছাড়াই এটি অর্জন সম্ভব করে ।

ইফপ্রোফাইভ্যালু ব্যবহার করে ইন্টিগ্রেশন টেস্ট ক্লাস বা পদ্ধতিগুলি টিকিয়ে দিন

import org.springframework.test.annotation.IfProfileValue;

@IfProfileValue(name="test-groups", value="integration")
public class ExampleIntegrationTest{
    @Test
    public void longRunningServiceTest() throws Exception {
    }
} 

শুধুমাত্র ইউনিট পরীক্ষা ব্যবহার করে চালানো:

mvn clean test

ইন্টিগ্রেশন টেস্ট এবং ইউনিট টেস্ট ব্যবহার করে চালাতে:

mvn clean test -Dtest-groups=integration

এছাড়াও, একটি আইডিইতে "সমস্ত পরীক্ষা চালান" কেবলমাত্র ইউনিট পরীক্ষা চালায়। -Dtest-groups=integrationইন্টিগ্রেশন এবং ইউনিট উভয় পরীক্ষা চালাতে ভিএম যুক্তিতে যুক্ত করুন ।


এই পদ্ধতিরটি দুর্দান্ত এবং সহজ, তবে আমি যে সমস্যাটি পেয়েছি তা হ'ল ডিফল্টরূপে আমি সমস্ত পরীক্ষা চালাতে চাই (সংহতকরণ পরীক্ষা সহ)। এই পদ্ধতির মাধ্যমে এটি সম্ভব নয়, তাই না?
csalazar

6

একটি সঠিক উত্তর নেই। আপনি যেমন ব্যাখ্যা করেছেন, এটি করার বিভিন্ন উপায় রয়েছে যা কার্যকর হবে। আমি ফাইলের নামকরণের স্কিম এবং জিনিসগুলি বিভিন্ন ডিরেক্টরিতে বিভক্ত করা উভয়ই করেছি।

দেখে মনে হচ্ছে যে জিনিসগুলি বিভিন্ন ডিরেক্টরিতে বিভক্ত করা আপনার পক্ষে আরও ভাল কাজ করতে পারে এবং এটি আমার কাছে আরও স্পষ্ট মনে হয়, তাই আমি তার দিকে ঝুঁকছি।

আমি মনে করি না যে আমি টীকাগুলি চেষ্টা করব কারণ এটি আমার কাছে আরও সূক্ষ্ম বলে মনে হচ্ছে seems আপনি কি সত্যিই এই দুটি ধরণের পরীক্ষা একই ফাইলটিতে মিশ্রিত করতে চান? আমি না।

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