আমি এমন কোনও সিস্টেমকে কীভাবে পরীক্ষা করব যেখানে অবজেক্টগুলি উপহাস করা কঠিন?


34

আমি নিম্নলিখিত সিস্টেমের সাথে কাজ করছি:

Network Data Feed -> Third Party Nio Library -> My Objects via adapter pattern

আমাদের সম্প্রতি একটি সমস্যা হয়েছিল যেখানে আমি যে লাইব্রেরিটি ব্যবহার করছি তার সংস্করণ আপডেট করেছি, যা অন্যান্য বিষয়গুলির সাথে টাইমস্ট্যাম্পগুলির (যা তৃতীয় পক্ষের লাইব্রেরি হিসাবে প্রত্যাবর্তন করে long), যুগের পরে মিলি সেকেন্ড থেকে ন্যানোসেকেন্ডে পরিবর্তিত হয়েছিল।

সমস্যাটি:

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

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

প্রশ্নটি:

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

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


3
আপনার "রেকর্ড" একটি বাস্তব ডেটা ফিড এবং পরে এটি তৃতীয় পক্ষের লাইব্রেরিতে "প্লে" করতে পারে?
ইদান আরে

2
কেউ এই জাতীয় সমস্যার উপর একটি বই লিখতে পারে। প্রকৃতপক্ষে, মাইকেল পালকেরা কেবল সেই বইটি লিখেছিলেন : c2.com/cgi/wiki?WorkingEffectivelyWithLegacyCode এতে তিনি কঠিন নির্ভরতা ভাঙার জন্য বেশ কয়েকটি কৌশল বর্ণনা করেছেন যাতে কোডটি আরও পরীক্ষামূলক হয়ে উঠতে পারে।
cbojar

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

4
বিল্ট-ইনগুলির মন্দগুলির একটি নিখুঁত চিত্রণ। লাইব্রেরি কেন কোনও Timestampক্লাস ফেরত না (তাদের যে কোনও উপস্থাপনা রয়েছে) এবং নামযুক্ত পদ্ধতিগুলি সরবরাহ করে না (.seconds() , .milliseconds(), .microseconds(), .nanoseconds()) এবং অবশ্যই নামে কনস্ট্রাকটর করুন। তাহলে কোনও সমস্যা হত না।
ম্যাথিউ এম।

2
"কোডিংয়ের সমস্ত সমস্যা ইন্ডিয়ারেশনের একটি স্তর দ্বারা সমাধান করা যেতে পারে (বাদে অবশ্যই, অনেক বেশি স্তর পরিচালনার সমস্যা বাদে") এই কথাটি এখানে মনে আসে ..
ড্যান প্যান্ট্রি

উত্তর:


27

মনে হচ্ছে আপনি ইতিমধ্যে যথাযথ পরিশ্রম করছেন। তবে ...

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

[TestMethod]
public void MyFormatter_FormatsTimesCorrectly() {

  // this test isn't necessarily about the stream or the external interpreter.
  // but ... we depend on them working how we think they work:
  var stream = new StreamThingy();
  var interpreter = new InterpreterThingy(stream);
  stream.Write("id-123, some description, 12345");

  // this is what you're actually testing. but, it'll also hiccup
  // if your 3rd party dependencies introduce a breaking change.
  var formatter = new MyFormatter(interpreter);
  var line = formatter.getLine();
  Assert.equal(
    "some description took 123.45 seconds to complete (id-123)", line
  );
}

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

মনে করুন আপনার একটি JSON পার্সার কীভাবে JSON স্ট্রিংয়ে প্রতিটি "টাইপ" ব্যাখ্যা করে তার উপর নির্ভর করে এবং নির্ভর করতে হবে । এটি আপনার স্যুটটিতে এর মতো কিছু অন্তর্ভুক্ত করা সহায়ক এবং তুচ্ছ:

[TestMethod]
public void JSONParser_InterpretsTypesAsExpected() {
  String datastream = "{nbr:11,str:"22",nll:null,udf:undefined}";
  var o = (new JSONParser()).parse(datastream);

  Assert.equal(11, o.nbr);
  Assert.equal(Int32.getType(), o.nbr.getType());
  Assert.equal("22", o.str);
  Assert.equal(null, o.nll);
  Assert.equal(Object.getType(), o.nll.getType());
  Assert.isFalse(o.KeyExists(udf));
}

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

এবং একটি উল্লেখযোগ্য ডিগ্রীতে, এটি কেবল সাধারণ।

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


