ইউনিট টেস্ট লেখার আগে কোড লেখার অসুবিধাগুলি কী কী?


33

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

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


7
কোনও নির্দিষ্ট অনুশীলনকে গ্রহণ করার আগে কেন এটি একটি "সেরা অনুশীলন" তা জিজ্ঞাসা করার জন্য +1
টেলরঅটওয়েল

উত্তর:


37

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

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


+1 - দুর্দান্ত পয়েন্ট এবং পয়েন্ট নেওয়া! আপনার মতামতের জন্য ধন্যবাদ!
k25

7
পরীক্ষা! = প্রয়োজনীয়তা। পরীক্ষা এবং কোড উভয়ই প্রয়োজনীয়তা থেকে নেওয়া উচিত ।
বার্ট ভ্যান ইনজেন শেনৌ

2
@ বার্ট ভ্যান ইনজেন শেহানাউ: টিডিডির শক্তি হ'ল যথাযথভাবে যা প্রয়োজনের পরীক্ষা করে। তদতিরিক্ত, এগুলি সম্পাদনযোগ্য প্রয়োজনীয়তা।
mouviciel

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

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

18

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

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


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

2
কিন্তু পরীক্ষা যদি পাস হয়? পরীক্ষাটি পাস হতে পারে কারণ এটি আসলে আগ্রহের কোডটি ব্যবহার করে না; এটি টিডিডি-র অধীনে সত্যিই ঘটতে পারে না, কারণ পরীক্ষাটি প্রাথমিকভাবে ব্যর্থ হওয়ার কথা, এবং যদি হয় - এটি না হয়, আপনি এটি স্থির না করা পর্যন্ত আপনি পদক্ষেপ 2 এ যাবেন না। সুতরাং পরীক্ষায় একটি ব্যর্থতা মোড আছে যা পরীক্ষার আগে উপস্থিত হয় না।
কার্ল ম্যানাস্টার

@ কার্ল ম্যানাস্টার - হ্যাঁ, আপনার কাছে একটি বৈধ পয়েন্ট রয়েছে। আমি কোডটি লেখার পরে, প্রয়োজনীয়তা সম্পর্কে আমি পুরোপুরি সচেতন এবং তাই আমার ইউনিট পরীক্ষার কেসটি সঠিক (আদর্শভাবে) হবে। যদি আমার পরীক্ষার কেস পাস হয় তবে আমি বলব কোডটি সঠিক, যদি পরীক্ষা ব্যর্থ হয় তবে আমি যা বলেছিলাম তা অনুসরণ করব। তবে, আমি 100% সম্মত হই যে আপনার সেখানে একটি বৈধ পয়েন্ট রয়েছে।
k25

@ কে 25: মুল বক্তব্যটি হ'ল যদি আপনার পরীক্ষার কেসটি পাস হয় তবে আপনি কোডটি সঠিক কিনা তা এখনও জানেন না। পরীক্ষার কেসটি ভুল হতে পারে।
আনন

@Anon। - হ্যাঁ আপনি ঠিক বলেছেন, আমি এই কেসটিও আমলে নেব।
k25

12

প্রকৃতপক্ষে, লোকেরা টিডিডিতে ঝুলিয়ে রাখে তা পরীক্ষার বিষয়ে, যদিও তারা সংক্ষিপ্ত আকারে অন্য দুটি অক্ষর ভুলে যায়। এখানে যা কিছু পড়তে পারে: টি বা টিডিডি ছাড়া টিডিডি পরীক্ষার বিষয়ে নয়

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

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

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

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

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


1
যখন আপনি সফ্টওয়্যার ডিজাইনের কথা ভাবেন তখন সলিডের জন্য +1 স্বাভাবিকভাবেই আপনার কাছে ঘটে।
ocodo

+1 (আসলে আমি +10 দিতে চেয়েছিলাম তবে আমি দিতে পারি না)। ঠিক আমার চিন্তা - আপনি পয়েন্ট তালিকা খুব ভাল ছিল। আমি এই প্রশ্ন জিজ্ঞাসা করার এক কারণ। আমি অনুভব করেছি ক্লাসগুলি আরও বেশি হয়ে গেছে যখন আমি কোডটি লেখার পরে ইউনিট পরীক্ষা লিখতে শুরু করি। তবে আমি উভয় পক্ষের সুবিধা / অসুবিধাগুলি দেখতে চেয়েছিলাম, আপনার মতামতের জন্য ধন্যবাদ!
k25

10

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


4

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

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


প্রথম পয়েন্টের জন্য +1। তবে, প্যারামিটার স্তরে না পৌঁছে, যদি অন্যের সাথে নকশাটি নিয়ে আলোচনা করা হয় এবং তা গ্রহণ করা হয় তবে কী হবে?
k25

