কীভাবে JUnit এবং Hamcrest ব্যবহার করবেন?


89

আমি বুঝতে পারি না যে জুমিত 4.8 হ্যামক্রাস্ট ম্যাথারদের সাথে কীভাবে কাজ করবে। কিছু matchers ভিতরে সংজ্ঞায়িত হয় junit-4.8.jarমধ্যে org.hamcrest.CoreMatchers। একই সময়ে কিছু আছে অন্যান্য মধ্যে matchers hamcrest-all-1.1.jarমধ্যে org.hamcrest.Matchers। তো, কোথায় যাব? আমি কি প্রজেক্টে হ্যামক্রেস্ট জেআর স্পষ্টভাবে অন্তর্ভুক্ত করব এবং ইউনিত দ্বারা সরবরাহ করা ম্যাচারগুলিকে উপেক্ষা করব?

বিশেষত, আমি empty()ম্যাচারে আগ্রহী এবং এর মধ্যে এটির কোনওটি খুঁজে পাচ্ছি না। আমার আর কিছু দরকার? :)

এবং একটি দার্শনিক প্রশ্ন: কেন org.hamcrestইউনিত আমাদের প্যাকেজটিকে আসল হামকার্স লাইব্রেরি ব্যবহার করতে উত্সাহিত করার পরিবর্তে তার নিজস্ব বিতরণে অন্তর্ভুক্ত করেছিল?

উত্তর:


49

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

এটি ব্যবহার করার জন্য জুনিটে অন্তর্ভুক্ত কিছু মূল ম্যাচার রয়েছে। আপনি বেসিক পরীক্ষার জন্য এগুলি দিয়ে শুরু করতে পারেন।

আপনি যদি আরও ম্যাথার ব্যবহার করতে চান তবে আপনি সেগুলি নিজের দ্বারা লিখতে পারেন বা হ্যামক্রেষ্টের লাইব ব্যবহার করতে পারেন।

নিম্নলিখিত উদাহরণটি অ্যারেলিস্টে খালি ম্যাচচারটি কীভাবে ব্যবহার করবেন তা দেখায়:

package com.test;

import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

public class EmptyTest {
    @Test
    public void testIsEmpty() {
        List myList = new ArrayList();
        assertThat(myList, is(empty()));

    }
}

(আমি আমার বিল্ডপথে হ্যামক্রিস্ট-অল.জার অন্তর্ভুক্ত করেছি)


4
ঠিক org.hamcrest.Matchers.empty()কোথায় অবস্থিত? আপনি কি দয়া করে JAR ফাইলটিতে একটি লিঙ্ক দিতে পারেন?
yegor256

আপনি জানতে পারেন এখানে সব: code.google.com/p/hamcrest এবং hamcrest-all.jar ডাউনলোডের এখানে: code.google.com/p/hamcrest/downloads/...
cpater

