টিডিডি-তে, আমি যদি একটি পরীক্ষার কেস লিখি যা প্রোডাকশন কোডটি পরিবর্তন না করেই পাস করে, তার অর্থ কী?


17

এগুলি টিডিডির জন্য রবার্ট সি মার্টিনের নিয়ম :

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

যখন আমি একটি পরীক্ষা লিখি যা সার্থক মনে হয় তবে উত্পাদন কোড পরিবর্তন না করে পাস করে:

  1. তার মানে কি আমি কিছু ভুল করেছি?
  2. যদি ভবিষ্যতে এই ধরনের পরীক্ষাগুলি সাহায্য করা যায় তবে এগুলি লেখা এড়ানো উচিত?
  3. আমি কি সেই পরীক্ষাটি সেখানে রেখে দেব বা এটি সরিয়ে ফেলি?

দ্রষ্টব্য: আমি এই প্রশ্নটি এখানে জিজ্ঞাসা করার চেষ্টা করছিলাম : আমি কি পাসিং ইউনিট পরীক্ষা দিয়ে শুরু করতে পারি? তবে আমি এখন পর্যন্ত প্রশ্নটি ভালভাবে বলতে পারিনি।


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

উত্তর:


21

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

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

যদি এটি একটি বৈধ এবং সঠিক পরীক্ষা হিসাবে দেখা যায় এবং এটি কোনও বিদ্যমান পরীক্ষার সদৃশ হয় না, তবে এটি সেখানে রেখে দিন।


বিদ্যমান কোডের পরীক্ষার কভারেজটি উন্নত করা একটি (আশাবাদী) পাসিং পরীক্ষা লেখার জন্য আরও সঠিক বৈধ কারণ।
জ্যাক 17

13

এর অর্থ হল:

  1. আপনি প্রোডাকশন কোড লিখেছেন যা পরীক্ষার আগে লেখার ছাড়াই আপনি যে বৈশিষ্ট্যটি চান তা পূরণ করে ("ধর্মীয় টিডিডি" লঙ্ঘন), বা
  2. আপনার প্রয়োজনীয় বৈশিষ্ট্যটি প্রযোজনা কোডের মাধ্যমে ইতিমধ্যে পরিপূর্ণ হবে এবং আপনি সেই বৈশিষ্ট্যটি coverাকতে কেবল আরও একটি ইউনিট পরীক্ষা লিখছেন।

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

public void TestAddMethod()
{
    Assert.IsTrue(Add(2,3) == 5);
}

কারণ আপনার যা প্রয়োজন তা হ'ল 2 এবং 3 এর ফলাফল একসাথে যুক্ত।

আপনার বাস্তবায়ন পদ্ধতিটি হ'ল:

public int add(int x, int y)
{
    return x + y;
}

তবে আসুন আমরা এখন 4 এবং 6 একসাথে যুক্ত করতে চাই:

public void TestAddMethod2()
{
    Assert.IsTrue(Add(4,6) == 10);
}

আমার আমার পদ্ধতিটি নতুন করে লেখার দরকার নেই, কারণ এটি ইতিমধ্যে দ্বিতীয় কেসটি কভার করে।

এখন বলা যাক যে আমি জানতে পেরেছিলাম যে আমার অ্যাড ফাংশনটিতে কিছুটা সিলিং রয়েছে এমন একটি নম্বর ফিরে আসার দরকার আছে, 100 বলে নেওয়া যাক আমি একটি নতুন পদ্ধতি লিখতে পারি যা এটি পরীক্ষা করে:

public void TestAddMethod3()
{
    Assert.IsTrue(Add(100,100) == 100);
}

এবং এই পরীক্ষা এখন ব্যর্থ হবে। আমার অবশ্যই এখন আমার ফাংশনটি আবার লিখতে হবে

public int add(int x, int y)
{
    var a = x + y;
    return a > 100 ? 100 : a;
}

এটি পাস করতে।

সাধারণ জ্ঞান নির্দেশ করে যে যদি

public void TestAddMethod2()
{
    Assert.IsTrue(Add(4,6) == 10);
}

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


5
add(2,3)পাস করার জন্য যদি আপনি মার্টিনের উদাহরণগুলি সম্পূর্ণরূপে অনুসরণ করেন (এবং তিনি আপনাকে প্রয়োজনীয় পরামর্শ দেন না), আপনি আক্ষরিক অর্থেই ফিরে আসবেন Hard. হার্ড-কোডেড। তারপরে আপনি পরীক্ষাটি লিখতেন add(4,6)যার জন্য আপনাকে প্রডাকশন কোডটি লিখতে বাধ্য করবে যা add(2,3)এটি একই সাথে ভঙ্গ না করে পাস করে। আপনি হবে শেষ পর্যন্ত সঙ্গে return x + y, কিন্তু আপনি এটি দিয়ে শুরু হচ্ছে না। ধারণায়. স্বাভাবিকভাবেই, মার্টিন (বা সম্ভবত এটি অন্য কেউ ছিল, আমি মনে করি না) শিক্ষার জন্য এই জাতীয় উদাহরণ সরবরাহ করতে পছন্দ করে তবে আপনি বাস্তবে এইরকম তুচ্ছ কোড লেখার আশা করেন না।
অ্যান্টনি পেগ্রাম

