ডেটা সাজানোর সময় কীভাবে পরীক্ষা করা যায় খুব জটিল?


19

আমি একটি পার্সার লিখছি এবং এর অংশ হিসাবে আমার একটি Expanderক্লাস রয়েছে যা একক জটিল বক্তব্যকে একাধিক সাধারণ বিবৃতিতে "প্রসারিত" করে। উদাহরণস্বরূপ, এটি এটি প্রসারিত করবে:

x = 2 + 3 * a

মধ্যে:

tmp1 = 3 * a
x = 2 + tmp1

এখন আমি এই ক্লাসটি কীভাবে পরীক্ষা করব, বিশেষত কীভাবে পরীক্ষাগুলি সাজানোর পদ্ধতি নিয়ে চিন্তা করছি thinking আমি ম্যানুয়ালি ইনপুট সিনট্যাক্স ট্রি তৈরি করতে পারি:

var input = new AssignStatement(
    new Variable("x"),
    new BinaryExpression(
        new Constant(2),
        BinaryOperator.Plus,
        new BinaryExpression(new Constant(3), BinaryOperator.Multiply, new Variable("a"))));

অথবা আমি এটি একটি স্ট্রিং হিসাবে লিখতে এবং এটি পার্স করতে পারে:

var input = new Parser().ParseStatement("x = 2 + 3 * a");

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

আমার প্রশ্ন হ'ল: এই Expanderশ্রেণীর পরীক্ষা করার জন্য এই ধরণের ইন্টিগ্রেশন পরীক্ষার উপর বেশিরভাগ (বা সম্পূর্ণ) নির্ভর করা কি ঠিক আছে ?


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

উত্তর:


27

আপনি যদি আরও সহজে পরীক্ষা করতে পারেন তবে নিজেকে আরও অনেক পরীক্ষার, আরও জটিল, আকর্ষণীয় এবং দরকারী আচরণের সন্ধান করতে যাচ্ছেন। সুতরাং বিকল্প যে জড়িত

var input = new Parser().ParseStatement("x = 2 + 3 * a");

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

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

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

var input = new AssignStatement(
    new Variable("x"),
    new BinaryExpression(
        new Constant(2),
        BinaryOperator.Plus,
        new BinaryExpression(new Constant(3), BinaryOperator.Multiply, new Variable("a"))));

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


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

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

পছন্দ করুন এটি স্বাধীন উপাদান ব্যবহার করা গুরুত্বপূর্ণ ।
জোনাথন ইউনিস

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

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

6

অবশ্যই ঠিক আছে!

আপনার সর্বদা কার্যকরী / সংহতকরণ পরীক্ষা প্রয়োজন যা সম্পূর্ণ কোডের পথটি ব্যবহার করে। এবং এই ক্ষেত্রে সম্পূর্ণ কোড পাথের অর্থ উত্পন্ন কোডের মূল্যায়ন সহ। এটিই আপনি পরীক্ষা করেছেন যে পার্সিংয়ের x = 2 + 3 * aফলে কোডটি তৈরি হয় যা যদি চালানো হয় a = 5তবে সেট xহয়ে যাবে 17এবং যদি চালানো a = -2হবে সেট xহয়ে যাবে -4

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


4

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

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

আদর্শভাবে আপনার উভয়ই থাকত তবে যে কোনও হারে, সাধারণত কোনও পরীক্ষা না হওয়ার চেয়ে একটি স্বয়ংক্রিয় পরীক্ষা নেওয়া ভাল।


0

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

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