একটি বেসরকারী পদ্ধতিটিকে ইউনিট পরীক্ষার জন্য সর্বজনীন করা হচ্ছে ... ভাল ধারণা?


301

মডারেটর দ্রষ্টব্য: ইতিমধ্যে এখানে 39 টি পোস্ট পোস্ট হয়েছে (কিছু মুছে ফেলা হয়েছে)। আপনার উত্তর পোস্ট করার আগে, আপনি আলোচনায় অর্থবহ কিছু যুক্ত করতে পারেন কিনা তা বিবেচনা করুন। আপনি সম্ভবত অন্য কেউ ইতিমধ্যে যা বলেছেন তা পুনরাবৃত্তি করছেন।


আমি মাঝেমধ্যে নিজেকে শ্রেণীর জনসাধারণের জন্য একটি বেসরকারী পদ্ধতি তৈরি করার প্রয়োজন মনে করি কেবল এটির জন্য কয়েকটি ইউনিট পরীক্ষা লিখতে।

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

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

হালনাগাদ

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

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


2
"একটি সমর্থন সরঞ্জামকে সমর্থন করার জন্য একটি সিস্টেম পরিবর্তন করা যদি আপনি চান তবে এটি নির্লজ্জ খারাপ অভ্যাস"। ভাল, হ্যাঁ, সাজান। কিন্তু OTOH আপনার সিস্টেম প্রতিষ্ঠিত সরঞ্জামগুলির সাথে ভাল কাজ করে না যদি, হয়তো কিছু হয় সিস্টেমের সাথে ভুল।
থিলো


1
কোনও উত্তর নয়, তবে আপনি সর্বদা এগুলি প্রতিবিম্ব দ্বারা অ্যাক্সেস করতে পারেন।
জ্যানো

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

4
হ্যাঁ, তাই ইউনিট পরীক্ষাগুলি থেকে এটিকে অ্যাক্সেসযোগ্য করার জন্য কোনও পদ্ধতি প্যাকেজ-প্রাইভেট (ডিফল্ট) দৃশ্যমানতা দেওয়া পুরোপুরি গ্রহণযোগ্য। এমনকি পেয়ারার মতো গ্রন্থাগারগুলি এমনকি এ @VisibileForTestingজাতীয় পদ্ধতিগুলি তৈরি করার জন্য একটি টীকা সরবরাহ করে - আমি আপনাকে এটি করার পরামর্শ দিচ্ছি যাতে পদ্ধতিটি privateসঠিকভাবে নথির কারণ নয় ।
বরিস স্পাইডার

উত্তর:


186

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

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

উদাহরণস্বরূপ, এই সিডো কোডটি বিবেচনা করুন:

public class NavigationTest {
    private Navigation nav;

    @Before
    public void setUp() {
        // Set up nav so the order is page1->page2->page3 and
        // we've moved back to page2
        nav = ...;
    }

    @Test
    public void testFirst() {
        nav.first();

        assertEquals("page1", nav.getPage());

        nav.next();
        assertEquals("page2", nav.getPage());

        nav.next();
        assertEquals("page3", nav.getPage());
    }

    @Test
    public void testLast() {
        nav.last();

        assertEquals("page3", nav.getPage());

        nav.previous();
        assertEquals("page2", nav.getPage());

        nav.previous();
        assertEquals("page1", nav.getPage());
    }
}

8
আমি আপনার উত্তরের সাথে সম্পূর্ণ একমত অনেক বিকাশকারী ডিফল্ট অ্যাক্সেস সংশোধক ব্যবহার করতে প্ররোচিত হবে এবং ন্যায়সঙ্গতভাবে প্রমাণ করতে পারে যে ভাল ওপেন সোর্স ফ্রেমওয়ার্কগুলি এই কৌশলটি ব্যবহার করে যাতে এটি অবশ্যই সঠিক হতে পারে। কেবল আপনার অর্থ হওয়া উচিত নয় বলে। +1
সিকিং

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

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