ওহ, আমি আশা করি এটি লাইব্রেরিতে কোনও জসন স্ট্রিং খাওয়ানোর মতোই সহজ ছিল। এটা না। আমি এর সমতুল্য করতে পারি না (new JSONParser()).parse(datastream), কারণ তারা সরাসরি NetworkInterfaceএবং যে সমস্ত শ্রেণীর আসল পার্সিং করে সেগুলি থেকে ডেটা ধরে নেওয়া হয় প্যাকেজটি ব্যক্তিগত এবং অগ্রগামী।
durron597

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

@ durron597 ওহ, এটি প্রায় কখনও হয় না। তবে, আপনি প্রায়শই অন্তর্নিহিত ডেটা উত্সটি নকল করতে পারেন - প্রথম কোড উদাহরণের মতো। ... পয়েন্ট হল: পূর্ণ-লুপ ইন্টিগ্রেশন পরীক্ষার না যখন সম্ভব, গ্রন্থাগার যখন সম্ভব আপনার বোঝার পরীক্ষা, এবং শুধুমাত্র জেনে রাখুন যে আপনি হতে হবে এখনও বন্য মধ্যে বাগ যাক। এবং আপনার তৃতীয় পক্ষের বিক্রেতাদের অবশ্যই অদৃশ্য, পরিবর্তনগুলি ভাঙ্গার জন্য দায়বদ্ধ হতে হবে।
এসভিডজেন

@ durron597 আমি NetworkInterface... এর সাথে পরিচিত নই ... এটি কি এমন কিছু যা আপনি লোকালহোস্টের কোনও বন্দরের সাথে ইন্টারফেসের সাথে সংযুক্ত করে ডেটা ফিড করতে পারেন?
এসভিডজেন

NetworkInterface। এটি সরাসরি কোনও কার্ড কার্ডের সাথে কাজ করার জন্য এবং এটিতে সকেট খোলার জন্য একটি নিম্ন স্তরের অবজেক্ট
durron597

11

সংক্ষিপ্ত উত্তর: এটি কঠিন। আপনি সম্ভবত অনুভব করছেন যে কোনও ভাল উত্তর নেই, এবং এটি কারণ কোনও সহজ উত্তর নেই।

দীর্ঘ উত্তর: @ অ্যাপটিক্স যেমন বলেছেন , আপনার সিস্টেম টেস্ট এবং ইন্টিগ্রেশন টেস্টের পাশাপাশি ইউনিট টেস্টগুলি দরকার:

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

কিছু নির্দিষ্ট পরামর্শ:

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

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


7

আমি লাইব্রেরির সংস্করণটি আপডেট করেছি… যা… টাইমস্ট্যাম্পগুলির কারণে ঘটায় (যা তৃতীয় পক্ষের লাইব্রেরি হিসাবে ফিরে আসে) long ), যুগের পরে মিলি সেকেন্ড থেকে ন্যানোসেকেন্ডে পরিবর্তিত হয়েছিল।

...

এটি লাইব্রেরিতে কোনও বাগ নয়

আমি এখানে আপনার সাথে দৃ strongly়ভাবে একমত। এটি লাইব্রেরির একটি বাগ , বাস্তবে বরং कपटी। তারা প্রত্যাবর্তনের মানের সিনমেটিক ধরণের পরিবর্তন করেছে, তবে রিটার্নের মানের প্রোগ্রাম্যাটিক ধরণের পরিবর্তন করেনি। এটি সমস্ত ধরণের সর্বনাশকে ধ্বংস করতে পারে, বিশেষত যদি এটি একটি ছোটখাটো সংস্করণ b

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

TimeSinceEpochআরও সূক্ষ্মতা যুক্ত হওয়ার সাথে সাথে এর ইন্টারফেসটিকে মানিয়ে নিতে পারে এমন কোনও বস্তু হতে পারে যেমন #toLongNanosecondsপদ্ধতির পাশাপাশি একটি পদ্ধতি যুক্ত করা #toLongMilliseconds, আপনার কোডে কোনও পরিবর্তন প্রয়োজন না।

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


