ইউনিট পরীক্ষা শূন্য পদ্ধতি?


170

এমন কোনও পদ্ধতির ইউনিট পরীক্ষার সর্বোত্তম উপায় কী যা কোনও কিছুই ফেরত না? বিশেষত সি # তে

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


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

উত্তর:


151

যদি কোনও পদ্ধতি কোনও কিছু ফেরত না দেয় তবে এটি নিম্নলিখিতগুলির মধ্যে একটি

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

অপরিহার্য পদ্ধতি - কার্যটি কার্য সম্পাদন করা হয়েছে কিনা তা আপনি যাচাই করতে পারেন। রাষ্ট্র পরিবর্তন আসলে ঘটেছিল কিনা তা যাচাই করুন। যেমন

void DeductFromBalance( dAmount ) 

এই বার্তাটি সত্যিই ডিএমাউন্টের মাধ্যমে প্রাথমিক মানের চেয়ে কম কিনা তা যাচাই করে পরীক্ষা করা যেতে পারে

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

void OnAccountDebit( dAmount )  // emails account holder with info

ইমেল প্রেরণ করা হচ্ছে কিনা তা যাচাই করে পরীক্ষা করা যেতে পারে

আপনার আসল পদ্ধতি সম্পর্কে আরও বিশদ পোস্ট করুন এবং লোকেরা আরও ভাল উত্তর দিতে সক্ষম হবে।
আপডেট : আপনার পদ্ধতিটি 2 জিনিস করছে। আমি আসলে এটিকে দুটি পদ্ধতিতে বিভক্ত করতাম যা এখন স্বাধীনভাবে পরীক্ষা করা যেতে পারে।

string[] ExamineLogFileForX( string sFileName );
void InsertStringsIntoDatabase( string[] );

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

InsertStringsIntoDatabase( ExamineLogFileForX( "c:\OMG.log" ) );

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

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

@ এবং ডাটাবেসটিকে অ্যাক্সেসর ইন্টারফেস দ্বারা উপহাস / পৃথক করা যায় এভাবে মক অবজেক্টে পাস করা ডেটা দ্বারা ক্রিয়াটি পরীক্ষা করার অনুমতি দেওয়া হয়।
পিটার জিগার

62

এর পার্শ্ব প্রতিক্রিয়া পরীক্ষা করুন। এটা অন্তর্ভুক্ত:

  • এটি কোনও ব্যতিক্রম ছুঁড়ে না? (যদি এটি হওয়া উচিত তবে এটি পরীক্ষা করে দেখুন it যদি এটি না করা হয় তবে কয়েকটি কর্নার কেস চেষ্টা করুন যা আপনি যত্নবান না হলে - নাল আর্গুমেন্ট সর্বাধিক সুস্পষ্ট বিষয়))
  • এটির পরামিতিগুলি কি দুর্দান্ত খেলছে? (যদি তারা পরিবর্তনীয় হয় তবে এটি কি তাদের পরিবর্তন করতে হবে যখন এটি করা উচিত নয় এবং তদ্বিপরীত হবে?)
  • আপনি যে অবজেক্ট / টাইপটিকে কল করছেন তার স্থিতিতে এটির সঠিক প্রভাব আছে?

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


31

বরাবরের মতো: পরীক্ষাটি পদ্ধতিটি কী করার কথা!

এটি কোথাও বিশ্বব্যাপী রাষ্ট্র (উহু, কোড গন্ধ!) পরিবর্তন করা উচিত?

এটি একটি ইন্টারফেস কল করা উচিত?

ভুল পরামিতিগুলির সাথে ডাকলে কি এটি ব্যতিক্রম করা উচিত?

যখন সঠিক পরামিতিগুলির সাথে ডাকা হয় তখন কি এটির ব্যতিক্রম করা উচিত?

ইহা উচিত ...?


11

অকার্যকর রিটার্ন টাইপ / সাব্রুটাইন পুরানো খবর। আমি 8 বছরের মতো একটি অকার্যকর রিটার্নের টাইপ তৈরি করি নি (যদি না আমি অত্যন্ত অলস হয়ে থাকি) (এই উত্তরের সময় থেকে, তাই এই প্রশ্নটি জিজ্ঞাসা করার আগে একটু আগে)।

পরিবর্তে যেমন একটি পদ্ধতির:

public void SendEmailToCustomer()

একটি পদ্ধতি তৈরি করুন যা মাইক্রোসফ্টের অন্তর্নিহিত ট্রাইপার্স () দৃষ্টান্ত অনুসরণ করে:

public bool TrySendEmailToCustomer()

আপনার পদ্ধতির দীর্ঘমেয়াদে ব্যবহারের জন্য ফিরে আসতে প্রয়োজনীয় কোনও তথ্য নেই, তবে পদ্ধতিটির কাজটি সম্পাদন করার পরে তার অবস্থাটি ফিরিয়ে দেওয়া কলারের পক্ষে বিশাল ব্যবহার।

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

public StateEnum TrySendEmailToCustomer()

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

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

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

public <Constructor/MethodName> (IBusinessDataEtc otherLayerOrTierObject, string[] stuffToInsert)