1
এটি আদর্শ হলেও, এমন সময় রয়েছে যখন আপনাকে কোনও উপাদানটি সঠিকভাবে কিছু করতে হয়েছিল তা ঠিক নয় যে এটি সফল হয়েছিল। এটি ব্ল্যাক বক্স পরীক্ষা করা কঠিন হতে পারে। কিছু সময় আপনাকে কোনও উপাদানটির সাদা বাক্স পরীক্ষা করতে হবে।
পিটার লরি

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

151

ব্যক্তিগতভাবে, আমি বরং পাবলিক এপিআই ব্যবহার করে ইউনিট পরীক্ষা করতাম এবং কেবলমাত্র পরীক্ষার সহজ করার জন্য আমি ব্যক্তিগতভাবে কখনও ব্যক্তিগত পদ্ধতিটিকে পাবলিক করব না।

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

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

' পরীক্ষাগুলি শোনো ' - যদি এটি পরীক্ষা করা শক্ত হয় তবে তা কি আপনাকে আপনার নকশা সম্পর্কে কিছু বলছে? আপনি কি এই পদ্ধতির জন্য একটি পরীক্ষা তুচ্ছ এবং সহজেই পাবলিক এপিআইয়ের মাধ্যমে পরীক্ষার মাধ্যমে সহজেই আচ্ছাদন করতে পারবেন?

এখানে কি মাইকেল পালক 'থেকে বলার আছে এর কার্যকরীভাবে উত্তরাধিকার কোড নিয়ে কাজ "

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


5
ইজিমোক / পাওয়ারমক এর জন্য +1 এবং কোনও ব্যক্তিগত পদ্ধতি কখনই প্রকাশ্যে
আনবেন না

51
"পরীক্ষা শুনুন" এর জন্য +1। আপনি যদি কোনও ব্যক্তিগত পদ্ধতি পরীক্ষা করার প্রয়োজন বোধ করেন তবে সম্ভাবনা ভাল হয় যে সেই পদ্ধতির যুক্তিটি এত জটিল যে এটি পৃথক সহায়ক শ্রেণিতে হওয়া উচিত। তারপরে আপনি সহায়ক শ্রেণীর পরীক্ষা করতে পারেন।
ফিল

2
'পরীক্ষাগুলি শুনুন' ডাউন বলে মনে হচ্ছে। এখানে একটি ক্যাশেড লিঙ্ক দেওয়া আছে: webcache.googleusercontent.com/…
জেস টেলফোর্ড

1
আমি @ ফিল (বিশেষত বইয়ের রেফারেন্স) এর সাথে একমত, তবে আমি প্রায়শই লিগ্যাসি কোড সহ নিজেকে মুরগির / ডিমের পরিস্থিতিতে দেখতে পাই। আমি জানি যে এই পদ্ধতিটি অন্য শ্রেণীর অন্তর্গত, তবে আমি প্রথম স্থানে পরীক্ষা ছাড়াই 100% আরামদায়ক রিফ্যাক্টরিং করছি না।
কেভিন

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

67

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

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


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

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

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

অভ্যন্তরীণ যুক্তিযুক্ত যা আপনি পরীক্ষা করতে চান এবং অভ্যন্তরীণ যুক্তি পরীক্ষা করার জন্য একটি সর্বজনীন পদ্ধতি সরবরাহ করতে চান এমন কোনও ক্লাস ক্লাস থেকে উত্তরাধিকার সূত্রে লিখতে পারে?
sholsinger

1
@ শোলসিংগার: সি # তে একটি পাবলিক ক্লাস কোনও অভ্যন্তরীণ শ্রেণীর উত্তরাধিকার সূত্রে নাও পেতে পারে।
এরিক লিপার্ট

45

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

"ব্যক্তিগত" পদ্ধতিগুলির পরীক্ষার স্বাভাবিক পদ্ধতিটি হ'ল প্রতিটি শ্রেণিকে তার নিজস্ব ইন্টারফেস দেওয়া এবং "ব্যক্তিগত" পদ্ধতিগুলি তৈরি করা public, তবে সেগুলি ইন্টারফেসের অন্তর্ভুক্ত না করে। এইভাবে, তাদের এখনও পরীক্ষা করা যেতে পারে, তবে তারা ইন্টারফেসটি ফুটিয়ে তোলে না।

