কেন আমি হামক্রস্ট-ম্যাচার এবং traditionalতিহ্যবাহী এ্যাসার্ট এক্সএক্সএক্সএক্সএক্সএক্স () এর পরিবর্তে এ্যাসেটট্যাট () ব্যবহার করব - পদ্ধতিগুলি


153

আমি যখন সুনির্দিষ্ট শ্রেণীর জাভাডোকের উদাহরণগুলি দেখি

assertThat("Help! Integers don't work", 0, is(1)); // fails:
// failure message:
// Help! Integers don't work
// expected: is <1> 
// got value: <0>
assertThat("Zero is one", 0, is(not(1))) // passes

আমি একটি বড় সুবিধা দেখতে পাচ্ছি না, আসুন বলি assertEquals( 0, 1 ),।

এটি বার্তাগুলির জন্য খুব সুন্দর যদি কনস্ট্রাক্টগুলি আরও জটিল হয়ে ওঠে তবে আপনি আরও সুবিধা দেখতে পান? পঠনযোগ্যতার?

উত্তর:


172

এই ক্ষেত্রেগুলির জন্য কোনও বড় সুবিধা নেই যেখানে কোনও assertFooঅস্তিত্ব উপস্থিত রয়েছে যা আপনার উদ্দেশ্যগুলির সাথে ঠিক মিলে। এই ক্ষেত্রে তারা প্রায় একই রকম আচরণ করে।

তবে আপনি যখন কিছুটা জটিল জটিল চেকগুলিতে আসেন, তখন সুবিধাটি আরও দৃশ্যমান হয়:

assertTrue(foo.contains("someValue") && foo.contains("anotherValue"));

বনাম

assertThat(foo, hasItems("someValue", "anotherValue"));

এক আলোচনা করতে পারেন যা ঐ এক সহজ পড়তে, কিন্তু একবার জাহির ব্যর্থ হয়, আপনার কাছ থেকে একটি ভাল ত্রুটির বার্তা পাবেন assertThat, কিন্তু কাছ থেকে তথ্য শুধুমাত্র একটি খুব ন্যূনতম পরিমাণ assertTrue

assertThatদৃser়তা কী ছিল এবং পরিবর্তে আপনি কী পেয়েছেন তা আপনাকে বলবে। assertTrueকেবলমাত্র আপনাকে বলবে যে আপনি falseযেখানে প্রত্যাশা করেছিলেন সেখানে পেয়েছেন true


আমার মনের পিছনেও আমার এই প্রশ্ন ছিল। আপনাকে ধন্যবাদ, আমি কখনও এই পদ্ধতিতে এটি ভাবিনি।
Wheaties

1
এটি পরীক্ষায় প্রতি একটি দৃ as় "বিধি" করতে সহায়তা করে এবং বিডিডি-স্টাইলের বিশদগুলির সাথে আরও সহজে মিশ্রিত হয়।
নিলস ওলোকা

2
এবং এটি শর্ত থেকে দাবী করার প্রক্রিয়াটি পৃথক করে (এটি যা ত্রুটির বার্তাগুলিকে আরও ভাল করে তোলে)।
স্টিভডি

2
উদাহরণটি দুর্ভাগ্যজনক কারণ খুব কমই যে কেউ একটির assertTrueসাথে একটি ব্যবহার করবে &&। এটিকে দুটি শর্তে পৃথক করা সমস্যা এমনকি JUnit এ প্রকট হয়ে উঠেছে। আমাকে ভুল করবেন না; আমি আপনার সাথে একমত, আমি কেবল আপনার উদাহরণ অপছন্দ করি।
মাআরটিইনস

48

JUnit 4.4 সংস্করণ (যেখানে এটি প্রবর্তিত হয়েছিল) এর নোট প্রকাশের চারটি সুবিধা উল্লেখ করে:

  • আরও পঠনযোগ্য এবং টাইপযোগ্য: এই সিনট্যাক্সটি আপনাকে assertEquals এর পরিবর্তে বিষয়, ক্রিয়া, অবজেক্টের ("x টি 3" থাকে ") হিসাবে বিবেচনা করতে দেয় যা ক্রিয়া, বস্তু, বিষয় ব্যবহার করে ( দৃ ( " 3 x "সমান)
  • সংমিশ্রণ: যে কোনও ম্যাথার স্টেটমেন্ট গুলি উপেক্ষা করা যাবে (গুলি) নয় , সম্মিলিত ( হয় (গুলি)। বা (টি) ), কোনও সংকলনে ম্যাপ করা ( প্রতিটি (গুলি) ), বা কাস্টম সংমিশ্রণে ( ফাইভসেকেন্ডস) এর পরে ব্যবহৃত হবে )
  • পঠনযোগ্য ব্যর্থতার বার্তা। (...)
  • কাস্টম ম্যাচার্স ম্যাচার ইন্টারফেসটি নিজে প্রয়োগ করে আপনি নিজের কাস্টম জবাবের জন্য উপরের সমস্ত সুবিধা পেতে পারেন।

যে ব্যক্তিটি নতুন সিনট্যাক্সটি তৈরি করেছেন তার আরও বিশদ যুক্তি: এখানে


39

মূলত কোডটির পঠনযোগ্যতা বৃদ্ধির জন্য ।

হ্যামক্রেষ্ট ছাড়াও আপনি উত্সাহীনতার দাবীও ব্যবহার করতে পারেন । হ্যামক্রাস্টের তুলনায় তাদের কয়েকটি সুবিধা রয়েছে যেমন:

