ইউনিট টেস্টিং কীভাবে কাজ করে?


23

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

public class TestAdder {
    public void testSum() {
        Adder adder = new AdderImpl();
        assert(adder.add(1, 1) == 2);
        assert(adder.add(1, 2) == 3);
        assert(adder.add(2, 2) == 4);
        assert(adder.add(0, 0) == 0);
        assert(adder.add(-1, -2) == -3);
        assert(adder.add(-1, 1) == 0);
        assert(adder.add(1234, 988) == 2222);
    }
}

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

assert(adder.add(a, b) == (a+b));

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


14
How does unit testing work?কেউ সত্যিই জানে :)
yannis

30
"আপনাকে ম্যানুয়ালি পছন্দসই ফলাফল গণনা করতে হবে"। কিভাবে এটি "সম্পূর্ণ অকেজো"? উত্তরটি সঠিক বলে আপনি কীভাবে নিশ্চিত হতে পারেন ?
এস.লোট

9
@ এস.লোট: একে অগ্রগতি বলা হয়, প্রাচীন যুগে লোকেরা সংখ্যার ক্রাচ করতে এবং সময় সাশ্রয় করতে কম্পিউটার ব্যবহার করত, আধুনিক দিনে মানুষ সংখ্যা কমিয়ে দিতে পারে তা নিশ্চিত করার জন্য সময় ব্যয় করে: ডি
কোডার

2
@ কোডার: ইউনিট পরীক্ষার উদ্দেশ্য "সংখ্যা ক্র্যাচ করা এবং সময় সাশ্রয় করা" নয়;)
অ্যান্ড্রেস এফ।

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

উত্তর:


26

ইউনিট পরীক্ষাগুলি, আপনি যদি যথেষ্ট ছোট ইউনিট পরীক্ষা করছেন তবে সর্বদা অন্ধভাবে স্পষ্ট বলছেন।

কারণ add(x, y)এমনকি একটি একক পরীক্ষার উল্লেখ পায়, কারণ কিছুদিন পর কারো ঢোকা হবে addএবং বিশেষ ট্যাক্স যুক্তিবিজ্ঞান হ্যান্ডলিং কোডটি অ্যাড নিরূপক না সর্বত্র ব্যবহার করা হয় করা।

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

public void LoginUser (string username, string password) {
    var user = db.FetchUser (username);

    if (user.Password != password)
        throw new Exception ("invalid password");

    var roles = db.FetchRoles (user);

    if (! roles.Contains ("member"))
        throw new Exception ("not a member");

    Session["user"] = user;
}

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

public void LoginUser (string username, string password) {

    var user = _userRepo.FetchValidUser (username, password);

    _rolesRepo.CheckUserForRole (user, "member");

    _localStorage.StoreValue ("user", user);
}

এখন আমরা ইউনিট নিচে। এক ইউনিট পরীক্ষা গ্রাহ্য না করে কি _userRepoজন্য বৈধ আচরণ বিবেচনা করে FetchValidUser, শুধুমাত্র এটি বলা হচ্ছে। কোনও বৈধ ব্যবহারকারীর গঠন ঠিক কী তা নিশ্চিত করতে আপনি অন্য পরীক্ষাটি ব্যবহার করতে পারেন। একইভাবে CheckUserForRole... এর জন্য আপনি ভূমিকাটি কাঠামোর চেহারাটি কী তা জেনে আপনার পরীক্ষাটি ডিকপল করেছেন। আপনি আপনার পুরো প্রোগ্রামটিকে কঠোরভাবে বাঁধা থেকে ডিকপল করেছেন Session। আমি কল্পনা করি এখানে সমস্ত নিখোঁজ টুকরোটি দেখতে পাবেন:

class UserRepository : IUserRepository
{
    public User FetchValidUser (string username, string password)
    {
        var user = db.FetchUser (username);

        if (user.Password != password)
            throw new Exception ("invalid password");

        return user;
    }
}

class RoleRepository : IRoleRepository
{
    public void CheckUserForRole (User user, string role)
    {
        var roles = db.FetchRoles (user);

        if (! roles.Contains (role))
            throw new Exception ("not a member");
    }
}

