ইউনিট একটি এপিআই ক্লায়েন্ট এবং মোড়ক পরীক্ষা করে


14

আমি বিকাশ করা একটি API ক্লায়েন্ট লাইব্রেরি ইউনিট পরীক্ষা করার সর্বোত্তম উপায় বের করার চেষ্টা করে আমি চেনাশোনাগুলিতে ঘুরছি। লাইব্রেরিতে একটি Clientশ্রেণি রয়েছে যা মূলত এপিআই দিয়ে 1: 1 ম্যাপিং করে এবং একটি অতিরিক্ত Wrapperশ্রেণি যা শীর্ষের উপরে আরও বেশি ব্যবহারকারী-বান্ধব ইন্টারফেস সরবরাহ করে Client

Wrapper --> Client --> External API

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

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

পরিশেষে, আমি প্রোগ্রামার এসই এর অন্য একটি উত্তর থেকে এটি পড়েছি :

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

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

যাইহোক, আমি এখনও Wrapperক্লাসের সাথে আটকে আছি । আমি নিম্নলিখিত বিকল্পগুলি দেখতে পাচ্ছি:

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

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

  3. আমি কেবল পরীক্ষা করেছি যে উপযুক্ত এইচটিটিপি অনুরোধ করা হচ্ছে। এর অর্থ এই যে এইচটিটিপি অনুরোধগুলি করার জন্য Wrapperকোনও সত্যিকারের Clientঅবজেক্টের মাধ্যমে কল করা হবে , তাই আমি বাস্তবে এটি বিচ্ছিন্নভাবে পরীক্ষা করছি না। এটি কিছুটা ভয়ঙ্কর ইউনিট পরীক্ষা করে তোলে।

সুতরাং আমি এই সমাধানগুলির সাথে বিশেষভাবে সন্তুষ্ট নই। আপনি কি করতে চান? এটি সম্পর্কে কোন সঠিক উপায় আছে?


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

উত্তর:


10

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


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

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

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

স্টাব আপনাকে পরিষেবার কার্যকরী বাস্তবায়ন তৈরি করতে দেবে, তবে পরিষেবাটির নীচে কোনও স্তর প্রয়োগ না করেই।

আপনি এটি সম্পাদন করতে একটি ডিআই ভিত্তিক সমাধান ব্যবহার করে বিবেচনা করতে পারেন, আরআরএসটি সংস্থার নীচে রিপোজিটরি প্যাটার্ন প্রয়োগ করে:

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

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

আছে HTH

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