@ কে 25 - যদি ডিজাইন হিসাবে কিছু ব্যবহার করা শক্ত হয় তবে এর জন্য আরও চিন্তাভাবনা করা দরকার। কখনও কখনও - খুব কমই - এটি কেবল একটি কঠিন কাজ। তবে প্রায়শই এটি সহজ কাজগুলিতে হ্রাস করা যায়। আমার কোনও লিঙ্ক নেই, তবে গোসলিং বা গোয়েটস কয়েক বছর আগে এপিআই ডিজাইন সম্পর্কে একটি সাক্ষাত্কার করেছিলেন ... গুগলিংয়ের পক্ষে মূল্যবান।
আনন

নিশ্চিত, ধন্যবাদ পয়েন্টার জন্য, আমি অবশ্যই তাদের চেহারা হবে ...
k25

2

পরীক্ষাগুলি লিখতে এবং তারপরে কোডিংয়ে এগিয়ে যাওয়ার জন্য আমি প্রচুর প্রস্তাবনা দেখতে পাচ্ছি,

এর আসল ভাল কারণ আছে।

যদি আপনি "যা ঠিক মনে করেন তা করুন" বললে লোকেরা মূর্খ, ক্রেজিস্ট কাজগুলি করে।

আপনি যদি "প্রথমে পরীক্ষা লিখুন" বলে থাকেন, লোকেরা কমপক্ষে সঠিক জিনিসটি করার চেষ্টা করতে পারে।

অসুবিধাগুলি যদি আমি অন্যভাবে এটি করি - কোড লিখুন এবং তারপরে ইউনিট পরীক্ষা করুন?

সাধারণত, একটি লম্পট পরীক্ষা এবং একটি ডিজাইন যা পরীক্ষার জন্য পুনরায় কাজ করতে হয়।

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

"টেস্ট ফার্স্ট" বিধিটি বিশেষত এমন লোকদের শেখানোর এবং তাদের নির্দেশ দেওয়ার জন্য যাঁদের মোটেই কোনও ক্লু নেই।

একইভাবে, রাস্তায় পারাপারের আগে "উভয় উপায়ে" দেখতে সর্বদা আমাদের বলা হয়। তবে, আমরা আসলে তা করি না। এবং এটা কোন ব্যাপার না। আমি ডানহাতি ড্রাইভের দেশে বাস করি এবং ক্রস শুরু করার সময় আমাকে কেবল বাম দিকে তাকানো দরকার।

আমি যখন বাম-হাতের ড্রাইভের দেশে যাই, কেবল বাম দিকে তাকাই আমাকে হত্যা করতে পারে।

বিধিগুলি একটি কারণের জন্য খুব দৃ strongly়ভাবে বলা হয়েছে।

আপনি যা করেন তা আপনার নিজের সমস্যা।


2

প্রথমে পরীক্ষা লেখার বিষয়টি আপনাকে ভাবতে বাধ্য করে

  • কিভাবে কোড পরীক্ষা করতে হয়
  • ইন্টারফেস কোড টেস্টযোগ্য হতে হবে

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

তবে টিডিডি কেবল ইউনিট পরীক্ষাগুলি নয়, গ্রহণযোগ্যতা পরীক্ষায় স্কেল করে এবং তারপরে ইন্টারফেসটি তুচ্ছ-তুচ্ছ হয়ে যায়।


1

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

  1. পরীক্ষার একটি সুরক্ষার জাল - আপনাকে অজান্তে কিছু ভাঙার ভয় ছাড়াই বড় পরিবর্তন করতে দেয়
  2. জৈবিক নকশা - আমি যে নকশাটি শেষ করি তা সাধারণত আলাদা হয় যে নকশটি আমি স্ক্র্যাচ থেকে করতাম এবং এটি সর্বদা ভাল ছিল
  3. উত্পাদনশীলতা - ছোট লক্ষ্যের দিকে কাজ করা (এটি একটি পরীক্ষা পাস করুন) এবং এটি করা (সমস্ত পরীক্ষাগুলি পাস) আমার পক্ষে সত্যই ভাল কাজ করে এবং আমাকে অনুপ্রাণিত করে। একটি জুড়িতে যুক্ত করুন এবং আমার উত্পাদনশীলতা নতুন উচ্চতায় পৌঁছেছে।

বই: বেক, কে। উদাহরণ দ্বারা টেস্ট-চালিত বিকাশ

ভাল উদাহরণ: http://jamesshore.com/Blog/Lets-Play/


+1 - দুর্দান্ত পয়েন্টগুলি (বিশেষত 1 ম) এবং লিঙ্কগুলির জন্য ধন্যবাদ!
k25

0

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

প্রথমে কোড লেখা এবং তারপরে পরীক্ষার পাতাগুলি পরীক্ষাটি সৎ ব্যর্থতা প্রদর্শন করবে কিনা এই প্রশ্নটি উন্মুক্ত করে।

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

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