class SessionStorage : ILocalStorage
{
    public void StoreValue (string key, object value)
    {
        Session[key] = value;
    }
}

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

আশাকরি এটা সাহায্য করবে :)


13

আমি বর্তমানে বেশিরভাগ "প্রসেসরিয়াল" ফাংশনগুলিতে কোডিং করছি যা 10 ডলার বুলিয়ান এবং কয়েকটি ইনট নেয় এবং এর ভিত্তিতে আমাকে কোন ফলাফল দেয়, আমার মনে হয় কেবলমাত্র একক পরীক্ষার মতো যা আমি করতে পারি পরীক্ষায় কেবল অ্যালগরিদমকে পুনরায় কোড করা would

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


বিদ্যমান কোডটি চালানোর জন্য এবং ফলাফলগুলি রেকর্ড করার জন্য +1। এই পরিস্থিতিতে সম্ভবত এটি ব্যবহারিক পদ্ধতির।
মার্কজে

12

যেহেতু অন্য কেউই প্রকৃত উদাহরণ সরবরাহ করেছে বলে মনে হয় না:

    public void testRoman() {
        RomanNumeral numeral = new RomanNumeral();
        assert( numeral.toRoman(1) == "I" )
        assert( numeral.toRoman(4) == "IV" )
        assert( numeral.toRoman(5) == "V" )
        assert( numeral.toRoman(9) == "IX" )
        assert( numeral.toRoman(10) == "X" )
    }
    public void testSqrt() {
        assert( sqrt(4) == 2 )
        assert( sqrt(9) == 3 )
    }

তুমি বলো:

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

তবে মুল বক্তব্যটি হ'ল ম্যানুয়াল কম্পিউটেশন করার পরে কোডিং করার সময় আপনি কোনও ভুল (বা কমপক্ষে আপনার ভুলগুলি লক্ষ্য করার সম্ভাবনা বেশি বেশি) হওয়ার সম্ভাবনা বেশি।

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

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

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

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

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

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

আপনি পোর্টিং করছেন এমন প্রকৃত কোডটি যদি আপনি দেখিয়ে থাকেন তবে আমরা কীভাবে সমস্যাটির কাছে যেতে পারি সে সম্পর্কে আরও বিশদ প্রতিক্রিয়া জানাতে পারি।


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

11

আমি মনে করি একমাত্র ইউনিট পরীক্ষার মতো যা আমি করতে পারি তা হ'ল পরীক্ষায় কেবল অ্যালগরিদমকে পুনরায় কোড করা

আপনি যেমন একটি সাধারণ বর্গ জন্য প্রায় সঠিক।

আরও জটিল ক্যালকুলেটরের জন্য এটি ব্যবহার করে দেখুন .. বোলিং স্কোর ক্যালকুলেটরের মতো।

ইউনিট পরীক্ষাগুলির মান আরও সহজেই দেখা যায় যখন আপনি পরীক্ষা করার জন্য বিভিন্ন পরিস্থিতি সহ আরও জটিল "ব্যবসায়" নিয়ম করেন।

আমি বলছি না আপনি মিল ক্যালকুলেটরের একটি রান পরীক্ষা করা উচিত নয় (আপনার ক্যালকুলেটর অ্যাকাউন্টের 1/3 এর মতো মানগুলিতে ইস্যু করে যা উপস্থাপন করা যায় না? এটি শূন্য দ্বারা বিভাজনে কী করে?) তবে আপনি দেখতে পাবেন কভারেজ পেতে যদি আপনি আরও শাখাগুলির সাথে কিছু পরীক্ষা করেন তবে আরও স্পষ্টভাবে মান দিন value


4
এটি লক্ষ করার জন্য +1 জটিল ফাংশনগুলির জন্য আরও কার্যকর হয় becomes আপনি যদি adder.add () কে ভাসমান পয়েন্টের মানগুলিতে প্রসারিত করার সিদ্ধান্ত নিয়েছেন? ম্যাট্রিক্স? বড় অ্যাকাউন্টের মান?
joshin4colours

6

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

