কোনও ইউনিট পরীক্ষায় পাস করার জন্য ন্যূনতম কোড লেখা - প্রতারণা ছাড়াই!


36

টিডিডি করার সময় এবং ইউনিট পরীক্ষা লেখার সময়, আপনি কীভাবে পরীক্ষা করছেন যে "প্রয়োগ" কোডটির প্রথম পুনরাবৃত্তিটি লেখার সময় "প্রতারণা" করার তাগিদকে প্রতিহত করবে?

উদাহরণস্বরূপ:
আসুন আমি একটি সংখ্যার ফ্যাক্টরিয়াল গণনা করা দরকার। আমি ইউনিট পরীক্ষা দিয়ে শুরু করি (এমএসটিস্ট ব্যবহার করে) এরকম কিছু:

[TestClass]
public class CalculateFactorialTests
{
    [TestMethod]
    public void CalculateFactorial_5_input_returns_120()
    {
        // Arrange
        var myMath = new MyMath();
        // Act
        long output = myMath.CalculateFactorial(5);
        // Assert
        Assert.AreEqual(120, output);
    }
}

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

বিষয়টি হ'ল, আমি নিরন্তর নিম্নলিখিতগুলি লিখতে প্ররোচিত হই:

public class MyMath
{
    public long CalculateFactorial(long input)
    {
        return 120;
    }
}

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

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


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

7
অবশ্যই, টিডিডিতে, অন্য উপায়ে এটি করা প্রতারণা - অর্থাৎ 120 ফেরত দেওয়া সঠিক উপায়। আমি নিজেকে নিজেকে এটি করা বেশ কঠিন বলে মনে করি, এবং রেস না করে এবং ঘটনামূলক গণনাটি লিখতে শুরু করি।
পল কসাই

2
আমি এটিকে প্রতারণা হিসাবে বিবেচনা করব, কেবলমাত্র এটি পরীক্ষায় উত্তীর্ণ হতে পারে তবে এটি কোনও সত্যিকারের কার্যকারিতা যুক্ত করে না বা আপনাকে হাতের সমস্যার চূড়ান্ত সমাধানের নিকটবর্তী করে না।
গ্রম্পিমনকি

3
যদি এটির সক্রিয় হয় যে ক্লায়েন্ট কোড কোডটি কেবলমাত্র 5-এ চলে যায়, 120 ফেরত পাওয়া কেবল একটি অ-প্রতারণা নয়, এটি আসলে একটি বৈধ সমাধান।
ক্রমিই পুনর্নির্মাণ মনিকা

আমি @ পলবুচারের সাথে একমত - আসলে, পাঠ্য এবং নিবন্ধগুলিতে অনেকগুলি ইউনিট পরীক্ষার উদাহরণগুলি এই পদ্ধতির গ্রহণ করবে।
হুরুসকোল

উত্তর:


45

এটা পুরোপুরি বৈধ। লাল, সবুজ, সংশোধক

প্রথম পরীক্ষা পাস হয়।

নতুন ইনপুট সহ দ্বিতীয় পরীক্ষা যুক্ত করুন।

এখন তাড়াতাড়ি সবুজ হয়ে উঠুন, আপনি একটি যদি-অন্যথায় যুক্ত করতে পারেন যা ভাল কাজ করে। এটি পাস, কিন্তু আপনি এখনও করা হয়নি।

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

আমি বলছি না যে এটি প্রথমবার সঠিকভাবে লিখবেন না। আমি শুধু বলছি এটি না দিলে প্রতারণা হচ্ছে না।


12
এটি কেবল প্রশ্ন উত্থাপন করে, কেন প্রথম স্থানে সঠিকভাবে ফাংশনটি লিখবেন না?
রবার্ট হার্ভে

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

1
@ রবার্ট, আপনিই পরীক্ষায় উত্তীর্ণ হওয়ার পরিবর্তে সমস্যা সমাধানের বিষয়ে উদ্বিগ্ন। আমি আপনাকে বলছি যে নন-তুচ্ছ সমস্যার জন্য আপনার জায়গায় পরীক্ষা না করা অবধি শক্ত নকশা স্থগিত করা আরও ভাল কাজ করে।

