রিফ্যাক্টরিংয়ের সময় আপনি কীভাবে আপনার ইউনিট পরীক্ষাগুলি কার্যকর রাখবেন?


29

অন্য একটি প্রশ্নে, এটি প্রকাশিত হয়েছিল যে টিডিডি-র সাথে একটি ব্যথা টেস্টিং স্যুটটি রিফ্যাক্টরিংয়ের সময় এবং পরে কোডবেজের সাথে সুসংগত রাখছে।

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

রিফ্যাক্টরিংয়ের সময় আপনি কীভাবে ব্রেকিং পরীক্ষা এড়াতে পারবেন?

  • আপনি পরীক্ষা 'আরও ভাল' লিখবেন? যদি তা হয় তবে আপনার কী সন্ধান করা উচিত?
  • আপনি কি নির্দিষ্ট ধরণের রিফ্যাক্টরিং এড়াতে চান?
  • টেস্ট-রিফ্যাক্টরিং সরঞ্জাম আছে?

সম্পাদনা: আমি একটি নতুন প্রশ্ন লিখেছিলাম যা আমাকে জিজ্ঞাসা করার অর্থ কী তা জিজ্ঞাসা করেছিল (তবে এটি একটি আকর্ষণীয় রূপ হিসাবে রেখেছিল)।


7
আমি ভেবেছিলাম টিডিডি দিয়ে আপনার রিফ্যাক্টরিংয়ের প্রথম পদক্ষেপটি ব্যর্থ হয় এমন একটি পরীক্ষা লিখতে হবে এবং তারপরে কোডটি কাজ করতে রেফেক্টর করে।
ম্যাট এলেন

আপনার আইডিই কীভাবে পরীক্ষাগুলিও রিফেক্টর করতে পারে তা বুঝতে পারে না?

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

এই প্রশ্নে থার তথ্য যুক্ত করা গণ্য?

উত্তর:


35

আপনি যা করার চেষ্টা করছেন তা আসলে রিফ্যাক্টরিং নয়। Refactoring সঙ্গে, সংজ্ঞা দ্বারা, আপনি পরিবর্তন করবেন না কি আপনার সফ্টওয়্যার করে, আপনি পরিবর্তন কিভাবে এটি এটা আছে।

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

আপনি যা বর্ণনা করছেন তা রিফ্যাক্টরিং নয়, তবে এটি একটি নতুন নকশা যা পরীক্ষার অধীনে আপনার সফ্টওয়্যারটির কার্যকারিতা বৃদ্ধি করে ug টিডিডি এবং রিফ্যাক্টরিং (যেমন আমি এখানে এটি সংজ্ঞায়িত করার চেষ্টা করেছি) কোনও বিরোধের মধ্যে নেই। আপনি এখনও "ডেল্টা" কার্যকারিতা বিকাশের জন্য টিডিডি (লাল-সবুজ) রিফ্যাক্টর (সবুজ-সবুজ) করতে পারেন।


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

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

3
@ কেভিন: আমি বিশ্বাস করি আপনি যা বর্ণনা করেছেন তা পুনরায় নকশা, কারণ পাবলিক ইন্টারফেস পরিবর্তিত হয়। ফিউলারের সংশোধনকারী সংজ্ঞা ("[কোডের] অভ্যন্তরীণ কাঠামোর বাহ্যিক আচরণ পরিবর্তন না করে পরিবর্তন করা") সে সম্পর্কে যথেষ্ট স্পষ্ট।
আজহেগ্লোভ

3
@ আজেগ্লোভ: সম্ভবত তবে আমার অভিজ্ঞতা যদি বাস্তবায়ন খারাপ হয় তবে ইন্টারফেসও রয়েছে
কেভিন

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

21

ইউনিট পরীক্ষা করানোর অন্যতম সুবিধা হ'ল আপনি আত্মবিশ্বাসের সাথে অবাধ্যতা করতে পারেন।

যদি রিফ্যাক্টরিং পাবলিক ইন্টারফেস পরিবর্তন না করে তবে আপনি ইউনিট পরীক্ষাটি যেমন করেন ততক্ষণ এবং নিশ্চিত হন যে তারা সমস্ত পাস করেছে oring

যদি রিফ্যাক্টরিং পাবলিক ইন্টারফেস পরিবর্তন করে তবে পরীক্ষাগুলি প্রথমে নতুন করে লিখতে হবে। নতুন পরীক্ষা পাস না হওয়া পর্যন্ত রিফ্যাক্টর।

আমি কখনই কোনও রিফ্যাক্টরিং এড়াতে পারব না কারণ এটি পরীক্ষাগুলি ভঙ্গ করে। রাইটিং ইউনিট পরীক্ষাগুলি একটি বাটে ব্যথা হতে পারে তবে এটি দীর্ঘকালীন ব্যথার পক্ষে মূল্যবান।


7

অন্যান্য উত্তরের বিপরীতে, এটি লক্ষ করা গুরুত্বপূর্ণ যে পরীক্ষার অধীনে থাকা সিস্টেমটি (এসইউটি) রিফ্যাক্টর হলে পরীক্ষার কিছু উপায় ভঙ্গুর হয়ে যেতে পারে, যদি পরীক্ষা হোয়াইটবক্স হয়।

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

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

