এটি "অ্যারেঞ্জ-অ্যাসেট-অ্যাক্ট-অ্যাসেট" হওয়া উচিত?


94

অ্যারেঞ্জ-অ্যাক্ট-এ্যাসার্টের ক্লাসিক পরীক্ষার ধরণ সম্পর্কে , আমি প্রায়শই নিজেকে আইনের পূর্বে থাকা একটি পাল্টা দাবি যুক্ত করতে দেখি। এইভাবে আমি জানি যে উত্তীর্ণের দৃ .়তা ক্রিয়াটির ফলাফল হিসাবে সত্যিই পাস করছে।

আমি এটিকে লাল-সবুজ-চুল্লী রেখার সাথে সাদৃশ্য হিসাবে মনে করি, যেখানে কেবলমাত্র আমি যদি আমার পরীক্ষার সময় লাল দণ্ডটি দেখে থাকি তবেই আমি জানি যে সবুজ বারটির অর্থ আমি একটি কোড লিখেছি যা একটি তাত্পর্য তৈরি করে। যদি আমি একটি পাসিং পরীক্ষা লিখি, তবে যে কোনও কোড এটি সন্তুষ্ট করবে; একইভাবে, অ্যারেঞ্জ-অ্যাসেট-অ্যাক্ট-অ্যাসেটের বিষয়ে, যদি আমার প্রথম দৃser় ব্যর্থতা হয়, আমি জানি যে কোনও আইনই চূড়ান্ত প্রতিবেদনটি পাস করত - যাতে এটি আইনটি সম্পর্কে আসলে যাচাই করে না।

আপনার পরীক্ষাগুলি কি এই প্যাটার্নটি অনুসরণ করে? কেন অথবা কেন নয়?

আপডেট স্পষ্টকরণ: প্রাথমিক দাবিটি চূড়ান্ত জবাবের বিপরীতে। এটি অ্যারেঞ্জ কাজ করেছে এমন কোনও দাবি নয়; এটি একটি দাবি যে আইনটি এখনও কাজ করে নি।

উত্তর:


121

এটি করা সবচেয়ে সাধারণ জিনিস নয়, তবে এটির নিজস্ব নাম থাকার জন্য এখনও সাধারণ common এই কৌশলটি গার্ড অ্যাসেরেশন বলা হয় । জেরার্ড মেসজারোস (অত্যন্ত প্রস্তাবিত) এর দুর্দান্ত বই xUnit টেস্ট প্যাটার্নগুলিতে আপনি 490 পৃষ্ঠায় এর বিস্তারিত বিবরণ পেতে পারেন ।

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

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


+1, খুব ভাল উত্তর। শেষ অংশটি বিশেষভাবে গুরুত্বপূর্ণ, কারণ এটি দেখায় যে আপনি পৃথক ইউনিট পরীক্ষা হিসাবে জিনিসগুলি রক্ষা করতে পারেন।
মুরেকেট

4
আমি সাধারণত এটিও এইভাবে করেছি তবে পূর্বশর্তগুলি নিশ্চিত করার জন্য পৃথক পরীক্ষা করানোর সমস্যা রয়েছে (বিশেষত পরিবর্তনের প্রয়োজনীয়তার সাথে একটি বৃহত কোডবেস সহ) - পূর্ববর্তী অবস্থা পরীক্ষা সময়ের সাথে সংশোধন হবে এবং 'প্রধান' এর সাথে সিঙ্কের বাইরে চলে যাবে এই পরীক্ষাটি পূর্ববর্তী শর্তগুলি বোঝায়। সুতরাং পূর্ব শর্তগুলি সমস্ত সূক্ষ্ম এবং সবুজ হতে পারে তবে সেই পূর্ব শর্তগুলি মূল পরীক্ষায় সন্তুষ্ট নয়, যা এখন সর্বদা সবুজ এবং সূক্ষ্ম দেখায়। পূর্ব শর্তগুলি যদি মূল পরীক্ষায় থাকে তবে তারা ব্যর্থ হত। আপনি কি এই সমস্যাটি জুড়ে এসেছেন এবং এর জন্য একটি দুর্দান্ত সমাধান পেয়েছেন?
nchaud

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