2
@ durron597 আমি এখনও দাবি করব যে এটি একটি বাগ। ডকুমেন্টেশনের অভাবের বাইরে, কেন মোটেই প্রত্যাশিত আচরণ বদলাবেন? কেন একটি নতুন পদ্ধতি যা নতুন নির্ভুলতা সরবরাহ করে না এবং পুরানো পদ্ধতিটি এখনও মিলিস সরবরাহ করতে দেয়? এবং কেন রিটার্নের ধরণের পরিবর্তনের মাধ্যমে সংকলককে আপনাকে সতর্ক করার জন্য কোনও উপায় সরবরাহ করবেন না? এটি কেবলমাত্র ডকুমেন্টেশনে নয়, কোডেও এটিকে আরও পরিষ্কার করে তুলতে খুব বেশি লাগে না।
cbojar

1
@gbjbaanb, "তাদের মুক্তির অনুশীলন খুব খারাপ" আমার কাছে একটি বাগের মতো মনে হচ্ছে
আর্টুরো টরেস সানচেজ

2
@gbjbaanb একটি তৃতীয় পক্ষের গ্রন্থাগারটি এর ব্যবহারকারীদের সাথে "চুক্তি" করা উচিত [।] সেই চুক্তিটি ভঙ্গ করা - এটি নথিভুক্ত হোক বা না - এটি কোনও বাগ হিসাবে বিবেচনা করা উচিত। অন্যরা যেমন বলেছে, আপনার যদি অবশ্যই কিছু পরিবর্তন করতে হয় তবে একটি নতুন ফাংশন / পদ্ধতি (সিএফ ...Ex()। উইন 32 এপিআইয়ের সমস্ত পদ্ধতি) সহ চুক্তিতে যুক্ত করুন। যদি এটি সম্ভব না হয় তবে ফাংশনটির নাম পরিবর্তন করে চুক্তিটি "ভাঙ্গা" করা (বা তার রিটার্নের ধরণ) আচরণের পরিবর্তনের চেয়ে আরও ভাল।
ট্রিপহাউন্ড

1
এটি লাইব্রেরির একটি বাগ। দীর্ঘক্ষণ ন্যানোসেকেন্ড ব্যবহার করা এটি চাপ দিচ্ছে।
জোশুয়া

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

5

আপনার একীকরণ এবং সিস্টেম পরীক্ষা দরকার।

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

আপনার পণ্যটির বাহ্যিক সিস্টেমগুলির সাথে সামান্য মিথস্ক্রিয়া না থাকলে বা সিস্টেমগুলির সাথে এত পরিচিত, স্থিতিশীল এবং নথিভুক্ত হয়ে থাকে যে তাদের আত্মবিশ্বাসের সাথে ঠাট্টা করা যায় (এটি সত্যিকারের বিশ্বে খুব কমই ঘটে) - ইউনিট পরীক্ষাগুলি পর্যাপ্ত নয়।

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


2

সর্বনিম্ন প্রোটোটাইপ তৈরি করা এবং গ্রন্থাগারটি ঠিক কীভাবে কাজ করে তা বোঝা ভাল হবে। এটি করার মাধ্যমে, আপনি দুর্বল ডকুমেন্টেশন সহ লাইব্রেরি সম্পর্কে কিছু জ্ঞান অর্জন করতে পারবেন। একটি প্রোটোটাইপ একটি সর্বনিম্ন প্রোগ্রাম হতে পারে যা সেই লাইব্রেরিটি ব্যবহার করে এবং কার্যকারিতা করে।

অন্যথায়, এটি অর্ধ-সংজ্ঞায়িত প্রয়োজনীয়তা এবং সিস্টেমটির দুর্বল বোঝার সাথে ইউনিট পরীক্ষাগুলি লেখার কোনও ধারণা রাখে না।

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


1

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

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


এটি আসলে প্রশ্নের উত্তর দেয় না। আমি ইতিমধ্যে আমার সিস্টেম থেকে গ্রন্থাগারকে আলাদা করার একটি স্তর পেয়েছি, তবে সমস্যাটি হ'ল আমার বিমূর্ত স্তরটি "বাগগুলি" থাকতে পারে যখন আমার উপর লাইব্রেরি সতর্কতা ছাড়াই পরিবর্তিত হয়।
durron597

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

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

এই দাবিগুলি প্রয়োজনীয়ভাবে উত্পাদন চলমানগুলিতে চালিত হয় না, তবে পরীক্ষার সময় এগুলি কার্যকর করা হয়, আপনার বিচ্ছিন্ন স্তরটির সাদা-বাক্সের দৃষ্টিভঙ্গি রয়েছে এবং সুতরাং এটি নিশ্চিত করতে সক্ষম হয়ে (যতটা সম্ভব) আপনার স্তরটি লাইব্রেরি থেকে প্রাপ্ত তথ্য শব্দ।
মাইক নাকিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.