পরীক্ষিত-নির্দিষ্ট-সাবক্লাসগুলি সুরক্ষিত পদ্ধতিগুলি পরীক্ষা করতেও ব্যবহার করা যেতে পারে - যার অর্থ হতে পারে যে উত্পাদন কোডের দৃষ্টিকোণ থেকে একটি রিফ্যাক্টর টেস্ট কোডের দৃষ্টিকোণ থেকে একটি ব্রেকিং পরিবর্তন। একটি সুরক্ষিত পদ্ধতিতে বা বাইরে কয়েকটি লাইন সরানো কোনও উত্পাদন পার্শ্ব প্রতিক্রিয়া থাকতে পারে, তবে একটি পরীক্ষা বিরতি।

আমি যদি " টেস্ট হুক " বা অন্য কোনও পরীক্ষা-নির্দিষ্ট বা শর্তসাপেক্ষ সংকলন কোড ব্যবহার করি তবে অভ্যন্তরীণ যুক্তির উপর ভঙ্গুর নির্ভরতার কারণে পরীক্ষাগুলি যাতে ভেঙে না যায় তা নিশ্চিত করা শক্ত হতে পারে।

সুতরাং পরীক্ষাগুলি এসইউটির অন্তরঙ্গ অভ্যন্তরীণ বিবরণে মিলিত হওয়া থেকে রোধ করতে এটি সহায়তা করতে পারে:

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

উপরোক্ত সমস্ত পয়েন্ট হ'ল পরীক্ষায় ব্যবহৃত সাদা বাক্সের মিলনের উদাহরণ। সুতরাং ব্রেকিং টেস্টগুলি সম্পূর্ণরূপে এড়াতে, এসইউটির ব্ল্যাক-বক্স টেস্টিং ব্যবহার করুন।

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

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

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

[...]

বাস্তবায়নের সাথে মিলিত হওয়াও রিফ্যাক্টরিংয়ে হস্তক্ষেপ করে, যেহেতু বাস্তবায়নের পরিবর্তনগুলি ক্লাসিক পরীক্ষার চেয়ে পরীক্ষাগুলি ভাঙ্গার সম্ভাবনা বেশি।

ফাউলার - মকস স্টাব নয়


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

5

আপনি যখন রিফ্যাক্টর করার সময় যদি আপনার পরীক্ষাগুলি ভঙ্গ করে, তবে আপনি সংজ্ঞা অনুসারে, রিফ্যাক্টরিং নন যা "আপনার প্রোগ্রামের আচরণ পরিবর্তন না করেই আপনার প্রোগ্রামের কাঠামো পরিবর্তন করছে"।

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


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

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

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

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

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

4

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

>  Keep the API the same, but change how the API is implemented internally
>  Change the API

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

তবে এটি বেশ সুস্পষ্ট। সুতরাং আপনি সম্ভবত রিফ্যাক্টরিং বলতে বোঝাতে চাইছেন যে আপনি এপিআই পরিবর্তন করছেন।

সুতরাং আমাকে যে কিভাবে যোগাযোগ করতে উত্তর দিন!

  • প্রথমে একটি নতুন এপিআই তৈরি করুন, এটিই আপনার নতুন এপিআই আচরণটি চান does যদি এটি ঘটে থাকে যে এই নতুন এপিআইটির ওল্ড এপিআইয়ের মতো একই নাম রয়েছে, তবে আমি _NEW নামটি নতুন এপিআই নামের সাথে যুক্ত করব।

    int DoSomethingInterestingAPI ();

হয়ে:

int DoSomethingInterestingAPI_NEW( int takes_more_arguments );
int DoSomethingInterestingAPI_OLD();
int DoSomethingInterestingAPI() { DoSomethingInterestingAPI_NEW (whatever_default_mimics_the_old_API);

ঠিক আছে - এই পর্যায়ে - আপনার সমস্ত রিগ্রেশন টেস্ট সিল পাস - ডোসোমিংথিং ইন্টারেস্টিংএপিআই () নামটি ব্যবহার করে।

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

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

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


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

1

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

আপনি যদি ইউনিট পরীক্ষা করতে চান যা প্রতিটি এবং প্রতিটি পদ্ধতির পরীক্ষা করে থাকে, তবে একই সাথে সেগুলি রিফ্যাক্টর করতে হবে বলে আশা করুন।


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

1

রিফ্যাক্টরিংয়ের সময় এবং পরে কোডবেসের সাথে সিঙ্কে টেস্টিং স্যুটটি রাখা

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

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

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


0

আপনার পরীক্ষাগুলি প্রয়োগের সাথে খুব দৃ coup়ভাবে মিলিত হয় এবং প্রয়োজনীয়তাও নয়।

আপনার মতামত দিয়ে এই পরীক্ষা লিখতে বিবেচনা করুন:

//given something
...test code...
//and something else
...test code...
//when something happens
...test code...
//then the state should be...
...test code...

এইভাবে আপনি পরীক্ষার বাইরে অর্থটিকে অকার্যকর করতে পারবেন না।

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