1
@ থরবজর্ন রাভন অ্যান্ডারসন, না, আমি বলছি না যে আপনার কেবলমাত্র একটি ফিরতে পারবেন। একাধিক (যেমন গার্ড স্টেটমেন্ট) এর বৈধ কারণ রয়েছে। বিষয়টি হ'ল উভয় রিটার্নের বিবৃতি "সমান" ছিল। তারা একই 'জিনিস' করেছে। তারা ঠিক বিভিন্ন মান আছে ঘটেছে। টিডিডি অনড়তা সম্পর্কে নয়, এবং পরীক্ষা / কোড অনুপাতের একটি নির্দিষ্ট আকারের সাথে মেনে চলা। এটি আপনার কোড বেসের মধ্যে একটি আরামের স্তর তৈরি করার বিষয়ে about আপনি যদি একটি ব্যর্থ পরীক্ষা লিখতে পারেন, তবে এমন একটি ফাংশন যা সেই ফাংশনের ভবিষ্যতের পরীক্ষার জন্য কাজ করবে, দুর্দান্ত। এটি করুন, তারপরে আপনার ফাংশনটি এখনও কাজ করে তা নিশ্চিত করে আপনার প্রান্তের কেস টেস্টগুলি লিখুন।
CaffGeek

3
একবারে সম্পূর্ণ (সহজ হলেও বাস্তবায়ন) না লেখার বিষয়টি হ'ল আপনার পরীক্ষাগুলি এমনকি ব্যর্থ হতে পারে তার কোনও গ্যারান্টি নেই have পরীক্ষাটি পাস করার আগে ব্যর্থ হওয়ার বিষয়টি দেখার বিষয়টি হ'ল আপনার কাছে কোডের পরিবর্তনটিই এটির বিষয়ে আপনার দৃ satisfied় বিশ্বাসকে সন্তুষ্ট করেছিল actual এই রিগ্রেশন টেস্ট স্যুট তৈরির জন্য টিডিডি এত দুর্দান্ত এবং একমাত্র কারণেই "টেস্টের পরে" টেস্টের সাথে মেঝে পুরোপুরি মুছে দেয় that এই অর্থে গ্রহণযোগ্য।
সার

25

স্পষ্টতই চূড়ান্ত লক্ষ্য সম্পর্কে একটি বোঝার জন্য, এবং সেই লক্ষ্যটি পূরণ করে এমন একটি অ্যালগরিদমের অর্জন প্রয়োজনীয়।

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

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

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

চাচা বব মার্টিন এই বলে:

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

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

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


সত্যিকার অর্থে প্রশ্নের উত্তর নয়, তবে 1+
কেউ

2
@ আরএমএক্স: উম, প্রশ্ন হল: "পরীক্ষায় পাস করার জন্য ন্যূনতম কোড লেখার" মধ্যে আপনি কীভাবে এই ভারসাম্যটি অর্জন করবেন যদিও এখনও এটি কার্যকর রাখে এবং আপনি আসলে অর্জনের চেষ্টা করছেন এমন চেতনায়? আমরা কি একই প্রশ্নটি পড়ছি?
রবার্ট হার্ভে

আদর্শ সমাধানটি একটি অ্যালগরিদম এবং স্থাপত্যের সাথে কিছুই করার নেই। টিডিডি করা আপনাকে অ্যালগোরিদম আবিষ্কার করতে সক্ষম করবে না। কিছু সময়ে আপনাকে একটি অ্যালগরিদম / সমাধানের পদক্ষেপে পদক্ষেপগুলি করতে হবে।
Joppe

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

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

16

একটি খুব ভাল প্রশ্ন ... এবং আমাকে @ রবার্ট ব্যতীত প্রায় সকলের সাথেই একমত হতে হবে।

লেখা

return 120;

একটি পরীক্ষামূলক পাস করার জন্য একটি ফ্যাক্টরিয়াল ফাংশনের জন্য সময় নষ্ট করা । এটি "প্রতারণা" নয়, এটি আক্ষরিকভাবে লাল-সবুজ-চুল্লী অনুসরণ করছে না। এটা ভুল