@ মার্কসিম্যান আপনি ঠিকই বলেছেন, আমাদের পুনরাবৃত্তিটি হ্রাস করতে হবে, তবে অন্যদিকে অনেক কিছু থাকতে পারে, যা নির্দিষ্ট পরীক্ষার জন্য অ্যারেঞ্জকে প্রভাবিত করতে পারে, যদিও অ্যারেঞ্জের জন্য পরীক্ষা নিজেই পাস করবে। উদাহরণস্বরূপ অ্যারেঞ্জ টেস্টের জন্য ক্লিন আপ বা অন্য কোনও টেস্টের পরে ত্রুটিযুক্ত ছিল এবং সাজানো টেস্টের মতো সাজানো হবে না।
রেকশিনো

32

এটি অ্যারেঞ্জ- হিসাবে ধরে নিন -আ্যাক্ট-এসার্ট হিসাবেও নির্দিষ্ট করা যেতে পারে ।

নুনিটে এর জন্য একটি প্রযুক্তিগত হ্যান্ডেল রয়েছে, যেমন এখানে উদাহরণ হিসাবে: http://nunit.org/index.php?p=theory&r=2.5.7


4
সুন্দর! আমি চতুর্থ পছন্দ করি - এবং ভিন্ন - এবং নির্ভুল - "এ"। ধন্যবাদ!
কার্ল ম্যানাস্টার

+1, @ ওল! আমি বিশেষ একটি ক্ষেত্রে এটিও খুব পছন্দ করি! আমি এটা চেষ্টা করে দেখব!
জন টোবলার

8

এখানে একটি উদাহরণ।

public void testEncompass() throws Exception {
    Range range = new Range(0, 5);
    assertFalse(range.includes(7));
    range.encompass(7);
    assertTrue(range.includes(7));
}

এটা হতে পারে যে আমি Range.includes()কেবল সত্য ফিরে যেতে লিখেছি । আমি করিনি, তবে আমি ভাবতে পারি যে আমার থাকতে পারে। অথবা আমি এটি অন্য কোনও সংখ্যায় ভুল লিখতে পারতাম। আমি আশা করব এবং আশা করব যে টিডিডি দিয়ে আমি আসলে এটি সঠিকভাবে পেয়েছি - যা includes()কেবল কাজ করে - তবে সম্ভবত আমি তা করি নি। দ্বিতীয় দৃser়তাটি সত্যই অর্থবহ তা নিশ্চিত করার জন্য প্রথম দৃ়তাটি একটি স্যানিটি চেক।

নিজেই পড়ুন, assertTrue(range.includes(7));বলছেন: "দাবী করুন যে পরিবর্তিত পরিসীমাটিতে 7 রয়েছে"। প্রথম দৃ of়তার প্রসঙ্গে পড়ুন, এটি বলছে: "দাবি করুন যে ইনকোভাসিং ইনকোপাস () এটি 7 টি অন্তর্ভুক্ত করে।

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


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

ধরুন আপনি এই রেঞ্জ ক্লাসটি টিডিডি করেছেন, রেঞ্জ কর্টারের পরীক্ষা করার পরে আর কোনও ব্যর্থ পরীক্ষা হবে না, যখন আপনি এটি ভেঙে দেবেন?
জনগণ

4
@ ফিলিপ: আমি নিশ্চিত না যে আমি প্রশ্নটি বুঝতে পেরেছি। ব্যাপ্তি নির্মাতা এবং এর অন্তর্ভুক্ত রয়েছে () এর নিজস্ব ইউনিট পরীক্ষা রয়েছে। আপনি দয়া করে বিস্তারিত বলতে পারেন?
কার্ল ম্যানাস্টার