1
@ টিটিওয়াইটি, সাধারণত, যদি আমি মার্টিনের বই (গুলি) থেকে সঠিকভাবে স্মরণ করি, তবে দ্বিতীয় পরীক্ষার ক্ষেত্রে সাধারণত একটি সাধারণ পদ্ধতির সাধারণ সমাধান লিখতে যথেষ্ট হবে (এবং বাস্তবে, আপনি সত্যিই কেবল এটি কাজ করতে সক্ষম হবেন) প্রথমবার). তৃতীয়ের দরকার নেই।
অ্যান্টনি পেগ্রাম

2
@tieTYT, তারপরে আপনি পরীক্ষা না করা পর্যন্ত লেখার পরীক্ষা চালিয়ে যাবেন। :)
অ্যান্টনি পেগ্রাম

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

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

2

আপনার পরীক্ষার পাস কিন্তু আপনি ভুল নন। আমি মনে করি, প্রযোজনা কোডটি প্রথম থেকেই টিডিডি নয় বলেই এটি হয়েছিল।

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

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

আমি ব্যক্তিগতভাবে এই ধরনের সর্বগ্রাসী, অমানবিক নিয়ম পছন্দ করি না; ((


2

আসলে একই বিষয়টি গত রাতে একটি ডোজোয় উঠে এসেছিল।

আমি এটি সম্পর্কে একটি দ্রুত গবেষণা করেছি। এটিই আমি নিয়ে এসেছি:

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

অতিরিক্ত পরীক্ষা যতক্ষণ না এগুলি অনর্থক না হয় ততক্ষণ লেখা যেতে পারে। সমতুল্য শ্রেণি বিভাজন পরীক্ষা করা ভাল অভ্যাস হবে। এর অর্থ হ'ল প্রতিটি সমতুল্য শ্রেণীর জন্য প্রান্তের কেসগুলি এবং কমপক্ষে একটি অভ্যন্তরীণ ক্ষেত্রে পরীক্ষা করা হয়।

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

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


0

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

আপনি যখন সমস্যার মধ্যে পড়েছেন তখন আপনি সমস্যার স্থানটি বোঝার জন্য প্রতিস্থাপন হিসাবে ইতিমধ্যে উত্তীর্ণ পরীক্ষাটি লেখেন।

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

প্রথম প্রোগ্রামার লিখেছেন:

assert abs(-88888) == 88888
assert abs(-12345) == 12345
assert abs(-5000) == 5000
assert abs(-32) == 32
assert abs(46) == 46
assert abs(50) == 50
assert abs(5001) == 5001
assert abs(999999) == 999999
...

দ্বিতীয় প্রোগ্রামার লিখেছেন:

assert abs(-1) == 1
assert abs(0) == 0
assert abs(1) == 1

প্রথম প্রোগ্রামারের প্রয়োগের ফলস্বরূপ:

def abs(n):
    if n < 0:
        return -n
    elif n > 0:
        return n

দ্বিতীয় প্রোগ্রামারের প্রয়োগের ফলস্বরূপ:

def abs(n):
    if n < 0:
        return -n
    else:
        return n

সমস্ত পরীক্ষা পাস হয়, তবে প্রথম প্রোগ্রামার কেবলমাত্র বেশিরভাগ অনর্থক পরীক্ষা (অযথা তাদের উন্নয়ন চক্রকে ধীর করে দেয়) লিখেছেন না, তবে একটি বাউন্ডারি কেস ( abs(0)) পরীক্ষা করতেও ব্যর্থ হয়েছে ।

যদি আপনি নিজেকে টেস্টগুলি লেখেন যা উত্পাদন কোড পরিবর্তন না করে পাস করে, নিজেকে জিজ্ঞাসা করুন যে আপনার পরীক্ষাগুলি সত্যিই মূল্য যুক্ত করছে বা সমস্যার জায়গাগুলি বুঝতে আপনার আরও বেশি সময় ব্যয় করতে হবে কিনা yourself


ঠিক আছে, দ্বিতীয় প্রোগ্রামারটি পরীক্ষাগুলিতেও স্পষ্টভাবে অযত্ন ছিল, কারণ তার সহকর্মী নতুন সংজ্ঞা দিয়েছিল abs(n) = n*nএবং পাস করেছে।
ইকো

@ আইকো আপনি একদম ঠিক বলেছেন খুব কম পরীক্ষা লিখলে ঠিক তত খারাপভাবে কামড় দিতে পারে। দ্বিতীয় প্রোগ্রামারটি কমপক্ষে পরীক্ষা না করে অত্যধিক কৃপণ হয়ে পড়েছিল abs(-2)। সবকিছুর মতো, সংযম হ'ল মূল বিষয়।
চিন্তাবিদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.