একটি REST সার্ভারের বিরুদ্ধে একটি REST ক্লায়েন্ট পরীক্ষা করা। কীভাবে ফিক্সার করবেন?


10

ইউনিট টেস্টগুলি লেখার সময়, ফিক্সচারগুলি ব্যবহার করা সাধারণ: সামান্য টেস্টেবল ডেটা, তাই আমরা বলতে পারি: ১. সমস্ত ক্লায়েন্টকে উইলি ওয়াঙ্কা অন্তর্ভুক্ত করা উচিত Get 2. ক্লায়েন্ট 3 মুছুন, এবং এখন ক্লায়েন্টদের আর উইলি ওনকা অন্তর্ভুক্ত করা উচিত না পেতে।

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

তবে আমরা যখন আরইএসটি ক্লায়েন্ট থেকে আরআরএসটি সার্ভারটি আলাদা করেছি তখন কী হবে?

আমরা নিশ্চিত করতে চাই যে আমাদের আরএসইটি ক্লায়েন্টটি কেবল সঠিকভাবে পড়ছে না, তবে সঠিকভাবে তৈরি করা, আপডেট করা এবং মুছে ফেলা হচ্ছে।

রিমোট টেস্ট REST সার্ভারের বিরুদ্ধে এটি কীভাবে করা যায় তার জন্য আমি কোনও উদাহরণ বা পরামর্শ খুঁজে পাইনি

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

আমি এটি করতে প্রথমে হতে পারি না, তাই আমার এই অনুভূতি আছে যে এটি সম্পর্কে আমার চিন্তাভাবনা করার আলাদা উপায় দরকার।

কোন পরামর্শ?


সম্ভবত, যেহেতু এটি একটি পরীক্ষার সার্ভার তাই আপনার একটি শেষ পয়েন্ট থাকতে পারে যা ফিক্সচারগুলি পুনরায় লোড করবে?
ডেভিড র‌্যাডক্লিফ

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

উত্তর:


7

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

সে লক্ষ্যে, আমি আপনি যা করার চেষ্টা করছেন তা করার বিরুদ্ধে সুপারিশ করব।

বিশেষ করে:

আমরা নিশ্চিত করতে চাই যে আমাদের আরএসইটি ক্লায়েন্টটি কেবল সঠিকভাবে পড়ছে না, তবে সঠিকভাবে তৈরি করা, আপডেট করা এবং মুছে ফেলা হচ্ছে।

পরিবর্তে আমি যা প্রস্তাব করব তা হ'ল:

  • নির্দিষ্ট আর ইনপুট এবং আউটপুট প্রদেয় এটি সঠিকভাবে আচরণ করে তা নিশ্চিত করার জন্য আপনার আরএসটি ক্লায়েন্টের জন্য বিল্ডিং পরীক্ষা tests ভাল (প্রত্যাশিত) এবং খারাপ (অপ্রত্যাশিত) মানের জন্য অ্যাকাউন্ট।

  • আপনার আরএসটি পরিষেবাদির জন্য বিল্ডিং টেস্টগুলি (যদি আপনি এটি নিয়ন্ত্রণ করেন তবে এটি হয়) এর উদ্দেশ্যযুক্ত ফাংশন অনুযায়ী আচরণ করা

  • পরীক্ষাগুলি তাদের সমস্যা ডোমেনের কাছাকাছি রাখুন, যাতে তারা সেই প্রসঙ্গে গুরুত্বপূর্ণ বিষয়গুলির নকশা এবং বিকাশকে গাইড করতে সহায়তা করতে পারে


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

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

কোনও এপিআইকে উপহাস করা সমস্যা সমাধানের দুর্দান্ত উপায়। তবে আপনি কীভাবে নিশ্চিত হন যে API == আসল এপিআইকে উপহাস করেছে?
ফ্রিএইচএমএঁ

4

এখানে দুটি এঙ্গেল মনে রাখতে হবে:

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

2

আমি মনে করি REST সার্ভারের প্রতিক্রিয়াগুলি নকল করা ক্লায়েন্টকে পরীক্ষা করার সেরা উপায় way

রুবির জন্য, ফেকওয়েব রত্ন রয়েছে যা আপনি নকল প্রতিক্রিয়া নির্ধারণ করতে ব্যবহার করতে পারেন - https://github.com/chrisk/fakeweb

এছাড়াও, জাভাস্ক্রিপ্টে আপনি সিনোন.জেএস এর মতো কিছু ব্যবহার করতে পারেন যা আপনাকে একটি নকল সার্ভার দেয় - http://sinonjs.org/docs/#fakeServer