আমি বর্তমানে বেশিরভাগ "প্রসেসরিয়াল" ফাংশনগুলিতে কোডিং করছি যা 10 ডলার বুলিয়ান এবং কয়েকটি ইনস নেয় এবং এর ভিত্তিতে আমাকে একটি পূর্ণ ফলাফল দেয়

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

পদ্ধতিগত প্রোগ্রামিংয়ের চেয়ে আমার ওওতে যাওয়ার দরকার নেই ...


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

2
@ লেজেবুলন নির্বিশেষে যদি সেই একক পদ্ধতি গ্রহণের জন্য অনেকগুলি সম্ভাব্য ইনপুট থাকে তবে সেই পদ্ধতিটি খুব বেশি কাজ করছে
maple_shaft

3

আমার দৃষ্টিতে ইউনিট পরীক্ষাগুলি আপনার সামান্য সংযোজক শ্রেণিতে এমনকি উপযোগী: অ্যালগরিদমকে "পুনরায় পুনর্নির্মাণ" করার কথা ভাববেন না এবং এটিকে একটি ব্ল্যাক বক্স হিসাবে মনে করবেন যা আপনার সম্পর্কে রয়েছে কেবলমাত্র কার্যকরী আচরণ (যদি আপনি পরিচিত হন তবে দ্রুত গুণ সহ আপনি কিছু দ্রুত জানেন তবে "a * b" ব্যবহার করার চেয়ে জটিল প্রচেষ্টা এবং আপনার সার্বজনীন ইন্টারফেস। "নিজেকে কী ভুল হতে পারে?" ... নিজেকে জিজ্ঞাসা করা উচিত

বেশিরভাগ ক্ষেত্রে এটি সীমান্তে ঘটে (আমি ইতিমধ্যে ++, -, + -, 00 - - +, 0+, 0-, +0, -0 এর মাধ্যমে সম্পূর্ণ করার জন্য এই নিদর্শনগুলি যুক্ত করে দেখছি)। সেখানে যোগ বা বিয়োগ করার সময় (নেতিবাচক যোগ করা;)) কী ঘটেছিল তা ভেবে দেখুন T অথবা আপনার পরীক্ষাগুলি শূন্য ও তার কাছাকাছি যা ঘটেছিল তা পুরোপুরি ঠিক দেখাচ্ছে কিনা তা নিশ্চিত করার চেষ্টা করুন।

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

আপনার পরীক্ষার ক্লাসগুলির জন্য ইঙ্গিত: কোনও পদ্ধতিতে কেবল একটি মাত্র লেখার চেষ্টা করুন। কোড পরিবর্তনের পরে যখন আপনার পরীক্ষা ব্যর্থ হয় তখন সর্বোত্তম প্রতিক্রিয়া জানাতে পদ্ধতিগুলিকে ভাল নাম দিন (যেমন "testAddingToMaxInt", "testAddingTwoNegatives")।


2

ম্যানুয়ালি গণনা করা রিটার্ন মানের জন্য পরীক্ষা করা বা প্রত্যাশিত রিটার্ন মান গণনা করার জন্য পরীক্ষায় যুক্তিকে সদৃশ করার পরিবর্তে প্রত্যাশিত সম্পত্তির জন্য ফেরতের মানটি পরীক্ষা করুন।

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

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


2

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

I feel that this test is totally useless, because you are required to manually compute the wanted result and test it, I feel like a better unit test here would be

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

Can someone provide me with an example where unit testing is actually useful?

আপনার একটি কর্মচারী সত্তা রয়েছে। সত্তার একটি নাম এবং ঠিকানা রয়েছে। ক্লায়েন্ট একটি রিপোর্টস ক্ষেত্র যুক্ত করার সিদ্ধান্ত নিয়েছে।

void TestBusinessLayer()
{
   int employeeID = 1234
   Employee employee = Employee.GetEmployee(employeeID)
   BusinessLayer bl = new BusinessLayer()
   Assert.isTrue(bl.Add(employee))//assume Add returns true on pass
}

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

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

I feel like the only unit testing I could do would be to simply re-code the algorithm in the test.

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


<পেডেন্ট্রি> "গামুট", "গাম্বিট" নয় </ </
পেডেন্ট্রি