প্রথম অ্যাসেটফালসের জন্য (রেঞ্জ.হিন্ডস (7)) দৃ fail় ব্যর্থতার জন্য আপনার রেঞ্জ কনস্ট্রাক্টরে কোনও ত্রুটি থাকা দরকার। সুতরাং আমি জিজ্ঞাসা করতে চাইছিলাম যে পরিসীমা নির্মাতার জন্য পরীক্ষাগুলি সেই প্রতিবেদনের একই সময়ে ভঙ্গ হবে না। এবং আইনের পরে অন্য কোনও মান সম্পর্কে জোর দেওয়ার বিষয়ে কী ? যেমন: assertFalse (range.includes (6))?
ফিলান্ট

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

7

একটি Arrange-Assert-Act-Assertপরীক্ষা সবসময় দুটি পরীক্ষায় পুনঃসংশ্লিষ্ট করা যায়:

1. Arrange-Assert

এবং

2. Arrange-Act-Assert

প্রথম পরীক্ষাটি কেবল সাজানো পর্যায়ে যা সেট আপ হয়েছিল তার উপর নির্ভর করবে এবং দ্বিতীয় পরীক্ষাটি কেবল আইন পর্বে যা ঘটেছিল তার জন্যই দৃ .়ভাবে দাবি করবে।

এটি অ্যারেঞ্জ বা আইন পর্বে ব্যর্থ হয়েছে কিনা সে সম্পর্কে আরও সুনির্দিষ্ট প্রতিক্রিয়া দেওয়ার সুবিধা রয়েছে, মূলত Arrange-Assert-Act-Assertএগুলি সঙ্কুচিত রয়েছে এবং আপনাকে আরও গভীর খনন করতে হবে এবং ঠিক কী জোর দেওয়া ব্যর্থ হয়েছে এবং তা কেন জানতে ব্যর্থ হয়েছে তা পরীক্ষা করতে হবে এটি অ্যারেঞ্জ বা আইন যা ব্যর্থ হয়েছিল।

আপনি আরও ভাল ইউনিটগুলিতে নিজের পরীক্ষাটি পৃথক করছেন বলে এটি আরও ভাল ইউনিট পরীক্ষার অভিপ্রায়টি সন্তুষ্ট করে।

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


3

আমি এখন এটি করছি। অন্য রকমের এএএএএ

Arrange - setup
Act - what is being tested
Assemble - what is optionally needed to perform the assert
Assert - the actual assertions

আপডেট পরীক্ষার উদাহরণ:

Arrange: 
    New object as NewObject
    Set properties of NewObject
    Save the NewObject
    Read the object as ReadObject

Act: 
    Change the ReadObject
    Save the ReadObject

Assemble: 
    Read the object as ReadUpdated

Assert: 
    Compare ReadUpdated with ReadObject properties

কারণটি হ'ল অ্যাক্টটিতে রিডআপডেটেড পড়া না থাকা কারণ এটি আইনটির অংশ নয়। আইনটি কেবল পরিবর্তন এবং সংরক্ষণ করছে। সত্যিই, দৃR়তার জন্য অ্যারেঞ্জ রিডআপটেড, আমি দৃSE়তার জন্য এসএসইএমবিএল কল করছি। এটি হ'ল অ্যারেঞ্জ বিভাগটি বিভ্রান্ত করা রোধ করতে

অ্যাসের্টে কেবলমাত্র যুক্তি থাকা উচিত। এটি ACT এবং ASSERT এর মধ্যে ASSEMBLE ছেড়ে যায় যা দৃ sets়তা সেট করে।

সবশেষে, আপনি যদি অ্যারেঞ্জে ব্যর্থ হন তবে আপনার পরীক্ষাগুলি সঠিক নয় কারণ এই তুচ্ছ বাগগুলি প্রতিরোধ / সন্ধান করার জন্য আপনার অন্যান্য পরীক্ষা করা উচিত । কারণ আমি যে দৃশ্যের উপস্থাপন করছি তার জন্য ইতিমধ্যে অন্যান্য পরীক্ষাগুলি থাকা উচিত যা পরীক্ষা এবং তৈরি পরীক্ষা করে। আপনি যদি "গার্ড দৃ As়তা" তৈরি করেন তবে আপনি ডিআরওয়াই ভঙ্গ করছেন এবং রক্ষণাবেক্ষণ তৈরি করছেন।


