ইউনিট পরীক্ষার মামলাগুলি কীভাবে লিখবেন?


14

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

সাধারণ প্রবণতা কী? বিকাশকারীরা নিজেরাই কোড লিখেছেন বলে ইউনিট পরীক্ষার মামলাগুলি লেখার কথা?


2
"বলিয়া"? "ডিন্ট" এর অর্থ কী?
এস .লট

উত্তর:


12

এই ব্লগ পোস্টটি পড়ার চেষ্টা করুন: গ্রেট ইউনিট টেস্ট রচনা: সেরা এবং সবচেয়ে খারাপ অনুশীলন

তবে ওয়েবে অগণিত অন্য রয়েছে।

আপনার প্রশ্নের সরাসরি উত্তরে ...

  1. "সাধারণ প্রবণতা" - আমি অনুমান করি যে এটি অন্য জায়গায় আলাদা হতে পারে, আমার কাছে যা স্বাভাবিক তা অন্যের পক্ষে অস্বাভাবিক হতে পারে।
  2. আমি বলব (আমার বিকল্পে) কোড লেখার বিকাশকারীকে টেডিটি লিখতে হবে, আদর্শভাবে টিডিডির মতো পদ্ধতি ব্যবহার করে, যেখানে আপনি কোডের আগে পরীক্ষাটি লিখতেন। তবে অন্যদের এখানে বিভিন্ন পদ্ধতি এবং ধারণা থাকতে পারে!

এবং আপনি পরীক্ষাগুলি লেখার বর্ণনাটি (আপনার প্রশ্নে) সম্পূর্ণ ভুল!


9

এই পদ্ধতির ইউনিট পরীক্ষা মূল্যহীন করা।

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


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

2
এছাড়াও, আমি অনুমান করি আপনি বোঝাতে চেয়েছিলেন "পরীক্ষার কোডের পরে পরীক্ষা লিখুন " আপনি কি করেছেন?
পিটার টারিক

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

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

3

যদি কোনও ফাংশন কী করে তা আপনি যদি না জানেন তবে আপনি এটির জন্য ইউনিট পরীক্ষা লিখতে পারবেন না। আপনি জানেন যে এটি এটি যা করা উচিত তা করে না। আপনাকে প্রথমে এটি করার কথাটি খুঁজে বের করতে হবে। তারপর পরীক্ষা লিখুন।


3

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

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

বলুন আপনার কাছে এমন একটি পদ্ধতি রয়েছে যা ভাসমান-পয়েন্ট সংখ্যাটির বর্গমূল গণনা করে। জাভাতে, ইন্টারফেসটি এটিকে সংজ্ঞায়িত করবে:

public double squareRoot(double number);

আপনি প্রয়োগটি লিখেছেন বা অন্য কেউ করেছেন কিনা তা বিবেচ্য নয়, আপনি স্কোয়ার রুটের কয়েকটি বৈশিষ্ট্য যুক্ত করতে চান:

  1. এটি স্কয়ার্টের মতো সাধারণ শিকড়গুলি ফিরিয়ে আনতে পারে (4.0)
  2. এটি স্কয়ার্ট (২.০) এর মতো যুক্তিসঙ্গত নির্ভুলতার মতো একটি বাস্তব শিকড় খুঁজে পেতে পারে
  3. এটি দেখতে পাবে যে স্কয়ার্ট (0.0) 0.0
  4. itণাত্মক সংখ্যা খাওয়ানোর সময় এটি একটি অবৈধ অরগমেন্ট এক্সেপশনটি ছুড়ে দেয়, যেমন স্কয়ার্ট-এ (-১.০)

সুতরাং আপনি এগুলি স্বতন্ত্র পরীক্ষা হিসাবে লিখতে শুরু করুন:

@Test
public void canFindSimpleRoot() {
  assertEquals(2, squareRoot(4), epsilon);
}

ওহো, এই পরীক্ষাটি ইতিমধ্যে ব্যর্থ হয়েছে:

java.lang.AssertionError: Use assertEquals(expected, actual, delta) to compare floating-point numbers

আপনি ভাসমান পয়েন্ট পাটিগণিত সম্পর্কে ভুলে গেছেন। ঠিক আছে, আপনি পরিচয় করিয়ে দিন double epsilon=0.01:

@Test
public void canFindSimpleRootToEpsilonPrecision() {
  assertEquals(2, squareRoot(4), epsilon);
}

এবং অন্যান্য পরীক্ষা যোগ করুন: অবশেষে

@Test
@ExpectedException(IllegalArgumentException.class)
public void throwsExceptionOnNegativeInput() {
  assertEquals(-1, squareRoot(-1), epsilon);
}

ওফ, আবার:

java.lang.AssertionError: expected:<-1.0> but was:<NaN>

আপনার পরীক্ষা করা উচিত ছিল:

@Test
public void returnsNaNOnNegativeInput() {
  assertEquals(Double.NaN, squareRoot(-1), epsilon);
}

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

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

@Test
public void throwsNoExceptionOnNegativeInput() {
  assertNotNull(squareRoot(-1)); // Shouldn't this fail?
}

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

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


1

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

আমি প্রতিটি প্রধান উপাদানগুলির জন্য এটি করার চেষ্টা করি, তবে এটি যখন সফ্টওয়্যার এবং খুব বেশি হার্ডওয়্যার না আসে তখন আপনি প্রতিটি পদ্ধতি / ফাংশন এবং সীমা এবং এই জাতীয় পরীক্ষা করতে চান check


1

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

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

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