জটিল এপিআই (উদাহরণস্বরূপ অ্যামাজন এস 3) এর উপর নির্ভরশীল কোড কীভাবে পরীক্ষা করবেন?


13

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

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

  2. মোক এস 3। এটি অত্যন্ত লোমশ কারণ কারণ object বস্তুর অভ্যন্তরীণ সম্পর্কে আমার কোনও ধারণা নেই এবং এটি ভুল অনুভব করে কারণ এটি উপায় খুব জটিল।

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

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

আমি কীভাবে এটি সমাধান করব?


কোনও উত্তর নয়, তবে বাস্তবে আমরা প্রকাশিত তিনটি পদ্ধতির ব্যবহার করব।
jlhonora

উত্তর:


28

এখানে দুটি বিষয় আমাদের দেখতে হবে।

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

দ্বিতীয়টি হ'ল আপনি তৃতীয় পক্ষের কোডগুলিতে আপনার ব্যবসায়িক যুক্তির সাথে মিশ্রিত করছেন, পরীক্ষার চ্যালেঞ্জ তৈরি করছেন এবং সম্ভবত আপনার কোডটিকে আরও ভঙ্গুর করে তুলছেন।

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

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

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

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

ভাল, আমরা না। আমরা যদি গাইডলাইনটি অনুসরণ করি তবে আমরা নিজের মালিকানাযুক্ত জিনিসগুলিকে উপহাস করতে পারি না। তবে ... আমরা যদি আমাদের প্রত্যক্ষ নির্ভরশীলতার মালিক হয়ে থাকি তবে আমরা সেগুলি উপহাস করতে পারি। কিন্তু কিভাবে? আমরা এস 3 এপিআইয়ের জন্য আমাদের নিজস্ব মোড়ক তৈরি করি। আমরা এটিকে অনেকগুলি এস 3 এপিআইয়ের মতো দেখতে তৈরি করতে পারি, বা আমরা এটি আমাদের চাহিদা আরও নিবিড়ভাবে ফিট করতে পারি (পছন্দসই)। আমরা এটিকে আরও কিছুটা বিমূর্ত করতে পারি, PersistenceServiceবরং একটি বলুন AmazonS3BucketPersistenceServiceমত পদ্ধতি সঙ্গে একটি ইন্টারফেস হবে #save(Thing)এবং #fetch(ThingId), পদ্ধতি ধরনের আমরা দেখতে দেখতে পারেন (এই উদাহরণ আছে, আপনি আসলে বিভিন্ন পদ্ধতি চাইতে পারেন)। আমরা এখন PersistenceServiceএস S3PersistenceServiceকলিং কোড থেকে দূরে সজ্জিত করে এস 3 এপিআই (একটি বলুন ) এর আশেপাশে একটি বাস্তবায়ন করতে পারি ।

এখন কোডটি যা এস 3 এপিআই কল করে। আমাদের সেই কলগুলিকে কোনও PersistenceServiceবস্তুর কল সহ প্রতিস্থাপন করতে হবে । আমরা আমাদের অবজেক্টে প্রবেশের জন্য নির্ভরতা ইনজেকশন ব্যবহার করি PersistenceService। এটির জন্য জিজ্ঞাসা করা নয়S3PersistenceService , তবে একটি জিজ্ঞাসা করা গুরুত্বপূর্ণ PersistenceService। এটি আমাদের আমাদের পরীক্ষার সময় বাস্তবায়নটি সরিয়ে নিতে সহায়তা করে।

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

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

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


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

@ ইয়র্কিন আমি যেমন এটি নিয়ে ভাবছি, আমি নিশ্চিত যে আমি এই প্রশ্নের আরও দীর্ঘ উত্তর পূরণ করতে পারি। এটি আপনার পক্ষে এমনকি সার্থক হতে পারে কারণ আপনি কেবল আমার প্রতিক্রিয়া থেকে বেশি পেতে পারেন।
cbojar

4

আপনার দুটোই করা দরকার।

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

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

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


2

আমি বলব যে এটি আপনার API এর ব্যবহারের জটিলতার উপর নির্ভর করে

  1. আপনার অবশ্যই কমপক্ষে কিছু পরীক্ষা করা দরকার যা আসলে এস 3 এপিআইকে আহ্বান করে এবং নিশ্চিত করে যে এটি শেষ থেকে শেষ পর্যন্ত কাজ করেছে।

  2. আপনার অবশ্যই অতিরিক্ত পরীক্ষা করা দরকার যা প্রকৃতপক্ষে এপিআই কল করে না, তাই আপনি আপনার নিজের সফ্টওয়্যারটিকে যথাসময়ে টেপ করতে পারবেন পুরো সময়টি এআইপি না করেই।

যে প্রশ্নটি রয়ে গেছে তা হ'ল: আপনার কি এপিআইকে উপহাস করা দরকার?

এবং আমি মনে করি এটি নির্ভর করে যে আপনি এটির সাথে কতটা করেন। আপনি যদি কেবল একটি বা দুটি সাধারণ ক্রিয়া সম্পাদন করে থাকেন তবে আমি মনে করি না যে আপনাকে মক-আপের সমস্ত সমস্যায় যাওয়ার দরকার আছে। আমি কেবল আমার ফাংশনগুলির ব্যবহার পরীক্ষা করে এবং কিছু লাইভ টেস্টিং করে সন্তুষ্ট হব।

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


1

পূর্ববর্তী উত্তরগুলি যুক্ত করে, মূল প্রশ্নটি হল আপনি (এবং কীভাবে) আপনার পরীক্ষার জন্য এস 3 এপিআইকে উপহাস করতে চান কিনা।

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

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

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

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