4
Hamcrest 1.2 মত দেখায় নয় ম্যাভেন কেন্দ্রীয় সংগ্রহস্থলের মধ্যে। এই যে সমস্যার মুখোমুখি হচ্ছি :(
yegor256

4
হ্যামক্রেস্ট ১.৩ প্রকাশিত হয়েছে এবং এটি কেন্দ্রীয় স্তরে রয়েছে in
টম


51

আপনি যদি 1.2 এর চেয়ে বড় বা সমান সংস্করণ সহ একটি হ্যামক্রাস্ট ব্যবহার করছেন তবে আপনার এটি ব্যবহার করা উচিত junit-dep.jar। এই জারে কোনও হ্যামক্রস্টের ক্লাস নেই এবং তাই আপনি ক্লাসলোডিং সমস্যা এড়াচ্ছেন।

junit.jarজুনিট ৪.১১ যেহেতু নিজেই কোনও হ্যামক্রস্টের ক্লাস নেই। junit-dep.jarআর দরকার নেই।


4
দেখে মনে হয় জুনিয়ট ৪.১২ এর মতো আর কোনও জুনিট-ডিপ.জার নেই। এটাই কি? এবং যদি তা হয়, তবে আমরা কি স্ট্যান্ডেলোন হ্যামক্রাস্ট ১.৩ জারটি ব্যবহার করতে চাইছি?
জেফ ইভান্স

4
উভয় প্রশ্নের উত্তর: হ্যাঁ।
স্টেফান বার্কনার 21

25

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

package com.test;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import static org.fest.assertions.Assertions.assertThat;

public class EmptyTest {
    @Test
    public void testIsEmpty() {
        List myList = new ArrayList();
        assertThat(myList).isEmpty();
    }  
}

সম্পাদনা: মাভেন স্থানাঙ্ক:

<dependency>
  <groupId>org.easytesting</groupId>
  <artifactId>fest-assert</artifactId>
  <version>1.4</version>
  <scope>test</scope>
</dependency>

4
আমি সবেমাত্র আমার দাবি লাইব্রেরি অদলবদল করেছিলাম আমি হ্যামক্রাস্টে বেশ সন্তুষ্ট ছিলাম, তবে জুনিট সমস্যাযুক্ত অন্তর্ভুক্তি স্টাফ এবং পরীক্ষা লেখার জন্য কিছু কঠিন (সংগ্রহ এবং জেনেরিক সহ), আমি ফেস্টের সাথে প্রেমে জানি! ভাগ করে নেওয়ার জন্য ধন্যবাদ.
গিলিয়াম

4
ফেস্ট আর সক্রিয় নেই। অ্যাসেরেটজে ব্যবহার করুন, এটি ফেস্টের কাঁটাচামচ। joel-costigliola.github.io/assertj
ব্যবহারকারী 64141

18

এছাড়াও, যদি JUnit 4.1.1 + হ্যামক্রেস্ট 1.3 + মকিতো 1.9.5 ব্যবহার করা হচ্ছে তবে নিশ্চিত হয়ে নিন যে মকিতো-সমস্ত ব্যবহৃত হয়নি। এটিতে হামক্রস্টের কোর্স রয়েছে। পরিবর্তে মকিতো-কোর ব্যবহার করুন। নীচের কনফিগারেশন কাজ করে:

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>1.9.5</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <artifactId>hamcrest-core</artifactId>
            <groupId>org.hamcrest</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.1.1</version>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <artifactId>hamcrest-core</artifactId>
            <groupId>org.hamcrest</groupId>
        </exclusion>
    </exclusions>
</dependency>

4

যেহেতু সংস্করণগুলি সর্বদা পরিবর্তিত হয়, তাই আমি লোকেরা জানাতে পোস্ট দিচ্ছি যে 2 শে ডিসেম্বর, 2014 পর্যন্ত, http://www.javacodegeeks.com/2014/03/how-to-test-d dependferences- in- এ নির্দেশাবলী -a-maven-પ્રોજેક્ટ-জুনিট-মকিতো-হ্যামক্রেস্ট-assertj.html আমার পক্ষে কাজ করেছিল। আমি AssertJ যদিও ব্যবহার করিনি, কেবল এই:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>1.9.5</version>
  <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-core</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-library</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>   
<dependency>
    <groupId>org.objenesis</groupId>
    <artifactId>objenesis</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>

4
হ্যামক্রাস্ট-লাইব্রেরি হ্যামক্রাস্ট-কোরকে ইতিমধ্যে হ্যামক্রস্ট-কোরকে একটি ট্রান্সজিটিভ নির্ভরতা হিসাবে সংজ্ঞায়িত করার পরে হ্যামক্রাস্ট-কোর এবং হ্যামক্রস্ট-লাইব্রেরি নির্ভরতা উভয়কে একই সাথে সংজ্ঞায়িত করার দরকার নেই।
ইউজেন মায়সাইক

3

কেন ইউনিত আমাদের মূল হ্যামকারেস্ট লাইব্রেরি ব্যবহার করতে উত্সাহিত করার পরিবর্তে org.hamcrest প্যাকেজটিকে তার নিজস্ব বিতরণে অন্তর্ভুক্ত করেছিল?

আমি অনুমান করব কারণ এটি ছিল যে তারা assertThatইউইনিতের অংশ হতে পারে। সুতরাং এর অর্থ হল Assertশ্রেণিকে org.hamcrest.Matcherইন্টারফেসটি আমদানি করতে হবে এবং এটি ইউনিত হ্যামক্রেষ্টের উপর নির্ভর না করে বা (অন্তত অন্তত অংশ) হ্যামক্রেস্টের উপর নির্ভর না করে তা করতে পারে না। এবং আমি অনুমান করি যে এর অংশটি অন্তর্ভুক্ত করা আরও সহজ ছিল, যাতে ইউএনটি কোনও নির্ভরতা ছাড়াই ব্যবহারযোগ্য হবে।


2

2018 সালে সর্বাধিক আধুনিক গ্রন্থাগার ব্যবহার করে:

configurations {
    all {
        testCompile.exclude group: "org.hamcrest", module: "hamcrest-core"
        testCompile.exclude group: "org.hamcrest", module: "hamcrest-library"
    }
}
dependencies {
    testCompile("junit:junit:4.12")
    // testCompile("org.hamcrest:hamcrest-library:1.3")
    // testCompile("org.hamcrest:java-hamcrest:2.0.0.0")
    testCompile("org.hamcrest:hamcrest-junit:2.0.0.0")
}

0

JUnit-4.12 এবং JUnit-Dep-4.10 উভয়েরই সম্পর্কিত .xML ফাইল অনুসারে হামক্রস্ট নির্ভরতা রয়েছে।

আরও তদন্তে দেখা যায় যে যদিও .xML ফাইলগুলিতে নির্ভরতা তৈরি করা হয়েছিল, তবে জারগুলিতে উত্স এবং ক্লাসগুলি। দেখে মনে হচ্ছে বিল্ড.gradle এর নির্ভরতা বাদ দেওয়ার উপায় ... সবকিছু পরিষ্কার রাখার জন্য এটি পরীক্ষা করে দেখানো।

শুধু একটি fyi


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