কারণটা এখানে:

  • ফ্যাক্টরিয়াল গণনা বৈশিষ্ট্য, "একটি ধ্রুবক ফিরে না"। "আসতে 120" হয় না গণনা।
  • 'রিফ্যাক্টর' যুক্তিগুলি বিপথগামী হয়; যদি আপনি 5 এবং 6 দুটি পরীক্ষার বিষয় আছে, এই কোড, ভুল এখনও কারণ আপনি একটি গৌণিক গণক নেই এ সব :

    if (input == 5) { return 120; } //input=5 case
    else { return 720; }   //input=6 case
    
  • যদি আমরা 'refactor' যুক্তি অনুসরণ আক্ষরিক , তাহলে আমরা 5 পরীক্ষার বিষয় আছে যখন আমরা YAGNI ডাকা এবং লুকআপ টেবিল ব্যবহার ফাংশন বাস্তবায়ন হবে:

    if (factorialDictionary.Contains(input)) {
        return factorialDictionary[input]; 
    }
    throw new Exception("Input failure");
    

এগুলির কিছুই আসলে কিছু গণনা করছে না, আপনি । আর এটাই তো কাজ নয়!


1
@ আরএমএক্স: না, এটিকে মিস করবেন না; "সদৃশ অপসারণের জন্য চুল্লি" একটি সন্ধানের টেবিলের সাথে সন্তুষ্ট হতে পারে। বিটিডব্লিউ যে নীতিটি ইউনিট পরীক্ষা করে এনকোড প্রয়োজনীয়তা বিডিডি-তে নির্দিষ্ট নয়, এটি অ্যাগ্রিল / এক্সপি-র একটি সাধারণ নীতি। যদি প্রয়োজন হয় "5 'এর ফ্যাক্টরিয়ালটি কি' প্রশ্নের উত্তর দিন 'তবে 120 ফেরত দিন;' বৈধ হবে ;-)
স্টিভেন এ। লো

2
@ চ্যাড যার সবগুলিই অপ্রয়োজনীয় কাজ - কেবল প্রথমবারের মতো ফাংশনটি লিখুন ;-)
স্টিভেন এ লো লো

2
@ স্টিভেন এ লও, এই যুক্তি অনুসারে, কেন কোনও পরীক্ষা লিখুন ?! "প্রথমবার শুধু অ্যাপ্লিকেশনটি লিখুন!" টিডিডির পয়েন্টটি হ'ল ছোট, নিরাপদ, ইনক্রিমেন্টাল পরিবর্তন।
ক্যাফগিকে

1
@ চাদ: স্ট্রোম্যান।
স্টিভেন এ। লো

2
একবারে সম্পূর্ণ (সহজ হলেও বাস্তবায়ন) না লেখার বিষয়টি হ'ল আপনার পরীক্ষাগুলি এমনকি ব্যর্থ হতে পারে তার কোনও গ্যারান্টি নেই have পরীক্ষাটি পাস করার আগে ব্যর্থ হওয়ার বিষয়টি দেখার বিষয়টি হ'ল আপনার কাছে কোডের পরিবর্তনটিই এটির বিষয়ে আপনার দৃ satisfied় বিশ্বাসকে সন্তুষ্ট করেছিল actual এই রিগ্রেশন টেস্ট স্যুট তৈরির জন্য টিডিডি এত দুর্দান্ত এবং একমাত্র কারণেই "টেস্টের পরে" টেস্টের সাথে মেঝেটি পুরোপুরি মুছে দেয় sense এই অর্থে গ্রহণযোগ্য। আপনি দুর্ঘটনাক্রমে কখনই কোনও পরীক্ষা লিখবেন না যা ব্যর্থ হতে পারে না। এছাড়াও, কাকা ববসের প্রাইম ফ্যাক্টর কাটা একবার দেখুন।
সার

10

যখন আপনি কেবল একটি ইউনিট পরীক্ষা লিখেছেন, এক-লাইন বাস্তবায়ন ( return 120;) বৈধ। 120 এর মান গণনা করে একটি লুপ লেখা - তা প্রতারণা হবে!

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

একটি চলতি নিয়ম যে এখানে উপযোগী হতে পারে: শূন্য, এক, অনেক, প্রচুর । জিরো এবং একটি ফ্যাকটোরিয়ালটির জন্য গুরুত্বপূর্ণ এজ cases ওয়ান-লাইনারগুলির সাথে এগুলি প্রয়োগ করা যেতে পারে। "অনেকগুলি" পরীক্ষার কেস (যেমন 5!) আপনাকে লুপ লিখতে বাধ্য করে। "প্রচুর" (1000 !?) পরীক্ষার কেসটি আপনাকে খুব বড় সংখ্যক হ্যান্ডেল করার জন্য বিকল্প অ্যালগরিদম প্রয়োগ করতে বাধ্য করতে পারে।