@ চাও লও প্রতিদিন নতুন কিছু শিখুন।
পি.ব্রেইন.ম্যাকি

2

আপনার উদাহরণ গ্রহণ করা (কিছুটা রিফ্যাক্টরিং সহ),

assert(a + b, math.add(a, b));

এতে সহায়তা করে না:

  • math.addঅভ্যন্তরীণভাবে আচরণ করে তা বুঝতে হবে ,
  • প্রান্তের মামলাগুলির সাথে কী ঘটবে তা জানুন।

এটি বলার মতো সুন্দর:

  • আপনাকে জানতে হবে কি পদ্ধতি আছে চান, যান এবং সোর্স কোড লাইনের শত শত দেখতে নিজেকে (কারণ হ্যাঁ, math.add পারেন এলওসি শত শত ধারণ; নীচে দেখুন)।
  • পদ্ধতিটি সঠিকভাবে কাজ করে কিনা তা জানার জন্য আমি মাথা ঘামাই না। এটি ঠিক আছে যদি প্রত্যাশিত এবং আসল মানগুলি সত্যই আমার প্রত্যাশার চেয়ে আলাদা হয়

এর অর্থ হ'ল আপনাকে টেস্টগুলি যুক্ত করতে হবে না:

assert(3, math.add(1, 2));
assert(4, math.add(2, 2));

তারা কেউই সহায়তা করে না, বা কমপক্ষে, একবার আপনি প্রথম দৃ .়তার সাথে কথা বলার পরে, দ্বিতীয়টি কার্যকর কিছু এনেছে না।

পরিবর্তে, কি সম্পর্কে:

const numeric Pi = 3.1415926535897932384626433832795;
const numeric Expected = 4.1415926535897932384626433832795;
assert(Expected, math.add(Pi, 1),
    "Adding an integer to a long numeric doesn't give a long numeric result.");
assert(Expected, math.add(1, Pi),
    "Adding a long numeric to an integer doesn't give a long numeric result.");

এটি আপনার পক্ষে এবং সেই ব্যক্তির পক্ষে যিনি পরে উত্স কোডটি বজায় রাখবেন এটি উভয়ের পক্ষে স্ব-ব্যাখ্যামূলক এবং জঘন্য সহায়ক। কল্পনা করুন যে এই ব্যক্তিটি math.addকোডটি সহজ করার জন্য এবং কার্য সম্পাদনকে অনুকূলকরণ করতে কিছুটা সংশোধন করেছে এবং পরীক্ষার ফলাফলটি এইরকম দেখে:

Test TestNumeric() failed on assertion 2, line 5: Adding a long numeric to an
integer doesn't give a long numeric result.

Expected value: 4.1415926535897932384626433832795
Actual value: 4

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

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

খুব একই কারণে, নিম্নলিখিত দুটি বক্তব্য কিছু ভাষায় বোধ করতে পারে:

// We don't expect a concatenation. `math` library is not intended for this.
assert(0, math.add("Hello", "World"));

// We expect the method to convert every string as if it was a decimal.
assert(5, math.add("0x2F", 5));

এছাড়াও, কি সম্পর্কে:

assert(numeric.Infinity, math.add(numeric.Infinity, 1));

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

অথবা হতে পারে, আপনার ভাষার উপর নির্ভর করে, এটি আরও অর্থবোধ করবে?

/**
 * Ensures that when adding numbers which exceed the maximum value, the method
 * fails with OverflowException, instead of restarting at numeric.Minimum + 1.
 */
TestOverflow()
{
    UnitTest.ExpectException(ofType(OverflowException));

    numeric result = math.add(numeric.Maximum, 1));

    UnitTest.Fail("The tested code succeeded, while an OverflowException was
        expected.");
}

1

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

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

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


1

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


0

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

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


0

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

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

আপনার ইউনিট টেস্টগুলি সত্যই তাদের নিজের মধ্যে আসে।

আপনি আপনার কোডের অভ্যন্তরীণ বাস্তবায়ন পরিবর্তন করতে পারেন তবে সেই কোডের যে কোনও গ্রাহকের কাছে ফলাফল একই থাকে remains

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