পরীক্ষায় যুক্তি এড়ানো চলাকালীন কীভাবে পরীক্ষা পদ্ধতিটি সংগ্রহ করতে পারে returns


14

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

যুক্তিযুক্ত একটি পরীক্ষা সাধারণত একবারে একাধিক জিনিসের পরীক্ষা করে যা সুপারিশ করা হয় না, কারণ পরীক্ষাটি কম পাঠযোগ্য এবং বেশি নাজুক। তবে পরীক্ষার যুক্তি এমন জটিলতাও যুক্ত করে যার মধ্যে একটি লুকানো বাগ থাকতে পারে।

পরীক্ষাগুলি, একটি সাধারণ নিয়ম হিসাবে, কোনও নিয়ন্ত্রণ প্রবাহ ছাড়াও নয় try-catch, এবং দৃ as় কল সহ একাধিক পদ্ধতি কল করা উচিত।

যাইহোক, আমি আমার নকশায় কোনও ভুল দেখতে পাচ্ছি না (আপনি কীভাবে ডেটা অবজেক্টগুলির একটি তালিকা তৈরি করবেন, যার মানগুলির মধ্যে কিছু রয়েছে যেখানে তারা ক্রম রয়েছে তার উপর নির্ভর করে — সেগুলি আলাদাভাবে উত্পন্ন এবং পরীক্ষা করতে পারবেন না)। আমার ডিজাইনের সাথে পরীক্ষা-নিরপেক্ষ কিছু রয়েছে কি? বা খুব কঠোরভাবে ওশেরোভের শিক্ষায় নিবেদিত হচ্ছে? বা এমন কোনও গোপন ইউনিট পরীক্ষার যাদু আছে যা সম্পর্কে আমি জানিনা যে এই সমস্যাটি উদ্ঘাটন করে? (আমি সি # / ভিএস 2010 / নুনিতে লিখছি, তবে যদি সম্ভব হয় তবে ভাষা-অজ্ঞাত উত্তরগুলির সন্ধান করছি))


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

1
@ অ্যান্থনিপাগ্রাম সেটগুলি আনর্ডার্ড করা হয়েছে - ফ্রব কখনও কখনও তৃতীয় হতে পারে, কখনও কখনও ২ য় হতে পারে। আপনি যদি এর উপর নির্ভর করতে পারবেন না, তবে লুপ তৈরি করতে (বা পাইথনের মতো ভাষা বৈশিষ্ট্য in) প্রয়োজনীয়, যদি পরীক্ষাটি হয় "ফ্রোব সফলভাবে একটি বিদ্যমান সংগ্রহে যোগ করা হয়েছিল"।
ইজকাটা

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

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

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

উত্তর:


16

টি এল; ডিআর:

  • পরীক্ষা লিখুন
  • পরীক্ষাটি যদি খুব বেশি করে, কোডটি খুব বেশি করতে পারে।
  • এটি ইউনিট পরীক্ষা নাও হতে পারে (তবে খারাপ পরীক্ষা নয়)।

পরীক্ষার জন্য প্রথম জিনিসটি হ'ল ডগমা অসহায় হওয়া সম্পর্কে। আমি ওয়েস্টিটিসাসের ওয়েটি পড়তে উপভোগ করি যা ডোগমাসহ কিছু বিষয়কে আলোকিত করে দেখায়

যে পরীক্ষাটি লিখতে হবে তা লিখুন।

যদি পরীক্ষাটি কোনওভাবে লেখার প্রয়োজন হয় তবে সেভাবে লিখুন। পরীক্ষাটি কিছু আদর্শিক পরীক্ষার বিন্যাসে জোর করে দেখার চেষ্টা করা বা এটি মোটেও না রাখা ভাল জিনিস নয়। আজ একটি পরীক্ষা করে যা পরীক্ষা করে এটি কিছুদিন পরের "নিখুঁত" পরীক্ষা করার চেয়ে ভাল।

আমি কুরুচিপূর্ণ পরীক্ষায় কিছুটা নির্দেশও করব:

কোডটি যখন কুৎসিত হয় তখন পরীক্ষাগুলি কুরুচিপূর্ণ হতে পারে।

আপনি কুরুচিপূর্ণ পরীক্ষা লিখতে পছন্দ করেন না তবে কুশল কোডটির সর্বাধিক পরীক্ষা করা দরকার।

কুরুচিপূর্ণ কোড আপনাকে পরীক্ষা লিখতে বাধা দেয় না, তবে কুৎসিত কোড আপনাকে এর বেশি লিখতে বাধা দেয়।

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


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

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


7

আমি একটি নতুন উত্তর যুক্ত করছি কারণ আমি যখন আসল প্রশ্নোত্তর লিখেছিলাম তখন আমার দৃষ্টিভঙ্গি আলাদা; এগুলি একসাথে জাল করে বোঝা যায় না।

আমি মূল প্রশ্নে বলেছি

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

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

সুতরাং আমার নতুন উত্তরটি হ'ল: কার্যকরী প্রোগ্রামিং কৌশলগুলি ব্যবহার করুন এবং আপনি বেশিরভাগ সময় এই সমস্যাটি এড়াতে পারবেন। আপনি একক জিনিস পরিচালনা করতে আপনার ফাংশন লিখতে পারেন এবং কেবল শেষ মুহুর্তে জিনিস সংগ্রহগুলিতে এগুলি প্রয়োগ করতে পারেন। তবে তারা খাঁটি হলে আপনি সংগ্রহের উল্লেখ ছাড়াই এগুলি পরীক্ষা করতে পারেন।

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

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


4

একবারে অনেক কিছু পরীক্ষা করার চেষ্টা করবেন না। সংগ্রহে প্রতিটি ডাটা অবজেক্টের প্রতিটি বৈশিষ্ট্য একটি পরীক্ষার জন্য খুব বেশি। পরিবর্তে, আমি সুপারিশ:

  1. যদি সংগ্রহটি স্থির দৈর্ঘ্য হয় তবে দৈর্ঘ্য যাচাই করতে একটি ইউনিট পরীক্ষা লিখুন। যদি এটি পরিবর্তনশীল দৈর্ঘ্য হয় তবে দৈর্ঘ্যের জন্য বেশ কয়েকটি পরীক্ষা লিখুন যা এর আচরণকে বৈশিষ্ট্যযুক্ত করবে (উদাঃ 0, 1, 3, 10)। যে কোনও উপায়ে, এই পরীক্ষাগুলিতে বৈশিষ্ট্যগুলি বৈধতা দেবেন না।
  2. প্রতিটি বৈশিষ্ট্য যাচাই করার জন্য একটি ইউনিট পরীক্ষা লিখুন। যদি সংগ্রহটি স্থির দৈর্ঘ্য এবং সংক্ষিপ্ত হয় তবে প্রতিটি পরীক্ষার জন্য প্রতিটি উপাদানের একটি সম্পত্তির বিরুদ্ধে সুনির্দিষ্টভাবে প্রতিস্থাপন করুন। যদি এটি স্থির দৈর্ঘ্য তবে দীর্ঘ হয় তবে প্রতিটি একটির সম্পত্তির বিপরীতে দাবী করার জন্য উপাদানগুলির একটি প্রতিনিধি তবে ছোট নমুনা চয়ন করুন। যদি এটি পরিবর্তনশীল-দৈর্ঘ্যের হয়, তুলনামূলকভাবে সংক্ষিপ্ত তবে প্রতিনিধি সংগ্রহ উত্পন্ন করুন (অর্থাত্ তিনটি উপাদান) এবং প্রতিটিটির একটির বিপরীতে সম্পত্তি যুক্ত করুন।

এইভাবে এটি পরীক্ষাগুলি যথেষ্ট ছোট করে তোলে যে লুপগুলি ছেড়ে যাওয়া বেদনাদায়ক বলে মনে হয় না। সি # / ইউনিটের উদাহরণ, পরীক্ষার অধীনে প্রদত্ত পদ্ধতি ICollection<Foo> generateFoos(uint numberOfFoos):

[Test]
void generate_zero_foos_returns_empty_list() { ... }
void generate_one_foo_returns_list_of_one_foo() { ... }
void generate_three_foos_returns_list_of_three_foos() { ... }
void generated_foos_have_sequential_ID()
{
    var foos = generateFoos(3).GetEnumerable();
    foos.MoveNext();
    Assert.AreEqual("ID1", foos.Current.id);
    foos.MoveNext();
    Assert.AreEqual("ID2", foos.Current.id);
    foos.MoveNext();
    Assert.AreEqual("ID3", foos.Current.id);
}
void generated_foos_have_bar()
{
    var foos = generateFoos(3).GetEnumerable();
    foos.MoveNext();
    Assert.AreEqual("baz", foos.Current.bar);
    foos.MoveNext();
    Assert.AreEqual("baz", foos.Current.bar);
    foos.MoveNext();
    Assert.AreEqual("baz", foos.Current.bar);
}

যদি আপনি "ফ্ল্যাট ইউনিট পরীক্ষা" দৃষ্টান্ত ব্যবহার করেন (কোনও নেস্টেড স্ট্রাকচার / যুক্তি নেই) তবে এই পরীক্ষাগুলি বেশ পরিষ্কার বলে মনে হচ্ছে। সুতরাং লুপের অভাবের চেয়ে একবারে অনেকগুলি সম্পত্তি পরীক্ষা করার চেষ্টা হিসাবে মূল সমস্যাটি চিহ্নিত করে পরীক্ষাগুলিতে যুক্তি এড়ানো যায়।


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

3
@ অ্যান্থনি পেগ্রাম আমি প্রতি পরীক্ষার এক-প্রতিস্থাপনের উদাহরণ জানি। আমি "টেস্ট ওয়ান টেস্ট" মন্ত্রটি পছন্দ করি ( ক্লিন কোডে এক-প্রতি-পরীক্ষার বিরুদ্ধে বব মার্টিনের পরামর্শ অনুসারে ) prefer পার্শ্ব নোট: ইউনিট টেস্টিং ফ্রেমওয়ার্কগুলি যা "প্রত্যাশিত" বনাম "দাবী করা" দুর্দান্ত (গুগল টেস্ট)। বাকী হিসাবে, আপনি উদাহরণস্বরূপ কেন আপনার পরামর্শগুলিকে পুরো উত্তরে বিভক্ত করবেন না? আমার মনে হয় আমি উপকৃত হতে পারি
কাজার্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.