2
"-1" কেসটি আকর্ষণীয় হবে। কারণ এটি যথাযথভাবে সংজ্ঞায়িত করা হয়নি, সুতরাং পরীক্ষা লেখার লোক এবং কোড লেখার লোক উভয়েরই প্রথমে একমত হওয়া উচিত যা ঘটেছিল।
gnasher729

2
এটি চিহ্নিত করার জন্য +1 factorial(5)এটি একটি খারাপ প্রথম পরীক্ষা। আমরা সবচেয়ে সহজ সম্ভাব্য কেসগুলি থেকে শুরু করি এবং প্রতিটি পুনরাবৃত্তিতে আমরা পরীক্ষাগুলি কিছুটা আরও সুনির্দিষ্ট করি, কোডটিকে কিছুটা জেনেরিক হওয়ার জন্য অনুরোধ করি। এটিই চাচা বব রূপান্তর অগ্রাধিকারের ভিত্তি বলে থাকেন ( ব্লগ ৮.৮.২০৮৮ / ইউনস-ব্লব / ২০১৩ / ২27 / ২/ )
সারা

5

যতক্ষণ না আপনার কেবলমাত্র একটি একক পরীক্ষা থাকে, ততক্ষণ পরীক্ষায় উত্তীর্ণ হওয়ার জন্য ন্যূনতম কোডটি সত্যই হয় return 120;এবং যতক্ষণ না আপনার আরও কোনও পরীক্ষা না হয় ততক্ষণ আপনি সহজেই এটির জন্য রাখতে পারেন।

আপনি প্রকৃতপক্ষে এই পদ্ধতির অন্যান্য রিটার্ন মানগুলি পরীক্ষা করে এমন পরীক্ষা না লিখুন এটি আপনাকে আরও নকশা স্থগিত করার অনুমতি দেয়।

দয়া করে মনে রাখবেন পরীক্ষা আপনার স্পেসিফিকেশন-এর runnable সংস্করণ, এবং সমস্ত যদি যে স্পেসিফিকেশন বলছেন তারপর যে তড়কা বিল পুরোপুরি যে চ (6) = 120 হয়।


সিরিয়াসলি? এই যুক্তি অনুসারে, কেউ যখনই নতুন ইনপুট নিয়ে আসে তখন আপনাকে কোডটি পুনরায় লিখতে হবে।
রবার্ট হার্ভে

6
@ রবার্ট, কয়েকটি পয়েন্টে একটি নতুন কেস যুক্ত করার ফলে সহজতম কোডের আর ফল পাওয়া যাবে না , সেই সময়ে আপনি একটি নতুন বাস্তবায়ন লেখেন। আপনার ইতিমধ্যে পরীক্ষাগুলি যেমন রয়েছে, ঠিক তখনই জানেন যে আপনার নতুন বাস্তবায়ন কখন পুরনোটির মতো করে।

1
@ থরবজর্ন রাভন অ্যান্ডারসন, ঠিক রেড-গ্রিন-রিফ্যাক্টরের সবচেয়ে গুরুত্বপূর্ণ অংশ, রিফ্যাক্টরিং oring
ক্যাফগীক

+1: এটি আমার জ্ঞান থেকেও সাধারণ ধারণা, তবে অন্তর্নিহিত চুক্তি (অর্থাত্ পদ্ধতিটির নাম ফ্যাকটোরিয়াল ) পূরণ করার বিষয়ে কিছু বলা দরকার । যদি আপনি কেবল কখনও (যেমন পরীক্ষা) চ (6) = 120 নির্দিষ্ট করেন তবে আপনাকে কেবল '120 ফেরত' দিতে হবে। একবার আপনি f (x) == x * x-1 ... * xx-1: উপরের বাউন্ড> = x> = 0 নিশ্চিত করার জন্য পরীক্ষাগুলি যুক্ত করা শুরু করলে আপনি কোনও ফাংশনে উপস্থিত হবেন যা ঘটনামূলক সমীকরণকে সন্তুষ্ট করে।
স্টিভেন ইভার্স

