পুনরায় ডিজাইন করার সময় আপনি কীভাবে দক্ষতার সাথে আপনার পরীক্ষাগুলি চালিয়ে যেতে পারেন?


14

একটি ভাল-পরীক্ষিত কোডবেস বেশ কয়েকটি সুবিধা রয়েছে, তবে সিস্টেমের কয়েকটি দিকের পরীক্ষার ফলে একটি কোডবেস আসে যা কিছু ধরণের পরিবর্তনের বিরুদ্ধে প্রতিরোধী হয়।

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

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

  • আপনি এই পরীক্ষাগুলি সন্ধান এবং পুনর্লিখনের কাজটি কীভাবে পরিচালনা করবেন? আপনি যদি কেবল তাদের সমস্ত "চালাতে" না পারেন এবং ফ্রেমওয়ার্কটি তাদের সাজানোর জন্য দিতে পারেন তবে কী হবে?

  • অভ্যাসগতভাবে ভঙ্গুর পরীক্ষায় কোড-আন্ডার-পরীক্ষার ফলস্বরূপ অন্য কোন ধরণের?


এটি কীভাবে প্রোগ্রামারদের থেকে আলাদা ? স্ট্যাককেক্সচেঞ্জ / প্রশ্নগুলি / ৫৮৮৮/২ ?
এশেলি

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

উত্তর:


9

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

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

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

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

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


আমি মনে করি আপনি "অ্যাপ্লিকেশনের বাইরে" নয়, "মডিউলটির বাইরে" লিখতে চেয়েছিলেন।
স্যামবি

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

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

4

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

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

আমি যা করেছি তা এখানে:

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

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

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


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

3

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

আপনি পারেন:

  • এটি আসলে চলছে কিনা তা নিশ্চিত করতে এইচটিএমএলকে ধোঁয়া পরীক্ষা হিসাবে উত্পন্ন করুন
  • একটি টেম্পলেট সিস্টেম ব্যবহার করুন, যাতে আপনি টেম্পলেটটিতে প্রেরণকারী টেমপ্লেট প্রসেসর এবং ডেটা পরীক্ষা করতে পারেন, প্রকৃতপক্ষে সঠিক টেম্পলেটটি পরীক্ষা না করেই।

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


এটি স্ট্রাকচারাল এইচটিএমএল ব্যবহার করতেও সহায়তা করতে পারে।
স্যামবি

@ সাম্ব অবশ্যই এটি সাহায্য করবে, তবে আমি মনে করি না যে এটি সমস্যার সম্পূর্ণ সমাধান করবে
উইনস্টন ইওয়ার্ট

অবশ্যই না, কিছুই করতে পারে না :-)
স্যামবি

-1

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

int DoSomethingInterestingAPI ();

হয়ে:

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

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

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

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

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

https://github.com/SophistSolutions/Stroika/commit/003dd8707405c43e735ca71116c773b108c217c0

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

তারপরে - যখন এই রূপান্তরটি সম্পন্ন হয়, আমি বিটসবস্ট্রিং () মুছে ফেলার এবং বিটসবস্ট্রিং_নাইউ-> বিটসবস্ট্রিং () নাম পরিবর্তন করে (এবং বিটসবস্ট্রিং_নউ নামটি বাতিল করে) আরও একটি প্রতিশ্রুতিবদ্ধ করেছি।


কখনও অর্থ যুক্ত নয় বা নামগুলিতে আত্ম-হ্রাসকারী প্রত্যয় যুক্ত করবেন না। সর্বদা অর্থপূর্ণ নাম দেওয়ার চেষ্টা করুন।
বেসিলিভ

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

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