1

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

urllib2অনুরোধ করার জন্য ব্যবহার করে এমন একটি হাইগল্পিক পাইথন ক্লায়েন্ট নিন Take আপনার ক্লায়েন্টে সম্ভবত কিছু পদ্ধতি রয়েছে, আসুন এটি কল করুন get(), এটিতে একটি কল রয়েছে urllib2.Request()। আপনার কেবল নিজের ক্লাসের কলকে উপহাস করা দরকার get()

@patch('your.Client.get')
def test_with_mock(self, your_mock):
    your_mock.return_value({'some': 'json'})
    test_obj = your.Client.get_object(5)
    your_mock.assert_called_with('/the/correct/endpoint/5')

এই অতি সরল উদাহরণটি পাইথনের মক লাইব্রেরিটি এমন your.Clientএকটি get_object()পদ্ধতির মাধ্যমে অনুমানের ক্লাস পরীক্ষা করতে ব্যবহার করে যা কিছু এপিআই থেকে কিছু পাওয়ার জন্য সঠিক url উত্পন্ন করে। অনুরোধটি করার জন্য ক্লায়েন্ট তার get()ইউআরএলটির সাথে এই পদ্ধতিটি কল করে । এখানে, সেই পদ্ধতিটি উপহাস করা হয়েছে ( your.Client.getএটি "প্যাচড" যাতে এটি নিয়ন্ত্রণে থাকে your_mock), এবং পরীক্ষাটি পরীক্ষা করে সঠিক ডানদিকের অনুরোধ করা হয়েছে কিনা তা পরীক্ষা করে।

উপহাসের পদ্ধতিটি কনফিগার করা JSON প্রতিক্রিয়া ( your_mock.return_value) প্রদান করে যা ক্লায়েন্টকে পরিচালনা করতে হবে এবং আপনি এটি প্রত্যাশিত উপায়ে প্রত্যাশিত ডেটা পরিচালনা করেছেন কিনা তা পরীক্ষা করার জন্য আরও জোর দিয়েছিলেন।


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

1

আপনি যা বর্ণনা করেছেন তা হ'ল একীকরণ পরীক্ষার দৃশ্য। এগুলি সাধারণত সেটআপ এবং টিয়ার জন্য কিছুটা বিশ্রী হয়। এটি তাদের চালাতে ধীর এবং বেশিরভাগ ক্ষেত্রে ভঙ্গুর করে তোলে।

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

আপনার পরিস্থিতি সম্পর্কে আমি যেভাবে যাব তা হ'ল API অ্যাপ্লিকেশনের স্টেট বা এর ডেটাবেসগুলিতে পরীক্ষা-নির্দিষ্ট নিয়ন্ত্রণ গ্রহণ করা। আপনার কাছে হয় সেটআপ এবং টিয়ারডাউনগুলির জন্য অতিরিক্ত এন্ডপয়েন্ট থাকতে পারে, যা কেবল পরীক্ষার পরিবেশে উপস্থিত। অথবা বিকল্পভাবে, আপনি আপনার অ্যাপ্লিকেশন / এপিআই এর পিছনে ডাটাবেস (বা আপনি যা ব্যবহার করছেন) এর সাথে কথা বলছেন।

যদি আপনি মনে করেন এটি অনেক বেশি (অযৌক্তিক অর্থে) প্রচেষ্টা করা হয়, তবে বিবেচনা করুন যে ডাটাবেসগুলির জন্য ফিক্সচারগুলির সাথে পদ্ধতির কাজটি কেবল এটি করে: ডেটাবেস বা অ্যাপ্লিকেশনের পরিস্থিতিটি পরিচালনা করার জন্য অতিরিক্ত, পরীক্ষামূলক-নির্দিষ্ট উপায় ব্যবহার করে।

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


1

বানর প্যাচ

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

উপকারিতা

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

Tradeoffs

  • মাল্টি-প্রসেস ইন্টারঅ্যাকশন / ইস্যুগুলি (লকিং, রিসোর্স অনাহার ইত্যাদি) প্রকাশ করে না
  • মাল্টি-সার্ভার সমস্যাগুলি প্রকাশ করে না (ডেটা সিরিয়ালাইজেশন, ক্লাস্টারিং স্টাইল)
  • নেটওয়ার্ক সমস্যাগুলি প্রকাশ করে না কারণ এটি সিমুলেটেড (অ্যাক্সেস, সময়সীমা ত্রুটি ইত্যাদি) etc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.