1

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


1

আমি ইতিমধ্যে এই কৌশলটি পড়েছি - সম্ভবত আপনার কাছ থেকে বিটিডব্লিউ - তবে আমি এটি ব্যবহার করি না; বেশিরভাগ কারণেই আমি আমার ইউনিট পরীক্ষার জন্য ট্রিপল এ ফর্মটিতে অভ্যস্ত।

এখন, আমি কৌতূহলী হয়ে উঠছি এবং কিছু প্রশ্ন রয়েছে: আপনি কীভাবে আপনার পরীক্ষাটি লেখেন, আপনি কি এই দাবিটিকে ব্যর্থ করে ফেলেন, লাল-সবুজ-লাল-সবুজ-রিফ্যাক্টর চক্র অনুসরণ করে, বা আপনি এটি পরে যুক্ত করবেন?

আপনি কোডটি রিফ্যাক্টর করার পরেও কি কখনও কখনও ব্যর্থ হন? এটি আপনাকে কী বলে? সম্ভবত আপনি একটি উদাহরণ ভাগ করে নিতে পারেন যেখানে এটি সাহায্য করেছিল। ধন্যবাদ


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

1

আমি ব্যর্থ হয়েছে এমন কোনও পরীক্ষার তদন্ত করার আগে এটি করেছি।

যথেষ্ট মাথা আঁচড়ানোর পরে, আমি নির্ধারণ করেছি যে কারণটি "অ্যারেঞ্জ" এর সময় ডাকা পদ্ধতিগুলি সঠিকভাবে কাজ করছে না। পরীক্ষার ব্যর্থতা বিভ্রান্তিকর ছিল। আমি ব্যবস্থা পরে একটি জোড় যুক্ত। এটি পরীক্ষাটি এমন জায়গায় ব্যর্থ করেছিল যা প্রকৃত সমস্যাটি হাইলাইট করেছিল।

আমি মনে করি পরীক্ষার সাজানো অংশটি দীর্ঘ এবং জটিল হলে এখানে একটি কোড গন্ধও রয়েছে।


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

1

সাধারণভাবে, আমি "অ্যারেঞ্জ, অ্যাক্ট, জোর" পছন্দ করি এবং এটি আমার ব্যক্তিগত মান হিসাবে ব্যবহার করি। যাইহোক, আমাকে যে বিষয়টি মনে করিয়ে দেওয়ার জন্য এটি ব্যর্থ হয়েছে তা হ'ল দৃ as়তার সাথে কাজ শেষ করার পরে আমি কী ব্যবস্থা করেছি dis বেশিরভাগ ক্ষেত্রে এটি খুব বিরক্তির কারণ হয় না, কারণ বেশিরভাগ জিনিস অটো-ম্যাজিকালি আবর্জনা সংগ্রহ ইত্যাদির মাধ্যমে চলে যায় If আপনার দাবিগুলির সাথে বা আপনার অনেকের কাছে কোনও সার্ভার বা ব্যয়বহুল সংস্থান আছে কোথাও সংযোগগুলি বা অত্যাবশ্যক সংস্থানগুলিতে ধরে রাখা যাতে এটি অন্য কাউকে দিতে সক্ষম হয়। এটি বিশেষত গুরুত্বপূর্ণ যদি আপনি সেই বিকাশকারীদের মধ্যে একজন হন যারা টিয়ারডাউন বা টেস্টফাইচারটিয়ারডাউন ব্যবহার করেন নাএক বা একাধিক পরীক্ষার পরে পরিষ্কার করতে। অবশ্যই, আমি যা খুলি তা বন্ধ করতে আমার ব্যর্থতার জন্য "অ্যারেঞ্জ, অ্যাক্ট, এ্যাসেট" দায়বদ্ধ নয়; আমি কেবল এই "গোটচা" উল্লেখ করেছি কারণ সুপারিশ করার জন্য আমি এখনও "নিষ্পত্তি" করার জন্য একটি ভাল "এ-শব্দ" সমার্থক শব্দ পাইনি! কোনও পরামর্শ?


