আমি কীভাবে আমার REST ওয়েব পরিষেবাটিকে ইউনিট-টেস্ট করতে পারি?


16

আমি ইউনিট টেস্টিংয়ে নতুন, আমি একটি রেস্টের ওয়েব পদ্ধতি পেয়েছি যা কেবল ডিবি কল করে এবং একটি ডিটিও পপুলেট করে। সিউডো কোডটি

public object GetCustomer(int id)
{
  CustomerDTO objCust = //get from DB
  return objCust;
}

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

আমি মনে করি আমি এই ধারণাগুলি বুঝতে এখানে কিছু মিস করছি।


5
আপনি যে কোড পোস্ট করেছেন তাতে পরীক্ষার জন্য জিনিসগুলি হ'ল: (1) আপনি প্যারামিটার হিসাবে কোনও ইনট দিয়ে গেটকাস্টমারকে কল করতে পারেন? (২) এটি কি গ্রাহক ডিটিও অবজেক্টটি ফেরত দেয়? (3) প্রত্যাশা হিসাবে কি ডিবি থেকে উত্পন্ন হয়? (৪) কোনও বৈধ গ্রাহকের সাথে মিলে না এমন কোন ইন্টির সাথে ডাকা হলে একটি প্রত্যাশিত আচরণ ঘটে? এর কোনওটিরই এখনও আরইএসটি-র সাথে সম্পর্ক নেই। আপনি যখন RESTful অনুরোধগুলির প্রতিক্রিয়াযুক্ত কোডটি লিখতে প্রস্তুত হন, তখন আপনি এটির জন্য পরীক্ষা লিখবেন।
ডেভিডো

@ ডেভিডো: "প্রত্যাশা অনুযায়ী সেই জিনিসটি কি ডিবি থেকে জনবহুল?" স্থিরভাবে কোনও ইউনিট পরীক্ষা নয় (ওপির কোডের সাথে)। এটি একটি ইন্টিগ্রেশন টেস্ট।
ফ্ল্যাটার

হ্যাঁ আপনি সঠিক. যদি আমি ফিরে গিয়ে মন্তব্যটি পরিবর্তনের জন্য উল্লেখ করতে পারি যে একটি ইন্টিগ্রেশন টেস্টে আপনি ডিবি উপাদানটি যাচাই করবেন, এবং অন্যথায় এটি উপহাস করবেন, আমি সম্পাদনাটি করব, তবে মন্তব্যটির জন্য সম্পাদনা উইন্ডোটি যদি 5 মিনিট হয়, এবং মন্তব্যটি ছয়টি করা হয়েছিল অনেক বছর আগে. :)
ডেভিডও

উত্তর:


18

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

এটি খুব আশা করা যায় যে আপনার পদ্ধতিতে আপনি অন্যান্য ক্লাস থেকে এক্স পদ্ধতিতে কল করেন । আপনি এই এক্স পদ্ধতিগুলি পরীক্ষা করছেন না তাই আপনাকে যা করতে হবে তা হল এই পদ্ধতিগুলিকে বিদ্রূপ করা

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

আপনি যদি পরীক্ষার জন্য কেবল নিজের বিদ্রূপটি লিখতে চান তবে মনে করুন আপনার নীচের CustomerRepositoryক্লাসটি রয়েছে:

public class CustomerRepository {
 public CustomerDTO getCustomer(int id) {
   ...
 }
}

আপনি নিজের উপহাস এবং নোংরা CustomerRepositoryক্লাসটি নিম্নলিখিত উপায়ে লিখতে পারেন :

public class MockedCustomerRepository extends CustomerRepository {
 public boolean bThrowDatabaseException;
 public boolean bReturnNull;
 public boolean bReturnCustomerWrongId;
 public boolean bReturnCustomerWithId;
 public CustomerDTO getCustomer(int id) {
  if(bThrowDatabaseException) { 
    throw new DatabaseException("xxx"); 
  } else if(bReturnNull) { 
    return null; 
  } else if(bReturnCustomerWrongId) { 
    throw new CustomerNotExistException(id);
  } else if(bReturnCustomerWithId) { 
    return new CustomerDTO(id); 
  }
 }
}

তারপরে, আপনার পরীক্ষার ক্ষেত্রে আপনি মূলত আপনার "মানক" দৃষ্টান্তটিকে CustomerRepositoryএকটি বিদ্রূপিত উদাহরণের সাথে প্রতিস্থাপন করেন যা আপনাকে বিভিন্ন ফলাফলের জন্য আপনার পদ্ধতিটি পরীক্ষা করতে দেয় getCustomer:

public class CustomerRestTest {
  public void testGetCustomer_databaseFailure() {
    MockedCustomerRepository dto = new MockedCustomerRepository();
    dto.bThrowDataBaseException = true;
    yRestClass rest = new MyRestClass();
    rest.dto = dto;
    rest.getCustomer(0);
    // depending on what you do in your getCustomer method, you should check if you catched the exception, or let it pass, etc.. Make your assertions here

  public void testGetCustomer_customerNotExist() {
    // etc.
  }
}

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

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

আশা করি এটি আপনার REST পদ্ধতিটি পরীক্ষা করতে সহায়তা করে।


4
সাধারণত আপনার ডিটিও ক্লাসের মধ্যে যুক্তি থাকে না, বিশেষ করে এমন কোনও নয় যা আপনার ডেটা স্টোরেজের সাথে ইন্টারঅ্যাক্ট করে।
JustAnotherUserYouMayKnowOrNN

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