হ্যাঁ, এর ফলে ফাইল- এবং ক্লাস-ব্লাট হবে।

হ্যাঁ, এটি publicএবং privateনির্দিষ্টকরণগুলিকে অপ্রয়োজনীয় করে তোলে।

হ্যাঁ, এটি পাছার একটি ব্যথা।

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


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


2
1 ম অর্ধের জন্য দুর্দান্ত উত্তর
সেমিচিন্টে

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

1
খুব সুন্দর উত্তর। আপনি আমার উষ্ণ ভোট আছে। আমি একটি উত্তর যুক্ত করেছি। এটি আপনার আগ্রহী হতে পারে।
ডেভিডএক্সএক্সএক্স

29

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


+1 টি, এবং একটি realted উত্তর: stackoverflow.com/questions/4603847/...
Raedwald

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

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

6
@ ক্যাসি: যদি ব্যক্তিগত পদ্ধতিটি কোনও জনসাধারণের ইন্টারফেস দ্বারা প্রয়োগ না করা হয় তবে কেন এটি রয়েছে?
থিলো

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

22

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

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


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

20

এটি কীভাবে ব্যক্তিগত প্যাকেজ তৈরি করবেন? তারপরে আপনার পরীক্ষার কোডটি এটি দেখতে (এবং আপনার প্যাকেজের অন্যান্য শ্রেণিগুলিও) দেখতে পাবে, তবে এটি এখনও আপনার ব্যবহারকারীদের থেকে গোপন রয়েছে।

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

একটি পদ্ধতি জনসাধারণের করা বড় প্রতিশ্রুতিবদ্ধ। একবার আপনি এটি করেন, লোকেরা এটি ব্যবহার করতে সক্ষম হবে এবং আপনি কেবল এগুলি আর পরিবর্তন করতে পারবেন না।


আপনার প্রাইভেটের পরীক্ষা করার প্রয়োজন হলে +1 আপনি সম্ভবত একটি শ্রেণি
জে কে

অনুপস্থিত শ্রেণীর জন্য +1 অন্যরা সরাসরি "এটিকে চিহ্নিত করুন" ব্যান্ডওয়্যাগনে ঝাঁপিয়ে পড়ে না দেখে খুশি।
ফিংলাস

ছেলে আমাকে প্যাকেজটির ব্যক্তিগত উত্তর খুঁজতে অনেকদূর যেতে হয়েছিল।
বিল কে

17

আপডেট : আমি অন্যান্য অনেক জায়গায় এই প্রশ্নের আরও প্রসারিত এবং আরও সম্পূর্ণ উত্তর যুক্ত করেছি। এটি আমার ব্লগে পাওয়া যাবে

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

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

উদাহরণ স্বরূপ:

public class SystemUnderTest
{
   public void DoStuff()
   {
      // Blah
      // Call Validate()
   }

   private void Validate()
   {
      // Several lines of complex code...
   }
}

বৈধকারক বস্তুর প্রবর্তন করে এটি রিফ্যাক্টর।

public class SystemUnderTest
{
    public void DoStuff()
    {
       // Blah
       validator.Invoke(..)
    }
}

এখন আমাদের যা যা করতে হবে তা হ'ল যাচাইকারীকে সঠিকভাবে ডাকা হয়েছিল। বৈধতার আসল প্রক্রিয়া (পূর্বে ব্যক্তিগত যুক্তি) খাঁটি বিচ্ছিন্নতায় পরীক্ষা করা যেতে পারে। এই বৈধতা পাসের বিষয়টি নিশ্চিত করার জন্য জটিল পরীক্ষা সেট আপের প্রয়োজন হবে না।


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

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

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

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

@finglas আপনি এই সম্পর্কে চিন্তা: stackoverflow.com/questions/29354729/... । আমার ব্যক্তিগত পদ্ধতিটি পরীক্ষা করার মতো মনে হয় না, তাই সম্ভবত এটি আমার কোনও শ্রেণিতে বিভক্ত করা উচিত নয়, তবে এটি 2 টি অন্যান্য পাবলিক পদ্ধতিতে ব্যবহৃত হচ্ছে, তাই আমি একই যুক্তির দ্বিগুণ পরীক্ষার শেষ করব।
রডরিগো রুইজ