কিছু উদাহরণ

import static org.fest.assertions.api.Assertions.*;

// common assertions
assertThat(yoda).isInstanceOf(Jedi.class);
assertThat(frodo.getName()).isEqualTo("Frodo");
assertThat(frodo).isNotEqualTo(sauron);
assertThat(frodo).isIn(fellowshipOfTheRing);
assertThat(sauron).isNotIn(fellowshipOfTheRing);

// String specific assertions
assertThat(frodo.getName()).startsWith("Fro").endsWith("do")
                           .isEqualToIgnoringCase("frodo");

// collection specific assertions
assertThat(fellowshipOfTheRing).hasSize(9)
                               .contains(frodo, sam)
                               .excludes(sauron);


// map specific assertions (One ring and elves ring bearers initialized before)
assertThat(ringBearers).hasSize(4)
                       .includes(entry(Ring.oneRing, frodo), entry(Ring.nenya, galadriel))
                       .excludes(entry(Ring.oneRing, aragorn));

17 ই অক্টোবর, 2016 আপডেট

ফেস্ট আর সক্রিয় নেই, পরিবর্তে AssertJ ব্যবহার করুন।


4
ফেস্ট মারা গেছে বলে মনে হচ্ছে, তবে কাঁটাচামচ করা AssertJ খুব বেশি জীবিত।
আমেদী ভ্যান গ্যাস

18

একটি খুব মৌলিক সমর্থনযোগ্যতা হ'ল নতুন সিনট্যাক্সটিকে জগাখিচু করা কঠিন।

ধরুন যে কোনও নির্দিষ্ট মান, foo, পরীক্ষার পরে 1 হওয়া উচিত।

assertEqual(1, foo);

--OR--

assertThat(foo, is(1));

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

দ্বিতীয় সংস্করণ সহ, এই ভুলটি করা প্রায় অসম্ভব।


... এবং যখন Eclipse একটি দৃ failure় ব্যর্থতার কথা জানায়, আপনি যদি theতিহ্যগত assertThat () এ যুক্তিগুলি ভুল উপায়ে রাখেন, ত্রুটিটি কোনও অর্থবোধ করে না।
শ্রীধর সারনোবাত

9

উদাহরণ:

assertThat(5 , allOf(greaterThan(1),lessThan(3)));
//  java.lang.AssertionError:
//  Expected: (a value greater than <1> and a value less than <3>)
//       got: <5>
assertTrue("Number not between 1 and 3!", 1 < 5 && 5 < 3);
//  java.lang.AssertionError: Number not between 1 and 3!
  1. আপনি আপনার পরীক্ষা আরও নির্দিষ্ট করতে পারেন
  2. পরীক্ষাগুলি ব্যর্থ হলে আপনি আরও বিশদ ব্যতিক্রম পাবেন
  3. পরীক্ষা পড়া সহজ

বিটিডব্লিউ: আপনি এন্টারটেক্স এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স টেক্সটও লিখতে পারেন ...


1
আরও ভাল, আমি assertThatক্ষেত্রে স্ট্রিং আর্গুমেন্টটি ছেড়ে দেব , কারণ আপনি যে বার্তাটি স্বয়ংক্রিয়ভাবে পান সেটি ঠিক তথ্যবহুল: "প্রত্যাশিত: (<1> এর চেয়ে বড় এবং <3> এর চেয়ে কম মান)"
ম্যাট্রিক্সফ্রাগ

হ্যাঁ তুমিই ঠিক. আমি আমার উত্তর সম্পাদনা করি। মূলত আমি উভয়ই (ম্যাচার) ব্যবহার করতে চাই and এবং (ম্যাচার) তবে এটি কার্যকর হয়নি।
মার্টিনএল

3
assertThat(frodo.getName()).isEqualTo("Frodo");

প্রাকৃতিক ভাষার কাছাকাছি।

সহজতর পড়া, সহজ কোড বিশ্লেষণ। প্রোগ্রামার নতুন কোড লেখার চেয়ে কোড বিশ্লেষণ করতে বেশি সময় ব্যয় করেন। সুতরাং কোডটি যদি বিশ্লেষণ করা সহজ হয় তবে বিকাশকারী আরও বেশি উত্পাদনশীল হওয়া উচিত।

পিএস কোডটি পাশাপাশি লিখিত বই হওয়া উচিত। স্ব নথিভুক্ত কোড।


4
ঠিক আছে…? আমি কেন ভাল জিনিস তা ব্যাখ্যা করে আপনার যুক্তি সমর্থন করার পরামর্শ দিচ্ছি।
নাথান টগি

0

অ্যাসেটএকোয়েলস-এর চেয়ে বেশি পদক্ষেপের সুবিধা রয়েছে -
১) আরও পঠনযোগ্য
২) ব্যর্থতার উপর আরও তথ্য
৩) সময়ের ত্রুটিগুলি রচনা করুন - রান টাইম ত্রুটিগুলির চেয়ে
4) পরীক্ষার শর্তাবলী লেখার সাথে নমনীয়তা
5) পোর্টেবল - আপনি হ্যামক্রাস্ট ব্যবহার করছেন - আপনি jUnit ব্যবহার করতে পারেন বা অন্তর্নিহিত কাঠামো হিসাবে টেস্টএনজি।

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