Mocks болон Stubs объектуудын ялгаа

Орчуулгыг бүтэн эхээр нь та wordpress-ээс болон   gitbook.com  -с  үзэх боломжтой.

Анх эдгээр ойлголтууд гарч ирэхэд, олон хүмүүс дууриамал объектыг энгийн тестийн ухагдахуун болох stubs-тай хольж хутган, төөрөлдөж байсан. Түүнээс хойш хүмүүс тэдгээрийн ялгааг илүү ойлгосон байх. Хэдийгээр тиймч, хүмүүсийн хэрхэн mock -ыг ашигладгийг мэдэхийн тулд моск болон бусад тест doubles-уудыг мэдэх нь чухал (“doubles” ? хэрэв энэ таньд шинэ ойлголт бол санаа зоволтгүй, хэдхэн мөрийн дараа бүгд ойлгомжтой болно).

Програмын зөвхөн нэг элемент дээр тухайн агшинд санаагаа сайн төвлөрүүлэн та тест хийж байгаа бол энэ бол олны хэлдгээр unit testing юм. Асуудал нь юу вэ гэхлээр таньд ганц нэгжийг (unit) -ыг тестлэхийн тулд ихэвчлэн бусад нэгжүүд шаардлагатай болдог – бидний дээрх жишээн дээр warehouse хэрэг болсон шиг.

Дээрх миний харуулсан хоёр янзын тестын аргад, эхний нь жинхэнэ агуулах (warehouse) объектыг ашиглаж, харин хоёр дахь нь дууриамал агуулах (warehouse) объектыг (мэдээж энэ бол жинхэнэ объект биш) тус тус ашигласан. Хэдийгээр дууриамал объектыг ашиглах нь жинхэнэ агуулах объектыг ашиглахгүй байх нэг хэлбэр боловч мөн өөр төрлийн жинхэнэ биш объектуудыг иймэрхүү тестэд ашиглах боломжтой.

Эдгээр зүйлүүдийг тайлбарлахад хэрэглэгдэх нэршлүүд нилээд ярвигтай болж ирж байна – stub, mock, fake, dummy гэх зэрэг нэр томъёонууд гарч ирлээ. Энэхүү нийтлэлд би Gerard Meszaros -ын номонд дурьдсан нэршлүүдийг ашиглах болно. Хэдийгээр эдгээр нэр томъёонуудыг бүгд хэрэглэдэггүй ч гэсэн миний бодлоор эдгээр нэршлүүд бол нилээд сайн, мөн энэ миний эссэ учраас би аль нэршлийг сонгохоо өөрөө шийднэ.

Meszaros Test Double гэсэн нэрэн дор тестэнд ашиглагдах, жинхэнэ объектын оронд төлөөлөн ашиглагдаж байгаа аливаа объектуудыг ерөнхийлөн ингэж нэрлэсэн. Энэ нэршил нь киноны орлон тоглогч (Stunt Double) -с үүдэлтэй (Түүний ингэс ашигласан нэг шалгаан  нь өмнө хэдийн олон танигдсан нэршлээс зайлсхийх байсан). Meszaros дөрвөн төрлийн double -ыг тодорхойлсон:

 

  • Dummy шаардагдах параметерүүдийн тоог бөглөхөд л ашиглагдах объект бөгөөд хэзээ ч ашиглагдахгүй
  • Fake ерөнхий бүх зүйл нь асуудалгүй ажилладаг авч зарим нэг хялбарчилсан зүйлүүдээс болоод Production орчинд ашиглагдах боломжгүй объектууд (жишээ нь in memory өгөгдлийн бааз)
  • Stubs тестийн үед хийгдэх дуудлагуудад зориулж бэлдсэн хариултуудууд өгдөг, тестэнд программчлагдсан зүйлүүд нь уг тестээс гаднах ямар ч зүйлд хариулдаггүй. Stubs мөн аливаа дуудлагуудын мэдээллийг хадгалж болно. Жишээ нь email gateway stub магадгүй илгээсэн имэйлүүдээ юмуу аль эсвэл зөвхөн илгээсэн имэйлын тоог санадаг байж болно.
  • Mocks бидний энэхүү илтгэлд яригдаж байгаа сэдэв: Объектын дуудагдах байдал нь урьдчилан програмчлагдсан ба тэр нь тестийн үед заавал дуудагдах шаардлага болдог

Эдгээр double-уудаас зөвхөн mock л үйлдлээр батлах (behavior verification)-ыг шаарддаг. Бусад double-ууд ихэвчлэн төлвөөр батлах (state verification) -ыг хэрэглэдэг. Дууриамал объект (Mocks) нь exercise – үед SUT-ыг жинхэнэ хамрагч объектуудтай харьцаж байгаа гэж итгүүлэхийн тулд хийдэг үйлдлээрээ бусад double-уудтай яг ижил үйлдэл хийдэг. Хэдий тийм ч дууриамал объект setup болон verification үеүүдэд бусдаасаа ялгаатай.