13

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


11

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

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


10

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


10

ব্যক্তিগত পদ্ধতিগুলি সাধারণত "সহায়ক" পদ্ধতি হিসাবে ব্যবহৃত হয়। অতএব তারা কেবলমাত্র মূল মানগুলি ফেরত দেয় এবং কখনই বস্তুর নির্দিষ্ট দৃষ্টান্তগুলিতে কাজ করে না।

আপনি যদি সেগুলি পরীক্ষা করতে চান তবে আপনার কাছে কয়েকটি বিকল্প রয়েছে।

  • প্রতিবিম্ব ব্যবহার করুন
  • পদ্ধতিগুলি প্যাকেজ অ্যাক্সেস দিন

বিকল্পভাবে আপনি কোনও সহায়ক হিসাবে যদি নতুন শ্রেণীর জন্য যথেষ্ট ভাল প্রার্থী হন তবে সর্বজনীন পদ্ধতি হিসাবে সাহায্যকারী পদ্ধতির সাহায্যে একটি নতুন শ্রেণি তৈরি করতে পারেন।

এখানে একটি খুব ভাল নিবন্ধ আছে


1
সুষ্ঠু মন্তব্য। কেবল একটি বিকল্প ছিল, সম্ভবত একটি খারাপ।
আদমজমারহাম

@ ফিঙ্গলাস প্রতিচ্ছবি ব্যবহার করে ব্যক্তিগত কোড কেন পরীক্ষা করছেন এটি একটি খারাপ ধারণা?
আনশুল

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

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

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

9

আপনি যদি সি # ব্যবহার করছেন তবে আপনি অভ্যন্তরীণ পদ্ধতিটি তৈরি করতে পারেন। এইভাবে আপনি সর্বজনীন এপিআই দূষিত করবেন না।

তারপরে dll এ বৈশিষ্ট্য যুক্ত করুন

[সমাবেশ: ইন্টারনালভিজিবলটো ("মাই টেস্টআস্যাব্যাকশন")]]

এখন সমস্ত পদ্ধতি আপনার মাইস্টেস্টঅ্যাস্যাসপশন প্রকল্পে দৃশ্যমান। সম্ভবত নিখুঁত নয়, তবে এটি পরীক্ষা করার জন্য ব্যক্তিগত পদ্ধতিটিকে সর্বজনীন করে তোলা আরও ভাল।


7

আপনার প্রয়োজন হলে ব্যক্তিগত ভেরিয়েবলগুলি অ্যাক্সেস করতে প্রতিবিম্বটি ব্যবহার করুন।

তবে সত্যই, আপনি শ্রেণীর অভ্যন্তরীণ অবস্থার বিষয়ে চিন্তা করেন না, আপনি কেবল পরীক্ষা করতে চান যে সার্বজনীন পদ্ধতিগুলি আপনি যে পরিস্থিতিতে প্রত্যাশা করতে পারেন তাতে কী প্রত্যাশা করে তা ফিরিয়ে দেয়।


শূন্য পদ্ধতিতে আপনি কী করবেন?
ইন্টেলিটাটা

@ ইন্টেলিডিটা আপনার প্রয়োজন হলে ব্যক্তিগত ভেরিয়েবলগুলি অ্যাক্সেস করতে প্রতিবিম্বটি ব্যবহার করুন।
ড্যানিয়েল আলেকিয়ুক

6

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

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


1
শ্রেণিটি যদি কোনও পরিষেবার চুক্তি বাস্তবায়ন হয় এবং এটি কেবল তার ইন্টারফেসের মাধ্যমে ব্যবহৃত হয় - তবে ব্যক্তিগত পদ্ধতিটি জনসাধারণ্যে প্রকাশ করা হলেও এটি দৃশ্যমান না হওয়ায় এটি আর বলা হবে না
jcvandan

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

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