1
@ স্নোআরফাস, "সূচিত চুক্তি" হওয়ার জায়গাটি পরীক্ষার ক্ষেত্রে রয়েছে। যদি আপনি চুক্তিটি ফ্যাক্টরিওরিয়ালগুলির জন্য হন তবে আপনি যদি পরীক্ষিত ঘটনাগুলি পরিচিত এবং যদি অজানা হিসাবে পরিচিত না হয় তবে পরীক্ষা করেন। তাদের প্রচুর। দশটি ফ্যাক্টরিওলে প্রতিটি সংখ্যাটির জন্য দশটি প্রথম ফ্যাক্টরিওলটির তালিকাটিকে একটি ফর-লুপ পরীক্ষায় রূপান্তর করতে বেশি সময় নেয় না।

4

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

একক মান দিয়ে ফ্যাক্টরিয়াল পদ্ধতিটি পরীক্ষা করার পরিবর্তে এটি পরীক্ষা করা মানের একটি ব্যাপ্তি ছিল। ডেটা-চালিত পরীক্ষা এখানে সহায়তা করতে পারে।

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

সুতরাং নিজেকে জিজ্ঞাসা করুন - যদি কেউ বাস্তবায়নের কোনও ভুলকে বদলে দেয় তবে আপনার পরীক্ষাগুলি কি এখনও পাস হবে বা তারা কি "এক মিনিটে হ্যাং" বলবে!

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


নান্দা যেমন উল্লেখ করেছেন, আপনি সর্বদা একটিতে caseস্টেটমেন্টের অন্তহীন সিরিজ যুক্ত switchকরতে পারেন এবং আপনি ওপি-র উদাহরণের জন্য প্রতিটি সম্ভাব্য ইনপুট এবং আউটপুটের জন্য একটি পরীক্ষা লিখতে পারবেন না।
রবার্ট হার্ভে

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

@ আরএমএক্স: আপনি যদি এটি করতে পারতেন তবে পরীক্ষাগুলি অ্যালগরিদম হতে পারে এবং আপনাকে আর অ্যালগরিদম লেখার দরকার পড়েনি ।
রবার্ট হার্ভে

এটা সত্যি. আমার বিশ্ববিদ্যালয়ের থিসিসটি আসলে টিডিডি-তে সহায়তা হিসাবে জেনেটিক অ্যালগরিদমের গাইড হিসাবে ইউনিট-টেস্টগুলি ব্যবহার করে বাস্তবায়নের স্বয়ংক্রিয় প্রজন্মকে জড়িত - এবং কেবল কঠিন পরীক্ষার মাধ্যমেই এটি সম্ভব। পার্থক্যটি হ'ল আপনার কোডগুলিতে আপনার প্রয়োজনীয়তাগুলিকে আবদ্ধ করা ইউনিট-পরীক্ষাগুলি সমন্বিত একক পদ্ধতির চেয়ে পড়া এবং বোঝা অনেক বেশি কঠিন difficult তারপরে প্রশ্নটি আসে: যদি আপনার বাস্তবায়নটি আপনার ইউনিট পরীক্ষাগুলির প্রকাশ এবং আপনার ইউনিট-পরীক্ষাগুলি আপনার প্রয়োজনীয়তার বহিঃপ্রকাশ হয়, তবে কেন কেবল পরীক্ষা পুরোপুরি বাদ দেওয়া যায় না? আমার কোন উত্তর নেই
কেউ নেই

এছাড়াও, আমরা কি বাস্তবায়নের কোডে থাকাকালীন মানুষ হিসাবে ইউনিট-টেস্টে ভুল করতে পারি না? তাহলে ইউনিট টেস্ট কেন আদৌ?
কেউ নেই

3

শুধু আরও পরীক্ষা লিখুন। শেষ পর্যন্ত, এটি লেখার চেয়ে কম হবে

public long CalculateFactorial(long input)
{
    return input <= 1 ? 1 : CalculateFactorial(input-1)*input;
}

চেয়ে

public long CalculateFactorial(long input)
{
    switch (input) {
       case 0: return 1;
       case 1: return 1;
       case 2: return 2;
       case 3: return 6;
       case 4: return 24;
       case 5: return 120;
    }
}

:-)


3
প্রথম স্থানটিতে সঠিকভাবে অ্যালগরিদম কে লিখবেন না?
রবার্ট হার্ভে

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

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

3

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