4
@ কার্লম্যানাস্টার, আপনি আসলে আমার জন্য যথেষ্ট কাছাকাছি! আমি এটি পরবর্তী আকারে পরীক্ষা করার জন্য টেস্ট ফিকচারে স্টিক করছি। এটি আপনার মা আপনাকে যা শিখিয়েছিল তা করা এই ছোট্ট অনুস্মারকের মতো: "আপনি যদি এটি এটি বন্ধ করেন! আপনি যদি গোলমাল করেন তবে এটি পরিষ্কার করুন!" হতে পারে অন্য কেউ এর উপর উন্নতি করতে পারে তবে অন্তত এটি একটি "এ" দিয়ে শুরু হয়! আপনার পরামর্শের জন্য ধন্যবাদ!
জন টোবলার

4
@ কার্লম্যানাস্টার, আমি "আননুল" চেষ্টা করেছিলাম। এটি "টিয়ারডাউন" এর চেয়ে ভাল এবং এটি একধরণের কাজ করে তবে আমি এখনও অন্য একটি "এ" শব্দটি খুঁজছি যা আমার মাথায় "অ্যারেঞ্জ, অ্যাক্ট, অ্যাড্রেস্ট" হিসাবে পুরোপুরি লেগে থাকে। হতে পারে "অ্যানিহিলেট ?!"
জন টোবলার

4
সুতরাং এখন, আমার কাছে "সাজান, ধরে নেওয়া, আইন, দৃ As়তা, অ্যানিহিলেট" রয়েছে। হুমমম! আমি জিনিসগুলিকে অতিরিক্ত জটিল করে তুলছি, তাই না? হতে পারে আমি কেবল KISS ছাড়াই আরও ভাল ছিলাম এবং "সাজান, আইন করুন এবং জোর দিন!"
জন টোবলার

4
রিসেটের জন্য কোনও আর ব্যবহার করতে পারেন? আমি এটি একটি এ হিসাবে জানি না, তবে এটি জলদস্যু বলে মনে হচ্ছে: আআরগ! এবং দৃশ্যের সাথে ছড়াগুলি রিসেট করুন: ও
মার্সেল ভালদেজ ওরোজকো

1

ডিজাইন বাই কন্ট্রাক্টে উইকিপিডিয়ায় প্রবেশের বিষয়টি দেখুন । অ্যারেঞ্জ-অ্যাক্ট-অ্যাসিস্ট পবিত্র ট্রিনিটি একই ধরণের কয়েকটি ধারণাকে এনকোড করার চেষ্টা এবং প্রোগ্রামের সঠিকতা প্রমাণ করার বিষয়ে। নিবন্ধ থেকে:

The notion of a contract extends down to the method/procedure level; the
contract for each method will normally contain the following pieces of
information:

    Acceptable and unacceptable input values or types, and their meanings
    Return values or types, and their meanings
    Error and exception condition values or types that can occur, and their meanings
    Side effects
    Preconditions
    Postconditions
    Invariants
    (more rarely) Performance guarantees, e.g. for time or space used

এটি স্থাপনে যে পরিমাণ প্রচেষ্টা ব্যয় করা হয়েছে এবং এটির সাথে যুক্ত হওয়া মানের মধ্যে একটি বাণিজ্য রয়েছে। এএএ প্রয়োজনীয় ন্যূনতম পদক্ষেপগুলির জন্য দরকারী অনুস্মারক তবে অতিরিক্ত পদক্ষেপগুলি তৈরি করা থেকে কাউকে নিরুৎসাহিত করা উচিত নয়।


0

আপনার পরীক্ষার পরিবেশ / ভাষার উপর নির্ভর করে, তবে সাধারণত যদি সাজানো অংশের কিছু ব্যর্থ হয় তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয় এবং অ্যাক্ট অংশটি শুরু করার পরিবর্তে পরীক্ষাটি ব্যর্থ হয়। সুতরাং না, আমি সাধারণত দ্বিতীয় সন্নিবেশ অংশটি ব্যবহার করি না।

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