@ ডরমিশার - যদি ক্লাসটি কেবল ইন্টারফেসের মাধ্যমেই ব্যবহৃত হয়, তবে আপনাকে কেবল পরীক্ষা করতে হবে যে পাবলিক ইন্টারফেস পদ্ধতি (গুলি) সঠিকভাবে আচরণ করে। যদি জনসাধারণের পদ্ধতিগুলি তারা যা বোঝাতে চায় তা করে তবে আপনি ব্যক্তিগত বিষয়গুলি সম্পর্কে কেন যত্ন করবেন?
আন্দ্রেজ ডয়েল

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

6

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


5

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


5

আপনার আপডেটে আপনি বলেছেন যে কেবলমাত্র পাবলিক এপিআই ব্যবহার করে পরীক্ষা করা ভাল। এখানে আসলে দুটি স্কুল আছে।

  1. ব্ল্যাক বক্স টেস্টিং

    ব্ল্যাক বক্স স্কুল বলছে যে ক্লাসটিকে একটি ব্ল্যাক বক্স হিসাবে বিবেচনা করা উচিত যা এর ভিতরে কেউ বাস্তবায়ন দেখতে পায় না। এটি পরীক্ষার একমাত্র উপায় হ'ল পাবলিক এপিআইয়ের মাধ্যমে - যেমন শ্রেণীর ব্যবহারকারীরাই এটি ব্যবহার করবে।

  2. সাদা বক্স পরীক্ষা।

    হোয়াইট বক্স স্কুল ক্লাস বাস্তবায়ন সম্পর্কে জ্ঞান ব্যবহার করার জন্য প্রাকৃতিকভাবে তা মনে করে এবং তারপরে ক্লাসটি পরীক্ষা করে যে এটি করা উচিত তা পরীক্ষা করে test

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


4

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


4

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

বিষয়টিকে সত্যই আকর্ষণীয় করে তোলার জন্য এই ভিডিওটি একবার দেখুন ।


4

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

পরিবর্তে আপনার "উচ্চতর পরীক্ষা" করা উচিত। যে পদ্ধতিটিকে বেসরকারী পদ্ধতি বলে Test তবে আপনার পরীক্ষাগুলি আপনার "প্রয়োগের সিদ্ধান্ত" নয় বরং আপনার অ্যাপ্লিকেশনগুলির প্রয়োজনগুলির পরীক্ষা করা উচিত।

উদাহরণস্বরূপ (এখানে বড সিউডো কোড);

   public int books(int a) {
     return add(a, 2);
   }
   private int add(int a, int b) {
     return a+b;
   } 

"যুক্ত" পরীক্ষা করার কোনও কারণ নেই যার পরিবর্তে আপনি "বই" পরীক্ষা করতে পারেন।

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


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

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

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

এই সমাধানটি এমন বইয়ের মতো পদ্ধতির জন্য দুর্দান্ত যা কোনও মূল্য ফেরত দেয় - আপনি কোনও প্রতিস্থাপনের মধ্যে রিটার্নের ধরণটি পরীক্ষা করতে পারেন ; তবে আপনি কীভাবে একটি শূন্য পদ্ধতি পরীক্ষা করতে যাবেন ?
ইন্টেলিটাটা

অকার্যকর পদ্ধতিগুলি কিছু করে বা তাদের অস্তিত্বের প্রয়োজন নেই। তারা যা করে তা চেক করুন
কোটায়ার

2

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

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


2

আমি সাধারণত পরীক্ষার ক্লাসগুলিকে পরীক্ষার অধীনে ক্লাসগুলির মতো একই প্রকল্প / সমাবেশে রাখি।
এই internalপদ্ধতিটি কেবলমাত্র ফাংশন / ক্লাস পরীক্ষারযোগ্য করার জন্য আমার দৃশ্যমানতার প্রয়োজন ।

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

এটি অবশ্যই আপনার প্রশ্নের সি # / .NET অংশে প্রযোজ্য


2

আমি প্রায়ই মত একটি পদ্ধতি কিছু বলা যোগ হবে validate, verify, checkএকটি বর্গ ইত্যাদি যাতে এটি একটি বস্তুর অভ্যন্তরীণ স্থিতি পরীক্ষা করার জন্য বলা যায় না।

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


2

