আপনি কীভাবে একটি এনকোডার পরীক্ষা করবেন?


9

আমার এরকম কিছু রয়েছে:

public byte[] EncodeMyObject(MyObject obj)

আমি এইভাবে ইউনিট টেস্টিং করেছি:

byte[] expectedResults = new byte[3]{ 0x01, 0x02, 0xFF };
Assert.IsEqual(expectedResults, EncodeMyObject(myObject));

সম্পাদনা: আমি যে দুটি উপায় প্রস্তাব করেছি তা হ'ল:

1) উপরের উদাহরণের মতো হার্ডকডযুক্ত প্রত্যাশিত মানগুলি ব্যবহার করা।

2) এনকোডযুক্ত বাইট অ্যারে ডিকোড করতে একটি ডিকোডার ব্যবহার করে এবং ইনপুট / আউটপুট অবজেক্টের সাথে তুলনা করুন।

পদ্ধতি 1 টির সাথে আমি যে সমস্যাটি দেখছি তা হ'ল এটি খুব ভঙ্গুর এবং এর জন্য প্রচুর হার্ড কোডিং মান প্রয়োজন।

পদ্ধতি 2 এর সাথে সমস্যা হ'ল এনকোডারটি পরীক্ষা করা ডিকোডার সঠিকভাবে কাজ করে তার উপর নির্ভর করে। যদি এনকোডার / ডিকোডার সমানভাবে ভাঙা হয় (একই জায়গায়), তবে পরীক্ষাগুলি মিথ্যা ধনাত্মকতা তৈরি করতে পারে।

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


4
কিভাবে myObjectথেকে myObjectযায় { 0x01, 0x02, 0xFF }? সেই অ্যালগরিদম কি ভেঙে পরীক্ষা করা যায়? আমি জিজ্ঞাসার কারণটি বর্তমানে, মনে হচ্ছে আপনার একটি পরীক্ষা রয়েছে যা প্রমাণ করে যে একটি যাদু জিনিস অন্য যাদু জিনিস তৈরি করে। আপনার একমাত্র আত্মবিশ্বাস হ'ল এক ইনপুটটি একটি আউটপুট উত্পাদন করে। আপনি যদি অ্যালগরিদমকে ভেঙে ফেলতে পারেন তবে আপনি অ্যালগরিদমের প্রতি আরও আস্থা অর্জন করতে পারেন এবং যাদুকরী ইনপুট এবং আউটপুটগুলিতে কম নির্ভরশীল হতে পারেন।
অ্যান্টনি পেগ্রাম

3
@ কোডিজম যদি এনকোডার এবং ডিকোডার একই জায়গায় ভেঙে যায় তবে কী হবে?
কন্ডিশন

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

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

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

উত্তর:


1

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

আমি যা করবো তা হল বিমূর্তির স্তর দ্বারা জিনিসগুলি ভেঙে ফেলার চেষ্টা করা।

সুতরাং আমি কিছুটা বিট স্তরের সাথে শুরু করব, আমি এরকম কিছু পরীক্ষা করবো

bitWriter = new BitWriter();
bitWriter.writeInt(42, bits = 7);
assertEqual( bitWriter.data(), {0x42} )

সুতরাং ধারণাটি হ'ল বিট রাইটার কীভাবে সবচেয়ে প্রাচীন ধরণের ক্ষেত্রগুলি যেমন কীট লেখেন তা জানে।

আরও জটিল ধরণের কিছু প্রয়োগ করে পরীক্ষিত হবে:

bitWriter = new BitWriter();
writeDate(bitWriter, new Datetime(2001, 10, 4));

bitWriter2 = new BitWriter();
bitWriter2.writeInt(2001, 12)
bitWriter2.writeInt(10, 4)
bitWriter2.writeInt(4, 6)

assertEquals(bitWriter.data(), bitWriter2.data() )

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

তারপরে বিমূর্তির পরবর্তী স্তরে আমরা থাকতাম

bitWriter = new BitWriter();
encodeObject(bitWriter, myObject);


bitWriter2 = new BitWriter();
bitWriter2.writeInt(42, 32)
writeDate(bitWriter2, new Datetime(2001, 10, 4));
writeVarString(bitWriter2, "alphanumeric");

assertEquals(bitWriter.data(), bitWriter2.data() )

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

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


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

6

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

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


2
মনে করুন আপনি ডিকোডার ব্যবহার করেন এবং মানগুলি তুলনা করুন। যদি এনকোডার এবং ডিকোডার দুটি একই জায়গায় ভেঙে যায় তবে কী হবে? এনকোডারটি ভুলভাবে এনকোড করে এবং ডিকোডারটি ভুলভাবে ডিকোড করে তবে ইনপুট / আউটপুট অবজেক্টগুলি সঠিক কারণ প্রক্রিয়াটি দুটিবার ভুলভাবে করা হয়েছিল।
কন্ডিশন