0

আমি সেই প্যাটার্নটি ব্যবহার করি না, কারণ আমার মনে হয় এরকম কিছু করা হচ্ছে:

Arrange
Assert-Not
Act
Assert

অর্থহীন হতে পারে, কারণ সম্ভবত আপনি জানেন যে আপনার অ্যারেঞ্জ অংশটি সঠিকভাবে কাজ করে, যার অর্থ যে অ্যারেঞ্জ অংশে যা আছে তা অবশ্যই পরীক্ষা করা উচিত বা পরীক্ষার প্রয়োজন না পড়ার জন্য যথেষ্ট সহজ হতে হবে।

আপনার উত্তরের উদাহরণ ব্যবহার করে:

public void testEncompass() throws Exception {
    Range range = new Range(0, 5);
    assertFalse(range.includes(7)); // <-- Pointless and against DRY if there 
                                    // are unit tests for Range(int, int)
    range.encompass(7);
    assertTrue(range.includes(7));
}

আমি ভয় করি আপনি আমার প্রশ্নটি সত্যই বুঝতে পারছেন না। প্রাথমিক দৃsert়তা অ্যারেঞ্জ পরীক্ষা করার বিষয়ে নয়; এটি কেবল নিশ্চিত করেই চলেছে যে আইনটিই রাজ্যটির শেষে বলা হচ্ছে brings
কার্ল ম্যানাস্টার

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

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

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

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

0

আপনি যদি উদাহরণের মধ্যে সত্যই সবকিছু পরীক্ষা করতে চান তবে আরও পরীক্ষার চেষ্টা করুন ... যেমন:

public void testIncludes7() throws Exception {
    Range range = new Range(0, 5);
    assertFalse(range.includes(7));
}

public void testIncludes5() throws Exception {
    Range range = new Range(0, 5);
    assertTrue(range.includes(5));
}

public void testIncludes0() throws Exception {
    Range range = new Range(0, 5);
    assertTrue(range.includes(0));
}

public void testEncompassInc7() throws Exception {
    Range range = new Range(0, 5);
    range.encompass(7);
    assertTrue(range.includes(7));
}

public void testEncompassInc5() throws Exception {
    Range range = new Range(0, 5);
    range.encompass(7);
    assertTrue(range.includes(5));
}

public void testEncompassInc0() throws Exception {
    Range range = new Range(0, 5);
    range.encompass(7);
    assertTrue(range.includes(0));
}

কারণ অন্যথায় আপনি ত্রুটির জন্য এতগুলি সম্ভাবনা হারিয়ে ফেলছেন ... উদাহরণস্বরূপ পরিবেষ্টনের পরে, পরিসীমাটি কেবলমাত্র 7 টি ইত্যাদি অন্তর্ভুক্ত রয়েছে ... এখানে পরিসরের দৈর্ঘ্যের পরীক্ষাও রয়েছে (এটি কোনও এলোমেলো মানও অন্তর্ভুক্ত করে না তা নিশ্চিত করার জন্য), এবং পরিসীমা 5 টি পরিবেষ্টনের চেষ্টা করার জন্য পরীক্ষার আরও একটি সেট ... আমরা কী প্রত্যাশা করব - পরিবেষ্টনের ব্যতিক্রম, বা পরিসীমাটি আনল্যাটারড হতে পারে?

যাইহোক, মুল বক্তব্যটি হল যে আইনে যদি আপনি পরীক্ষা করতে চান এমন কোনও অনুমান থাকে তবে সেগুলি তাদের নিজের পরীক্ষায় ফেলুন, হ্যাঁ?


0

আমি ব্যবহার করি:

1. Setup
2. Act
3. Assert 
4. Teardown

কারণ একটি পরিষ্কার সেটআপ অত্যন্ত গুরুত্বপূর্ণ is

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