Test double-уудын талаар илүү дэлгэрэнгүй судлах үүднээс бид жишээгээ өргөжүүлэх шаардлагатай болж байна. Олон хүмүүс test double-уудыг жинхэнэ объектуудтай ажиллахад ядаргаатай болсон үедээ ашиглаад байдаг. Test double-ыг ашиглах нэгэн түгээмэл жишээ нь: хэрэв захиалгын үед алдаа гарсан бол бид хэрэглэгч рүү имайлээр мэдээллэх шаардлагатай гэж үзье. Асуудал нь юу гэхлээр бид тестлэх үедээ жинхэнэ хэрэглэгчид рүү имэйлээр мэдээлэл явуулахыг хүсэхгүй. Тиймээс бид өөрсдөө удирдаж өөрчлөх боломжтой имэйлын системийн test double -ыг үүсгэе.

Одоо л бид дууриамал (mocks) болон stubs -уудын ялгааг таниж эхэлж байна. Хэрэв бид mailing -ны үйлдлийг тетслэж байсан бол бид энгийн stub -г дараах байдлаар бичих байсан байх.

public interface MailService {
 public void send (Message msg);
}

 

public class MailServiceStub implements MailService {
 private List<Message> messages = new ArrayList<Message>();
 public void send (Message msg) {
   messages.add(msg);
 }
 public int numberSent() {
   return messages.size();
 }
}

Дээрх stub-д бид төлвөөр батлах (state verification) -г дараах байдлаар ашиглаж болно.

class OrderStateTester

public void testOrderSendsMailIfUnfilled() {
   Order order = new Order(TALISKER, 51);
   MailServiceStub mailer = new MailServiceStub();
   order.setMailer(mailer);
   order.fill(warehouse);
   assertEquals(1, mailer.numberSent());
 }

 

Мэдээж энэ бол маш энгийн тест – зөвхөн л мэдээлэл илгээсэн эсэхийг шалгаж байна. Бид имэйл яг зөвхөн хүндээ илгээгдсэн эсвэл яг зөв агуулга илгээгдсэн талаар тест хийгээгүй, хэдий тийм ч гол санаа нь харагдсан болов уу.

Дууриамал объектуудыг (mocks) ашиглавал дээрх тест нилээд өөр харагдана.

class OrderInteractionTester

public void testOrderSendsMailIfUnfilled() {
   Order order = new Order(TALISKER, 51);
   Mock warehouse = mock(Warehouse.class);
   Mock mailer = mock(MailService.class);
   order.setMailer((MailService) mailer.proxy());

   mailer.expects(once()).method(“send&#8221;);
   warehouse.expects(once()).method(“hasInventory&#8221;)
     .withAnyArguments()
     .will(returnValue(false));

   order.fill((Warehouse) warehouse.proxy());
 }
}

Дээрх хоёр тест хоёуланд нь би жинхэнэ mail service -ын оронд test double -ыг ашиглаж байна. Ялгаа нь stub ашигласан нь төлвөөр батлах (state verification) -г ашиглаж, харин дууриамал объект (mock) ашигласан нь үйлдлээр батлах (behavior verification)-ыг ашигласан байна.

Stub төлвөөр батлах (state verification) -г ашиглахын тулд надад зарим нэмэлт методуудыг stub дээр нэмж өгөх шаардлагатай болж байна – тэдгээр нь хариуг шалгахад ашиглагдах болно. Үүний үр дүнд stub нь MailService -г implement хийсэн боловч мөн нэмэлт тестын методуудаар нэмэгдсэн байна.
Дууриамал (mock) объектууд үргэлж үйлдлээр батлах (behavior verification)-ыг ашигладаг, харин stub альнаар нь ч байж болно. Meszaros үйлдлээр батлах (behavior verification)-ыг ашигладаг stub -уудыг Test Spy гэж нэрлэсэн. Ялгаа нь тухайн double хэрхэн гүйцэтгэгдэж, хэрхэн үр дүнгээ шалгаж байгаад оршиж байгаа. Үүнийг би таньд үлдээлээ, та цааш судлаж ялгааг нь олоорой.

 

Нийтлэлийг бүтнээр нь мөн gitbook.com -с унших, татаж авах боломжтой. Холбоос https://www.gitbook.com/book/erheme318/mocks-aren-t-stubs

Advertisements

Хариулт үлдээх

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Өөрчлөх )

Twitter picture

You are commenting using your Twitter account. Log Out / Өөрчлөх )

Facebook photo

You are commenting using your Facebook account. Log Out / Өөрчлөх )

Google+ photo

You are commenting using your Google+ account. Log Out / Өөрчлөх )

Connecting to %s