অতিরিক্ত উপহাসের প্রয়োজনের কারণে ভঙ্গুর ইউনিট পরীক্ষা করে


21

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

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

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

স্বভাবতই সমস্যাটি কিছুটা কমিয়ে আনা যেতে পারে কেবলমাত্র আরও পদ্ধতিগুলি কম আচরণ সম্পাদন করে তবে আমি আশাবাদী যে সম্ভবত আরও একটি মার্জিত সমাধান পাওয়া যায়।

সমস্যাটি ক্যাপচার করে এখানে ইউনিট পরীক্ষা করার একটি উদাহরণ রয়েছে।

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

[TestMethod]
public void VerifyMergeStopsSpinner()
{
    var mockViewModel = new Mock<MergeTests> { CallBase = true };
    var mockMergeInfo = new MergeInfo(Mock.Of<IClaim>(), Mock.Of<IClaim>(), It.IsAny<bool>());

    mockViewModel.Setup(m => m.ClaimView).Returns(Mock.Of<IClaimView>);
    mockViewModel.Setup(
        m =>
        m.TryMergeClaims(It.IsAny<Func<bool>>(), It.IsAny<IClaim>(), It.IsAny<IClaim>(), It.IsAny<bool>(),
                         It.IsAny<bool>()));
    mockViewModel.Setup(m => m.GetSourceClaimAndTargetClaimByMergeState(It.IsAny<MergeState>())).Returns(mockMergeInfo);
    mockViewModel.Setup(m => m.SwitchToOverviewTab());
    mockViewModel.Setup(m => m.IncrementSaveRequiredNotification());
    mockViewModel.Setup(m => m.OnValidateAndSaveAll(It.IsAny<object>()));
    mockViewModel.Setup(m => m.ProcessPendingActions(It.IsAny<string>()));

    mockViewModel.Object.OnMerge(It.IsAny<MergeState>());    

    mockViewModel.Verify(mvm => mvm.StopSpinner(), Times.Once());
}

আপনারা বাকিরা কীভাবে এটি মোকাবেলা করেছেন বা এটিকে পরিচালনা করার দুর্দান্ত কোনও 'সহজ' উপায় নেই?

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


বাহ, আমি কেবল মক সেটআপ দেখছি, কোনও এসইটি ইনস্ট্যান্টেশন বা কোনও কিছুই নেই, আপনি কি এখানে কোনও বাস্তব বাস্তবায়ন পরীক্ষা করছেন? স্টপস্পিনার কে কল করার কথা? OnMerge? আপনার যে কোনও নির্ভরতা যা কল করতে পারে তা উপহাস করা উচিত তবে জিনিসটি নিজেই নয় ..
জোপ্প

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

মার্জ টেস্টগুলি অন্য চালিত শ্রেণির মতো শোনাচ্ছে, এমন কিছু নয় যা উত্পাদনে বেঁচে থাকে তাই বিভ্রান্তি।
জোপ্পে


1
আপনার অন্যান্য সমস্যাগুলি সম্পূর্ণরূপে একপাশে রেখে, আমার কাছে এটি ভুল বলে মনে হচ্ছে যে আপনার এসইটি একটি মক <মর্জ টেস্টস>। আপনি একটি মক কেন পরীক্ষা করবেন? আপনি কেন মার্জ টেস্ট ক্লাস নিজেই পরীক্ষা করছেন না?
এরিক কিং

উত্তর:


18
  1. কোডটি আরও ভালভাবে ডিজাইন করার জন্য ঠিক করুন। যদি আপনার পরীক্ষাগুলিতে এই সমস্যাগুলি থাকে, আপনি যখন জিনিস পরিবর্তন করার চেষ্টা করবেন তখন আপনার কোডে আরও খারাপ সমস্যা হবে।

  2. যদি আপনি না পারেন তবে সম্ভবত আপনার পক্ষে কম আদর্শ হওয়া দরকার। পদ্ধতির প্রাক এবং পরবর্তী অবস্থার বিরুদ্ধে পরীক্ষা করা। আপনি অন্যান্য 5 টি পদ্ধতি ব্যবহার করছেন তবে কে যত্ন করে? তাদের সম্ভবত নিজস্ব ইউনিট পরীক্ষা রয়েছে যা এটি পরিষ্কার করে দিয়েছে (পরীক্ষা) পরীক্ষাগুলি ব্যর্থ হওয়ার পরে কী কারণে ব্যর্থ হয়েছিল।

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


আমি কোডটির নকশা ঠিক করার সাথে সম্পূর্ণরূপে একমত, তবে একটি বৃহত সংস্থার পক্ষে শক্ত টাইমলাইনের সাথে বিকাশের কম আদর্শ বিশ্বে অতীতের দলগুলির দ্বারা গৃহীত প্রযুক্তিগত debtণ বা 'দুর্বল সিদ্ধান্ত' সমস্ত ক্ষেত্রেই 'পরিশোধ' করার ক্ষেত্রে মামলা করা কঠিন হতে পারে একদা. আপনার দ্বিতীয় বক্তব্যটির জন্য মশকরা বেশিরভাগ ক্ষেত্রে কেবল এই নয় যে আমরা পরীক্ষাটি কেবলমাত্র একটি কারণে ব্যর্থ করে দিতে পারি - এটি কারণ কোডটি কার্যকর করা হচ্ছে কারণ কোডটির অভ্যন্তরে প্রচুর পরিমাণে নির্ভরশীলতা তৈরি না করেই মৃত্যুদণ্ড কার্যকর করা যায় না because । লক্ষ্য পোস্টগুলি সরানোর জন্য দুঃখিত।
প্রিমিয়ামটিয়ার

যদি আরও ভাল নকশা বাস্তবসম্মত না হয় তবে আমি 'আপনি অন্য 5 টি পদ্ধতি ব্যবহার করছেন তবে কে যত্ন করে?' পদ্ধতিটি প্রয়োজনীয় ফাংশন সম্পাদন করে যাচাই করুন, এটি এটি কীভাবে করছে না।
কুয়েবল

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

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

8

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

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

তবে আমি নোট করি যে এটি আমার পক্ষে এক প্রবাদ is যে ব্যক্তিরা ইউনিট টেস্টিংয়ে ভারী হয়ে থাকে তারা "খাঁটি" ইউনিট পরীক্ষার পক্ষে এবং আমি যা "ইন্টিগ্রেশন টেস্ট" বর্ণনা করেছি তাকে কল করে। আমি ব্যক্তিগতভাবে এই পার্থক্য সম্পর্কে চিন্তা করবেন না।


3

আমি উপহাসগুলি শিথিল করার বিষয়ে বিবেচনা করব এবং কেবল পরীক্ষাগুলি প্রণয়ন করব যাতে এটি কল করার পদ্ধতিগুলি অন্তর্ভুক্ত থাকতে পারে।

পরীক্ষা না কিভাবে , পরীক্ষা কি । এটির ফলস্বরূপ, প্রয়োজনে সাব-পদ্ধতিগুলি অন্তর্ভুক্ত করুন।

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

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


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

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

হ্যাঁ :( যে দুর্বল ডিজাইন উত্তরাধিকার কোড আমি উল্লেখ ছিল হবে আমরা পুনরায় নকশা এবং refactor কাজ করছি কিন্তু আমরা অনুভূত এটি প্রথম পরীক্ষা অধীনে উৎস লাগাতে সেরা হতে হবে।।
PremiumTier
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.