মক অবজেক্টগুলি কীভাবে সাধারণত ব্যবহৃত হয়?


15

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


আপনি এই নিবন্ধটি পড়েন? martinfowler.com/articles/mocksArentStubs.html
কেপলা

না ... সঠিক উত্সটি মনে করতে পারে না তবে আমি যদি পোস্ট করি তবে এখানে পোস্ট করব
আরমান্ড

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

উত্তর:


13

সাধারণ কংক্রিটের ক্লাসগুলি উপহাস করা দেখে আমি ঘৃণা করি। উদাহরণস্বরূপ নিম্নলিখিত সাধারণ ক্লাসটি গ্রহণ করুন যার অন্য কোনও কিছুর উপর নির্ভরশীলতা নেই:

public class Person
{
    private readonly string _firstName;
    private readonly string _surname;

    public Person(string firstName, string surname)
    {
        if (String.IsNullOrEmpty(firstName))
        {
            throw new ArgumentException("Must have first name");
        }

        if (String.IsNullOrEmpty(surname))
        {
            throw new ArgumentException("Must have a surname");
        }

        _firstName = firstName;
        _surname = surname;
    }

    public string Name 
    {
        get
        {
            return _firstName + " " + _surname;
        }
    }
}

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

এটির এক্সটেনশন হিসাবে আমি লোককে পরীক্ষাগুলি লিখতে দেখেছি যেখানে মক একটি প্রত্যাশা নিয়ে সেট আপ করা হয়, তারপরে মোকটিকে সরাসরি পরীক্ষায় ডাকা হয়। নিঃসন্দেহে পরীক্ষা সর্বদা পাস হবে ... হুম মিমি ...


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

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

আমার থাম্বের নিয়মটি সর্বদা আচরণের জন্য উপহাস করা হয়েছে, ডেটা নয়।
আরদভে

10

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


14
আমি আশা করি আপনি আপনার পবিত্র দায়িত্ব পালন করেছেন এবং কোডটি ডেইলিডব্লিউটিএফ-এ জমা দিয়েছেন?
কেপলা

1
আমার আগের কাজগুলিতে আমাদের কোডবেস থেকে ডিডাব্লুটিএফ-তে কিছু জমা দেওয়ার বিষয়ে আমাদের স্পষ্টভাবে নিষেধ করা হয়েছিল।
কোয়ান্ট_দেব

9
@ কোয়ান্ট_দেব: তাদের এ জাতীয় নীতি থাকার বিষয়টি তাদের বিকাশকারীদের সম্পর্কে ভীতিজনক বিষয়গুলি বোঝায় ...
জন ফিশার

1
আসলে তা না. এটি একটি স্টার্টআপ ছিল যা কোনও পণ্য বিক্রির জন্য দ্রুত একটি কোডবেস বিকাশ করতে হয়েছিল এবং প্রযুক্তিগত payণ পরিশোধের জন্য এটি একত্রীকরণ এবং পুনরায় সজ্জিত করা শুরু করে, কারণ পণ্যটি পরিপক্ক হয় এবং প্রাথমিক বিকাশের (অভাবের) ফলে আরও উন্নয়ন বাধাগ্রস্ত হয়। পরিচালকগণ জানতেন যে পুরানো কোডবেসটি ছিঁটে, এবং সময় এবং সংস্থানগুলি রিফ্যাক্টরিংয়ে বিনিয়োগ করেছিল, তবে কোনও প্রতিকূল প্রচারকে ঝুঁকি দিতে চায়নি।
কোয়ান্ট_দেব

কেবলমাত্র শর্টকাট নেওয়া কেবলমাত্র আপনার প্রতিদিনের জন্য যথেষ্ট নয় ...
পুলি

9

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

এর একটি সমাধান মকগুলির পরিবর্তে স্টাবগুলি ব্যবহার শুরু করছে। এই প্রবন্ধটি সম্পর্কে আমি বিশেষভাবে আলোকিত করেছিলাম এমন একটি নিবন্ধ মকিতোর জাভাডোকের একটিতে পাওয়া গেছে: http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html (দেখুন "২. কীভাবে কিছু হতবাক?" ), এর সাথে লিঙ্ক করুন: http://monkeyisland.pl/2008/07/12/should-i-wારી-about-the- अनपेक्षित /

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

এখানে কয়েকটি বই রয়েছে এবং আমি সুপারিশ করতে পারি যে এই বিষয়টিকে স্পর্শ করুন এবং মশকরা এবং সাধারণ:

xUnit প্যাটার্নস

আর্ট অফ ইউনিট টেস্টিং: উদাহরণস্বরূপ নেট

নেক্সট জেনারেশন জাভা টেস্টিং: টেস্টএনজি এবং অ্যাডভান্সড কনসেপ্টস (এই বইটি বেশিরভাগই টেস্টএনজি সম্পর্কিত তবে উপহাস সম্পর্কে একটি সুন্দর অধ্যায় রয়েছে)


অতিরিক্ত পদ্ধতি আমন্ত্রণ চেকের পয়েন্টের জন্য +1। যাইহোক, মুদ্রার প্রায়শই ফ্লিপ সাইড থাকে যেখানে অপ্রত্যাশিত পদ্ধতির প্রার্থনা আপনার পদ্ধতিতে ব্যর্থতার কারণ হয়। শুকরিয়া মকিতোতে মকগুলির Answer.RETURNS_SMART_NULLSজন্য সেটিংস রয়েছে যা এটি সনাক্ত করতে সহায়তা করে।
ব্রিঞ্জার 128

4

আমি আমার অভিজ্ঞতায় কয়েকটি অ্যান্টি-প্যাটার্ন পর্যবেক্ষণ করেছি।

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

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


2 এবং 3 অবশ্যই সমস্যা! আপনি (1) এর একটি সাধারণ উদাহরণ পেয়েছেন?
আরমান্ড

2

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

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

সম্প্রতি এ সম্পর্কে আমার দৃ opinions় মতামত নরম হয়ে উঠেছে কারণ মশকরা এপিআই এর পরীক্ষাগুলি তৈরি করেছে যা তাদের আরও পঠনযোগ্য করে তোলে। মূলত আমি চাই যে আমার কোডটি (পরীক্ষাসহ) অন্য বিকাশকারীদের যাতে তারা অস্পষ্ট এপিআই কলগুলির ঝাঁকুনির মধ্য দিয়ে চলেছে এমন মনে না করে পরিবর্তনযোগ্য হয়।

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