মূলত, টিডিডি আপনাকে কোডটি লিখতে সহায়তা করতে পারে যা প্রয়োজনীয়তা সঠিকভাবে প্রয়োগ করে , তবে এটি আপনাকে ভাল কোড লিখতে বাধ্য করতে পারে না । এটা তোমার উপর.

শেয়ার করুন এবং উপভোগ করুন।


"ইউনিট টেস্টিংয়ের জন্য +1 কেবল তখনই সম্পূর্ণ হয় যখন সমস্ত পরীক্ষা পাস হয় এবং কোনও নতুন পরীক্ষা লেখা যায় না যা ব্যর্থ হবে" অনেকেই ধ্রুবক ফিরিয়ে দেওয়ার বৈধতা বলছেন, তবে "স্বল্প মেয়াদে", বা " সামগ্রিক প্রয়োজনীয়তার জন্য যদি কেবলমাত্র সেই নির্দিষ্ট ক্ষেত্রেগুলির প্রয়োজন হয় "
থাইমাইন

1

আমি এখানে রবার্ট হার্ভিসের পরামর্শের সাথে 100% সম্মত হয়েছি, এটি কেবল পরীক্ষাগুলি পাস করার বিষয়ে নয়, আপনার সামগ্রিক লক্ষ্যটিও মাথায় রাখা দরকার।

আপনার যন্ত্রণার সমাধান হিসাবে "" এটি কেবলমাত্র প্রদত্ত ইনপুটগুলির সাথে সেট করে কাজ করার জন্য যাচাই করা হয়েছে "আমি Xunit তত্ত্বের মতো ডেটা চালিত পরীক্ষাগুলি ব্যবহারের প্রস্তাব করব। এই ধারণার পিছনে শক্তি হ'ল এটি আপনাকে সহজেই আউটপুটগুলিতে ইনপুটগুলির স্পেসিফিকেশন তৈরি করতে দেয়।

কারখানাগুলির জন্য, একটি পরীক্ষাটি এর মতো দেখায়:

    [Theory]
    [InlineData(0, 1)]
    [InlineData( 1, 1 )]
    [InlineData( 2, 2 )]
    [InlineData( 3, 6 )]
    [InlineData( 4, 24 )]
    public void Test_Factorial(int input, int expected)
    {
        int result = Factorial( input );
        Assert.Equal( result, expected);
    }

এমনকি আপনি একটি পরীক্ষা-উপাত্ত সরবরাহ সরবরাহ করতে পারেন (যা প্রত্যাবর্তন করে IEnumerable<Tuple<xxx>>) এবং গণিতের আক্রমণকারীকে এনকোড করতে পারে, যেমন বারবার n দ্বারা বিভাজনে এন -1 আসবে।

আমি এই টিপিটিকে পরীক্ষার একটি খুব শক্তিশালী উপায় বলে মনে করি।


1

আপনি যদি এখনও প্রতারণা করতে সক্ষম হন তবে পরীক্ষাগুলি পর্যাপ্ত নয়। আরও পরীক্ষা লিখুন! আপনার উদাহরণস্বরূপ, আমি ইনপুট 1, -1, -1000, 0, 10, 200 দিয়ে পরীক্ষা যুক্ত করার চেষ্টা করব।

তবুও, আপনি যদি সত্যিই প্রতারণা করতে প্রতিশ্রুতিবদ্ধ হন তবে আপনি যদি অন্তঃসত্তা লিখতে পারেন তবে। এই ক্ষেত্রে, কোড পর্যালোচনা ব্যতীত আর কিছুই সাহায্য করতে পারে না। আপনি শীঘ্রই গ্রহণযোগ্যতা পরীক্ষায় ধরা পড়বেন ( অন্য ব্যক্তির লিখিত! )

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


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

0

আমি পরামর্শ দিচ্ছি যে আপনার পরীক্ষার পছন্দটি সেরা পরীক্ষা নয়।

আমি এই দিয়ে শুরু করব:

প্রথম পরীক্ষার হিসাবে কল্পিত (1),

দ্বিতীয় হিসাবে কল্পিত (0)

তৃতীয় হিসাবে ফ্যাকটোরিয়াল (-ve)

এবং তারপরে অ-তুচ্ছ মামলার সাথে চালিয়ে যান

এবং একটি ওভারফ্লো কেস দিয়ে শেষ করুন।



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