'AssertEquals' সিরিজের চেয়ে ইউনিট টেস্ট লেখার আরও ভাল উপায় আছে কি?


12

কুনিট ব্যবহার করে আমার ইউনিট পরীক্ষাটি কী হওয়া দরকার তার একটি প্রাথমিক উদাহরণ:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>

<link rel="stylesheet" href="qunit/qunit-1.13.0.css">
<script src = "qunit/qunit-1.13.0.js"></script>
<script src = "../js/fuzzQuery.js"></script>

<script>

test("Fuzz Query Basics", function()
        {
            equal(fuzzQuery("name:(John Smith)"), "name:(John~ Smith~)");
            equal(fuzzQuery("name:Jon~0.1"), "name:Jon~0.1");
            equal(fuzzQuery("Jon"), "Jon~");
            //etc

        }
    );

</script>
</head>
<body>
    <div id="qunit"></div>
</body>
</html>

আমি ভাবছিলাম এটি কিছুটা পুনরাবৃত্তিযোগ্য।

সমস্ত ইনপুট / আউটপুট একটি অ্যারের মধ্যে রাখতে পারে এবং এর মাধ্যমে লুপ করতে পারে।

test("Fuzz Query Basics", function()
        {
            var equals = [
                           ["name:(John Smith)", "name:(John~ Smith~)"],
                           ["name:Jon~0.1", "name:Jon~0.1"],
                           ["Jon", "Jon~"]
                           ];

            for (var i = 0; i<equals.length; i++)
                {
                    equal(fuzzQuery(equals[i][0]), equals[i][1]);               
                }

        }
    );

এবং এটি সূক্ষ্ম কাজ করে।

এই দ্বিতীয় পদ্ধতির জন্য আমি যে একক সুবিধাটি ভাবতে পারি তা হ'ল এটি যদি প্রমাণিত হয় যে আপনি প্রকৃতপক্ষে ব্যবহার equalকরতে চান না তবে এটি একটি স্পটে পরিবর্তন করা আরও সহজ।

পঠনযোগ্যতার দিক থেকে, আমি মনে করি না যে এটি কোনওভাবেই চূড়ান্ত, যদিও আমি সম্ভবত দ্বিতীয়টিকে পছন্দ করি।

এটি আরও বিমূর্ত করে, আপনি ইনপুট / আউটপুট কেসগুলিকে একটি পৃথক সিএসভি ফাইলে রাখতে পারেন, যা এটি পরিবর্তন করা সহজতর করতে পারে।

প্রশ্নটি হল - এই জাতীয় ইউনিট পরীক্ষার লেখার চারপাশে সাধারণ সম্মেলনগুলি কী কী?

আপনার অ্যারে না রাখার কোনও কারণ আছে?


এর মধ্যে যে কোনওটি আপনাকে বলবে কোন মানটি ব্যর্থ হয়েছে?
জেফো

1
@ জেফো - হ্যাঁ - কোয়ান্ট সহ - যদি কোনও পরীক্ষা ব্যর্থ হয় তবে আউটপুটটি প্রত্যাশিত মান এবং প্রকৃত মান প্রদর্শন করবে।
দ্বিজোহনস্টন

উত্তর:


8

আপনার রিফ্যাক্টর পরীক্ষাগুলির গন্ধ আছে: শর্তাধীন টেস্ট যুক্তি

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

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

সমাধান, বরাবরের মতো, বিমূর্ততার একটি স্তরকে সরিয়ে নেওয়া। XUnit.NET বা Contexts do (অস্বীকৃতি: আমি কনটেক্সট লিখেছি) এর মতো একটি প্যারামেট্রিসড টেস্ট দেয় এমন একটি পরীক্ষার কাঠামো ব্যবহার করুন । পৃথক আচরণের জন্য পৃথক পৃথক আচরণের জন্য পৃথক পৃথক আচরণের জন্য পৃথক আচরণের জন্য পৃথক পৃথক আচরণের জন্য এটি একইসাথে ট্রাইঙ্গুলেটিং পরীক্ষার গোষ্ঠী তৈরি করতে দেয়।


ভাল প্রশ্ন,
বেনিয়ামিন হডসন

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

... লুপস যতক্ষণ না পরীক্ষা ব্যর্থ হয়, ততক্ষণ যা দৃ failed়ভাবে ব্যর্থ হয়েছিল তা দৃints়ভাবে মুদ্রণ করে, বিকাশকারীর সমস্যাটি নির্দিষ্টভাবে চিহ্নিত করার জন্য পর্যাপ্ত প্রতিক্রিয়া রয়েছে।
DXM

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

5

দেখে মনে হচ্ছে আপনি সত্যই একটি ডেটা ড্রাইভ ইউনিট পরীক্ষা চান। আপনি যেহেতু QUnit ব্যবহারের কথা উল্লেখ করেছেন, তাই আমি একটি প্লাগইন পেয়েছি যা প্যারামিটারাইজড পরীক্ষাগুলি সক্ষম করে:

https://github.com/AStepaniuk/qunit-parameterize

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

গিটহাব রিডমির উদাহরণ কোড:

QUnit
    .cases([
        { a : 2, b : 2, expectedSum : 4 },
        { a : 5, b : 5, expectedSum : 10 },
        { a : 40, b : 2, expectedSum : 42 }
    ])
    .test("Sum test", function(params) {
        var actualSum = sum(params.a, params.b);
        equal(actualSum, params.expectedSum);
    });

1
সম্মত, এটি একটি ডেটা-চালিত পরীক্ষার মতো দেখাচ্ছে। তবে মনে হচ্ছে এটি ইতিমধ্যে তাঁর দ্বিতীয় কোড উদাহরণে রয়েছে।
রবার্ট হার্ভে

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

1

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

এটি আমাকে তাত্ক্ষণিকভাবে বলতে দেয় যে কোন পরীক্ষা / ইনপুটগুলি ব্যর্থ হচ্ছে।


0

আমি আপনার দ্বিতীয় পদ্ধতির পছন্দ করি, তবে আমি 2 পয়েন্ট যুক্ত করব

  • পরীক্ষিত ডেটা সংরক্ষণ করার জন্য অ্যারেগুলি ব্যবহার করবেন না, কারণ সূচীগুলির সাথে কাজ করা একটি পরিষ্কার উপায় নয়
  • forলুপ ব্যবহার করবেন না

`

[
    {
        process: "name:(John Smith)",
        result: "name:(John~ Smith~)"
    },
    {
        process: "name:Jon~0.1", 
        result: "name:Jon~0.1"
    },
    {
        process: "Jon", 
        result: "Jon~"
    }
]
.forEach(function(data){

    var result = fuzzQuery(data.process);
    equal(result, data.result);
});

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

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