@ জাস্টিন ৯৮৪ এরপরে তথাকথিত "টেস্ট ভেক্টর" ব্যবহার করুন, ইনপুট / আউটপুট জুড়িগুলি জেনে নিন যা আপনি কোনও এনকোডার এবং ডিকোডার পরীক্ষা করতে সঠিকভাবে ব্যবহার করতে পারেন
র‌্যাচেট ফ্রেইক

@ratchet freak যা প্রত্যাশিত মানগুলির সাথে পরীক্ষায় ফিরে আসে। কোনটি ভাল, আমি বর্তমানে এটি করছি, তবে এটি কিছুটা ভঙ্গুর তাই আমি আরও ভাল উপায় আছে কিনা তা দেখার জন্য খুঁজছিলাম।
কন্ডিশন

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

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

3

পরীক্ষা encode(decode(coded_value)) == coded_valueএবং যে decode(encode(value)) == value। আপনি চাইলে পরীক্ষাগুলিতে একটি এলোমেলো ইনপুট দিতে পারেন।

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

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


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

কীভাবে 'প্রশংসামূলক ত্রুটি' থাকতে পারে? এটি সূচিত করে যে এনকোডযুক্ত ফর্মের জন্য একটি বাহ্যিক স্পেসিফিকেশন রয়েছে এবং তাই বাহ্যিক ডিকোডার।
কেভিন cline

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

যদি এনকোডারটি ROT13 বাস্তবায়নের কথা ছিল তবে দুর্ঘটনাক্রমে ROT14 করেছে এবং ডিকোডারটিও করেছে, তবে ডিকোড (এনকোড ('a')) == 'a' তবে এনকোডারটি এখনও ভাঙা। তার চেয়ে অনেক জটিল বিষয়গুলির জন্য, সম্ভবত এই ধরণের জিনিসটি ঘটে যাওয়ার খুব কম সম্ভাবনা রয়েছে, তবে তাত্ত্বিকভাবে এটি হতে পারে।
মাইকেল শ

@ মিশেলশা কেবলমাত্র ট্র্যাভিয়ার এক টুকরো, আরওটি 13 এর এনকোডার এবং ডিকোডার একই; ROT13 এর নিজস্ব বিপরীত। আপনি যদি ভুল করে ROT14 প্রয়োগ করেন তবে decode(encode(char))সমান হবে না char(এটি সমান হবে char+2)।
টম মার্থেনাল

2

প্রয়োজনীয়তা পরীক্ষা করুন

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

যদি ডেটা স্ট্রিমের জন্য অন্য প্রয়োজনীয়তা থাকে তবে আপনাকে এনকোডড ডেটা পরীক্ষা করে এগুলি পরীক্ষা করতে হবে।

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


1

আপনি যে টেস্টিং ফ্রেমওয়ার্ক এবং দৃষ্টান্তটি ব্যবহার করছেন তার উপর নির্ভর করে আপনি এখনও যেমনটি বলেছেন তার জন্য অ্যারেঞ্জ অ্যাক্ট এ্যাসেট প্যাটার্নটি ব্যবহার করতে পারেন।

[TestMethod]
public void EncodeMyObject_ForValidInputs_Encodes()
{
    //Arrange object under test
    MyEncoder encoderUnderTest = new MyEncoder();
    MyObject validObject = new MyOjbect();
    //arrange object for condition under test

    //Act
    byte[] actual = encoderUnderTest.EncodeMyObject(myObject);

    //Assert
    byte[] expected = new byte[3]{ 0x01, 0x02, 0xFF };
    Assert.IsEqual(expected, actual);
}

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

যেহেতু প্রত্যাশিতগুলি হার্ড কোডড, তাই আপনি যদি একটি বিশাল পরিবর্তন পান তবে এগুলি ভঙ্গুর হবে।

আপনি কিছু প্যারামিটার চালিত সঙ্গে স্বয়ংক্রিয় করতে সক্ষম হতে পারে (কটাক্ষপাত আছে Pex ) অথবা যদি আপনি DDD বা BDD করছেন কটাক্ষপাত আছে gerkin / শসা


1

আপনার পক্ষে কোনটি গুরুত্বপূর্ণ তা আপনি সিদ্ধান্ত নিতে পারেন।

আপনার পক্ষে কী গুরুত্বপূর্ণ যে কোনও অবজেক্ট রাউন্ড ট্রিপে বেঁচে আছে, এবং তারের সঠিক বিন্যাসটি সত্যই গুরুত্বপূর্ণ নয়? বা সঠিক তারের ফর্ম্যাটটি আপনার এনকোডার এবং ডিকোডারের কার্যকারিতার একটি গুরুত্বপূর্ণ অংশ?

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

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

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