আমি কীভাবে এমন ক্লাস পরীক্ষা করতে পারি যাতে একটি ওয়েব পরিষেবা কল প্রয়োজন?


21

আমি এমন একটি ক্লাস পরীক্ষা করার চেষ্টা করছি যা কিছু হ্যাডোপ ওয়েব পরিষেবাদি কল করে। কোডটি ফর্মের বেশিরভাগ অংশ:

method() {
    ...use Jersey client to create WebResource...
    ...make request...
    ...do something with response...
}

যেমন একটি তৈরি ডিরেক্টরি পদ্ধতি আছে, একটি ফোল্ডার পদ্ধতি তৈরি করুন ইত্যাদি

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


5
নিজের মালিকানাধীন জিনিসগুলি উপহাস না করার বিষয়ে আপনি কোথায় গাইডেন্স দেখেছেন? আপনার কাছে জিনিসগুলি উপহাস করার কারণ এটি একটি বিশাল কারণ বলে মনে হচ্ছে ...
থমাস ওয়ানস

1
আমি ব্লগে অনেক এটা পড়তে, যা রেফারেন্স এটি এক করেছি amazon.com/Growing-Object-Oriented-Software-Guided-Tests/dp/... যা আমি জানি একটি ভাল-গণ্য বই (হয় blog.8thlight। com / এরিক-স্মিথ / 2011/10/27 / থ্যাটস-নন-ইয়োর এইচটিএমএল , মকবজেক্টস /2007/04/test-smell-everything-is-mocked.html )
ক্রিস কুপার

1
@ ক্রিসকোপার: আমি উল্লেখ করতে পারি যে শেষ লিঙ্কটি খুব পুরানো (2007 থেকে)। তারপরে প্রচুর পরিবর্তন হয়েছে। পোস্টটি থেকে অনুভূতিটি পেয়েছি যে বিদ্রূপ করা তখন অনেক শক্ত ছিল যখন যখন আপনি আসলে একটি বিদ্রূপ কাঠামো ব্যবহারের বিপরীতে বা প্রত্যাবর্তনের মান স্থাপনের জন্য
রূপান্তরিত

উত্তর:


41

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

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

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

কোডের একমাত্র অংশ যা এখানে প্রাসঙ্গিক ...do something with response...। বাকীগুলিকে উপহাস করুন।


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

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

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

1
@ অ্যান্ড্রেসএফ .: আমি মনে করি যে আমরা সহিংস চুক্তিতে রয়েছি: "এটি [ডায়াগনস্টিক] কোনও ইউনিট পরীক্ষা নয় ..."
কেভিন ক্লাইন

@ কেভিনক্লাইন রাইট! আমি আপনার মন্তব্য ভুল পড়ে, দুঃখিত!
আন্দ্রেস এফ।

5

আপনার ইউনিট পরীক্ষা করার সময় আমি "আপনার নিজের মালিকানাযুক্ত জিনিসগুলি উপহাস করবেন না" এর সাথে আমি একমত নই।

মকসের অস্তিত্বের উদ্দেশ্য হ'ল এখানে মডিউল, গ্রন্থাগার, ক্লাস থাকবে যা আমরা নেই।

আপনার দৃশ্যের জন্য আমার পরামর্শটি ওয়েব পরিষেবা কলকে উপহাস করে ock

মোকটিকে এমনভাবে সেটআপ করুন যাতে এটি আপনার মডিউলটিতে ডেটা ফেরত দেয়।
নিশ্চিত হয়ে নিন যে আপনি সমস্ত দৃশ্যধারণ করেছেন cover উদাহরণস্বরূপ, যখন ফিরে আসা ডেটা শূন্য হয়, যখন ফিরে আসা ডেটা বৈধ হয় ইত্যাদি etc.

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


1

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

class WebClass {

private WebServiceInterface webserviceInterface;

    void method(){
        R result = webServiceInterface.performWebServiceCall();
        ... do something with result
    }

    public void setWebServiceInterface(WebServiceInterface webServiceInterface){
        this.webServiceInterface = webServiceInterface;
    }
}


interface WebServiceInterface {

   R performWebServiceCall();

}


class WebClassTest {

private WebServiceInterface mock;    
private R sampleResult = new R();

    @Before
    public void before(){
        mock = EasyMock.createMock(WebServiceInterface.class);
    }


    @Test
    public void test() {
        WebClass classUnderTest = new WebClass();
        EasyMock.expect(mock.performWebServiceCall()).andReturn(sampleResult);
        classUnderTest.setWebServiceInterface(mock);
        classUnderTest.method();
        EasyMock.verify(mock);
    }
}

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

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

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


1

বিদ্রূপগুলি এই ক্ষেত্রে গ্রহণযোগ্য, তবে আপনার এটির দরকার নেই। ইউনিট পরীক্ষার method()পরিবর্তে, পরিবর্তে ইউনিট পরীক্ষা করে সেই অংশটি যা প্রতিক্রিয়া পরিচালনা করে।

এমন কোনও ফাংশন এক্সট্রাক্ট করুন যা গ্রহণ করবে ResponseData(যা কিছু উপযুক্ত হোক) এবং তারপরে ক্রিয়াটি সম্পাদন করে।

উপহাস করার পরিবর্তে, এখন আপনি কেবল একটি রেসপন্সডাটা অবজেক্ট তৈরি করুন এবং এতে প্রবেশ করুন।

আপনি সম্পূর্ণ ইন্টিগ্রেশন টেস্টগুলিতে পরিষেবাটির কলিংটি ছেড়ে যেতে পারেন - এটি method()মোট কভার করবে


0

আমি যা করেছি এবং এটি কাজ করে:

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

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

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

৩.৩ তারপরে ৩.২-এর মতো একই পরীক্ষা চালানো হয় তবে এবার বিকাশের পরিবেশে বাস্তব ওয়েব সার্ভিসেসের বিপরীতে চলছে।

এগুলি শেষ হওয়ার পরে, আসল উত্পাদন পরিবেশের জন্য আপনাকে কেবল প্রতিটি ওয়েবসার্চির জন্য আসল ঠিকানা সরবরাহ করতে হবে। আশা করা যায় এটির জন্য কনফিগারেশনের খুব বেশি পরিবর্তন দরকার নেই।

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