পেয়ারার একটি মার্কেটিং পদ্ধতির জন্য @ ভিজিবলফোর্ড টেস্টিং টিকা রয়েছে যা স্কোপটি (প্যাকেজ বা পাবলিক) বিস্তৃত হয়েছে যে তারা অন্যথায় করবে। আমি একই জিনিসটির জন্য @ প্রাইভেট টীকাটি ব্যবহার করি।

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

কখন:

  • একটি শ্রেণিকে একাধিক শ্রেণিতে বিভক্ত করে টোটোতে উল্লেখযোগ্যভাবে কম পঠনযোগ্য করা হয়,
  • এটিকে আরও পরীক্ষামূলক করে তোলার জন্য,
  • এবং অভ্যন্তরের অভ্যন্তরে কিছু পরীক্ষার অ্যাক্সেস সরবরাহ করা কৌশলটি করবে would

মনে হচ্ছে ধর্ম ট্রাম্পিং ইঞ্জিনিয়ারিং করছে।


2

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


2

না, কারণ সেই বিড়ালের চামড়ার আরও ভাল উপায় রয়েছে।

কিছু ইউনিট পরীক্ষার ক্ষয়ক্ষতি ক্লাস সংজ্ঞাতে ম্যাক্রোগুলির উপর নির্ভর করে যা পরীক্ষার মোডে অন্তর্নির্মিত হলে হুকগুলি তৈরি করতে স্বয়ংক্রিয়ভাবে প্রসারিত হয়। খুব সি স্টাইল, তবে এটি কাজ করে।

একটি সহজ ওও বুদ্ধিমান হ'ল "ব্যক্তিগত" এর চেয়ে "সুরক্ষিত" যা পরীক্ষা করতে চান তা তৈরি করা। পরীক্ষার অধীনে ক্লাস থেকে পরীক্ষার জোতা উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং তারপরে সমস্ত সুরক্ষিত সদস্যদের অ্যাক্সেস করতে পারে।

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

যাইহোক, আপনি যদি ইউনিট টেস্টিং করেন তবে আপনাকে সেই সদস্যদের মধ্যে মানগুলি ইনজেক্ট করার দরকার সম্ভবত রয়েছে। হোয়াইট বক্স টেক্সটিং পুরোপুরি বৈধ। এবং এটি সত্যিই আপনার এনক্যাপসুলেশনটি ভেঙে দেবে


2

নেট। সেখানে একটি বিশেষ ক্লাস বলা হয় PrivateObject ব্যক্তিগত পদ্ধতিতে অ্যাক্সেস করার জন্য বিশেষভাবে ডিইনড শ্রেণি রয়েছে।

এমএসডিএন বা এটি সম্পর্কে এখানে আরও দেখুন স্ট্যাক ওভারফ্লোতে আরও দেখুন

(আমি ভাবছি যে এ পর্যন্ত কেউ এর উল্লেখ করেনি।)

এমন পরিস্থিতিতে রয়েছে যা এটি যথেষ্ট নয়, এক্ষেত্রে আপনাকে প্রতিবিম্ব ব্যবহার করতে হবে।

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


1

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

একটি ব্যক্তিগত উদাহরণ পদ্ধতি সহ এখানে একটি ছোট উদাহরণ শ্রেণি class

public class A {
    private void doSomething() {
        System.out.println("Doing something private.");
    }
}

এবং একটি উদাহরণ বর্গ যা ব্যক্তিগত উদাহরণ পদ্ধতি চালায় exec

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class B {
    public static final void main(final String[] args) {
        try {
            Method doSomething = A.class.getDeclaredMethod("doSomething");
            A o = new A();
            //o.doSomething(); // Compile-time error!
            doSomething.setAccessible(true); // If this is not done, you get an IllegalAccessException!
            doSomething.invoke(o);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }
}

বি চালানো, মুদ্রণ করবে Doing something private. আপনার যদি সত্যই এটির প্রয়োজন হয়, ব্যক্তিগত উদাহরণ পদ্ধতিগুলি অ্যাক্সেস করার জন্য ইউনিট পরীক্ষায় প্রতিচ্ছবি ব্যবহার করা যেতে পারে।


0

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

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