এখন যেহেতু আপনি আপনার ব্যবসায় / তথ্য স্তর স্তরটির একটি ইন্টারফেস গ্রহণ করতে পারেন, আপনি ইউনিট টেস্টের সময় এটিকে উপহাস করতে পারেন এবং "দুর্ঘটনাজনিত" ইন্টিগ্রেশন পরীক্ষার কোনও নির্ভরতা বা ভয় নেই।

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

সুতরাং আপনার ইউনিট পরীক্ষাটি আপনার পদ্ধতি (প্রশ্নাবলীর) -র মধ্য দিয়ে যাবে, তাদের যেই যুক্তি রয়েছে তা সম্পাদন করবে এবং আপনার IBusinessDataEtcবস্তুর মধ্যে একটি বা দুটি বা একটি নির্বাচিত পদ্ধতিগুলির কল করবে । আপনি যখন আপনার ইউনিট পরীক্ষা শেষে আপনার দৃ do়তাগুলি করেন তখন আপনার কাছে এখন পরীক্ষা করার জন্য কয়েকটি জিনিস রয়েছে।

  1. "সাব্রুটাইন" এর রাজ্য যা এখন একটি ট্র্যাড-প্যারাডিজম পদ্ধতি।
  2. আপনার মক IBusinessDataEtcঅবজেক্টের অবস্থা।

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


এই দুর্দান্ত উত্তরের প্রথম অংশটি সমস্ত নবাগত / মধ্যবর্তী প্রোগ্রামারদের জন্য আশ্চর্যজনক সাধারণ পরামর্শ হিসাবে কাজ করে।
পিমব্রউবার্স

এর মতো কিছু হওয়া উচিত নয় public void sendEmailToCustomer() throws UndeliveredMailException?
এডাম

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

এটি পরিষ্কার করার জন্য আপনাকে ধন্যবাদ। এটি কি সি # নির্দিষ্ট বা জাভা এবং সি ++ এর মতো ভাষাতেও ব্যতিক্রম ছড়িয়ে দেওয়া সাধারণভাবে খারাপ অভ্যাস?
এড।

9

এটা চেষ্টা কর:

[TestMethod]
public void TestSomething()
{
    try
    {
        YourMethodCall();
        Assert.IsTrue(true);
    }
    catch {
        Assert.IsTrue(false);
    }
}

1
এটি প্রয়োজনীয় হওয়া উচিত নয় তবে এটি করা যেতে পারে
নাথান আলার্ড

স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম! দয়া করে আপনার কোডটিতে কিছু ব্যাখ্যা যুক্ত করে বিবেচনা করুন। ধন্যবাদ.
আরাধ্যে

2
ExpectedAttributeআরও স্পষ্টভাবে এই পরীক্ষাটি করতে ডিজাইন করা হয়েছে।
মার্টিন লিভারেজ 12'16

8

আপনি এটি এইভাবে চেষ্টা করে দেখতে পারেন:

[TestMethod]
public void ReadFiles()
{
    try
    {
        Read();
        return; // indicates success
    }
    catch (Exception ex)
    {
        Assert.Fail(ex.Message);
    }
}

1
এটি আমি মনে করি সবচেয়ে সহজ উপায়।
নবীন পণ্ডিত

5

এটি কোনও বিষয়ের উপর কিছু প্রভাব ফেলবে .... প্রভাবের ফলাফলের জন্য ক্যোয়ারী। যদি এটির কোনও দৃশ্যমান প্রভাব না থাকে তবে এটির ইউনিট পরীক্ষার পক্ষে মূল্য নেই!


4

সম্ভবত পদ্ধতিটি কিছু করে, এবং কেবল ফিরে আসে না?

এই বিষয়টি ধরে নিলে,

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

আপনি যদি পদ্ধতিটি কী করে তা আমাদের জানান, আমি আরও নির্দিষ্ট হতে পারি।


3

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


1
ইউনিট পরীক্ষা কীভাবে করা যায় তার উত্তর কখনই কোনও তৃতীয় পক্ষের সরঞ্জাম পাওয়া উচিত নয় যা এটি আপনার জন্য করে। যদিও, যখন কোনও ব্যক্তি পরীক্ষার ইউনিট করতে হয় তা জানেন, তৃতীয় পক্ষের সরঞ্জামটি আরও সহজ করে তোলা গ্রহণযোগ্য।
সুমেমে

2

এটি কী করছে তার উপর নির্ভর করে। যদি এটির প্যারামিটার থাকে তবে এমন মক পাস করুন যা আপনি পরে জিজ্ঞাসা করতে পারতেন যে সেগুলি প্যারামিটারগুলির সঠিক সেট দিয়ে ডাকা হয়েছে কিনা।


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

0

অকার্যকর পদ্ধতিতে কল করতে আপনি যে উদাহরণটি ব্যবহার করছেন তা আপনি কেবল ব্যবহার করতে পারেন,Verfiy

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

আমার ক্ষেত্রে _Logএটি উদাহরণ এবং LogMessageপরীক্ষা করার পদ্ধতিটি:

try
{
    this._log.Verify(x => x.LogMessage(Logger.WillisLogLevel.Info, Logger.WillisLogger.Usage, "Created the Student with name as"), "Failure");
}
Catch 
{
    Assert.IsFalse(ex is Moq.MockException);
}

Verifyপদ্ধতিটি ব্যর্থ হওয়ার কারণে পদ্ধতিটির ব্যর্থতার কারণে ছুড়ে ফেলেছে কি ব্যতিক্রম?

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