Макети об'єктів (англ. Mock Object) у об'єктно-орієнтованому програмуванні - це об'єкти, що імітують поведінку справжніх об'єктів контрольованими способами, тобто, реалізують інтерфейси справжніх об'єктів, але не мають власної реальної функціональності. Програміст зазвичай створює макет об'єкта для тестування поведінки деяких інших об'єктів, багато в чому так само, як автомобільний дизайнер використовує манекен, що може рухатися, для імітації динамічної поведінки людини в транспортній аварії.
Де варто використовувати
У модульному тестуванні, фіктивні об'єкти можуть моделювати поведінку складних, реальних (не макетних) об'єктів і, отже, корисні, коли реальний об'єкт недоцільно або неможливо використати в модульному тесті. Якщо об'єкт має будь-яку з наведених нижче характеристик, використання фіктивного об'єкту може бути корисним в цьому випадку:
- надає недетерміновані результати (наприклад, час або температуру);
- є сценарії, які важко створити або відтворити (наприклад, помилка в мережі);
- повільно працює (наприклад, повна база даних, яка повинна бути ініціалізована до початку тестування);
- об'єкт ще не існує або може змінити поведінку;
- об'єкт повинен включати в себе інформацію і методи виключно для цілей тестування (а не для реального використання).
Наприклад, створюється програма, що реагує на показники датчика, що вимірює температуру у приміщенні. Необхідно перевірити, що у програмі виникне попередження, якщо температура у приміщенні впаде нижче деякого рівня. Реально знижувати температуру приміщення - складно та недоцільно. Тому виправданим є створення макету для датчика температури, що надає дані про температуру у такому ж форматі, що і реальний датчик, але програміст має змогу керувати даними, що повертає такий датчик.
Типи макетних об'єктів
Макетні об'єкти можуть лише повертати вказані результати або також запам'ятовувати факт викликів своїх методів, та, якщо у тестовому сценарії, де обов'язково тестований об'єкт мав викликати деякий метод макетного об'єкта, але не зробив цього, повідомляти про невиконання тесту. Також існують макетні об'єкти, що просто реалізують інтерфейс реальних (деякою порожньою реалізацією), і програміст не може керувати ними.
Деталі використання
Макетні об'єкти та реальні об'єкти, які вони імітують, мають однакові інтерфейси, що дозволяє клієнту об'єкта не відчувати різниці, реальні об'єкти він використовує чи фіктивні. Сучасні фреймворки для модульного тестування дозволяють програмісту легко створювати макетні об'єкти заданого інтерфейсу або базового типу, вказувати необхідний результат для викликів методів та властивостей макетних об'єктів, вказувати, які параметри мають бути передані тому чи іншому методу, які методи чи властивості взагалі мають викликатися - факт усіх обов'язкових для тесту викликів методів макетного об'єкту може бути перевірено у модульному тесті.
Засоби автоматизації створення
Для мови програмування C Sharp :
- Moq [ 26 грудня 2012 у Wayback Machine.]
- Typemock [ 26 грудня 2012 у Wayback Machine.]
- Nsubstitute [ 27 січня 2013 у Wayback Machine.]
- NMock [ 21 грудня 2012 у Wayback Machine.]
Для мови програмування Python :
- Pymox [ 25 грудня 2012 у Wayback Machine.]
- Python Mocker [ 18 грудня 2012 у Wayback Machine.]
Для мови програмування Ruby on Rails :
- Mocha [ 31 серпня 2009 у Wayback Machine.]
- RR [ 21 серпня 2009 у Wayback Machine.]
Застереження щодо використання
Використання макетних об'єктів може прив'язати юніт-тести до фактичної реалізації коду, який проходить випробування. Наприклад, фреймворків для юніт-тестування дозволяють розробнику перевіряти, скільки разів і у якому порядку тестований об'єкт викликає макетний об'єкт; рефакторинг може змінити порядок таких викликів, і, при тому що фактично код залишатиметься робочим, тест буде не пройдено. Такі тести називають крихкими. Це доводить, що макетний об'єкт має імітувати лише зовнішню поведінку справжнього, і не прив'язуватися до деталей внутрішньої реалізації.
Реалізація
Нехай, наша аплікація містить операції із конвертуванням грошей. У ній присутній наступний сервіс.
public interface ICurrencyExchange { Task<Money> Convert(Money originalAmount, Currency destinationCurrency); }
Щоб перевірити роботу логіки, яке залежить на цьому сервісі створимо імітацію необхідної нам поведінки.
var mock = new Mock<ICurrencyExchange>(); mock .Setup(x => x.Convert(It.IsAny<Money>(), It.Is<Currency>(c => c == Currency.Euro))) .ReturnsAsync(new Money(10, Currency.Euro)); ICurrencyExchange currencyExchange = mock.Object;
Зв'язок з іншими патернами
- Макет об'єкта та заглушка сервісу часто плутають. Та варто розуміти, що макет об'єкта використовуються для імітації поведінки однієї чи декількох функцій та залежно від умов ця імітація може відрізнятись в той час, як заглушка сервісу замінює цілий сервіс та його реалізація залишається незмінною.
Див. також
Ця стаття не містить . (листопад 2013) |
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Maketi ob yektiv angl Mock Object u ob yektno oriyentovanomu programuvanni ce ob yekti sho imituyut povedinku spravzhnih ob yektiv kontrolovanimi sposobami tobto realizuyut interfejsi spravzhnih ob yektiv ale ne mayut vlasnoyi realnoyi funkcionalnosti Programist zazvichaj stvoryuye maket ob yekta dlya testuvannya povedinki deyakih inshih ob yektiv bagato v chomu tak samo yak avtomobilnij dizajner vikoristovuye maneken sho mozhe ruhatisya dlya imitaciyi dinamichnoyi povedinki lyudini v transportnij avariyi De varto vikoristovuvatiU modulnomu testuvanni fiktivni ob yekti mozhut modelyuvati povedinku skladnih realnih ne maketnih ob yektiv i otzhe korisni koli realnij ob yekt nedocilno abo nemozhlivo vikoristati v modulnomu testi Yaksho ob yekt maye bud yaku z navedenih nizhche harakteristik vikoristannya fiktivnogo ob yektu mozhe buti korisnim v comu vipadku nadaye nedeterminovani rezultati napriklad chas abo temperaturu ye scenariyi yaki vazhko stvoriti abo vidtvoriti napriklad pomilka v merezhi povilno pracyuye napriklad povna baza danih yaka povinna buti inicializovana do pochatku testuvannya ob yekt she ne isnuye abo mozhe zminiti povedinku ob yekt povinen vklyuchati v sebe informaciyu i metodi viklyuchno dlya cilej testuvannya a ne dlya realnogo vikoristannya Napriklad stvoryuyetsya programa sho reaguye na pokazniki datchika sho vimiryuye temperaturu u primishenni Neobhidno pereviriti sho u programi vinikne poperedzhennya yaksho temperatura u primishenni vpade nizhche deyakogo rivnya Realno znizhuvati temperaturu primishennya skladno ta nedocilno Tomu vipravdanim ye stvorennya maketu dlya datchika temperaturi sho nadaye dani pro temperaturu u takomu zh formati sho i realnij datchik ale programist maye zmogu keruvati danimi sho povertaye takij datchik Tipi maketnih ob yektivMaketni ob yekti mozhut lishe povertati vkazani rezultati abo takozh zapam yatovuvati fakt viklikiv svoyih metodiv ta yaksho u testovomu scenariyi de obov yazkovo testovanij ob yekt mav viklikati deyakij metod maketnogo ob yekta ale ne zrobiv cogo povidomlyati pro nevikonannya testu Takozh isnuyut maketni ob yekti sho prosto realizuyut interfejs realnih deyakoyu porozhnoyu realizaciyeyu i programist ne mozhe keruvati nimi Detali vikoristannyaMaketni ob yekti ta realni ob yekti yaki voni imituyut mayut odnakovi interfejsi sho dozvolyaye kliyentu ob yekta ne vidchuvati riznici realni ob yekti vin vikoristovuye chi fiktivni Suchasni frejmvorki dlya modulnogo testuvannya dozvolyayut programistu legko stvoryuvati maketni ob yekti zadanogo interfejsu abo bazovogo tipu vkazuvati neobhidnij rezultat dlya viklikiv metodiv ta vlastivostej maketnih ob yektiv vkazuvati yaki parametri mayut buti peredani tomu chi inshomu metodu yaki metodi chi vlastivosti vzagali mayut viklikatisya fakt usih obov yazkovih dlya testu viklikiv metodiv maketnogo ob yektu mozhe buti perevireno u modulnomu testi Zasobi avtomatizaciyi stvorennya Dlya movi programuvannya C Sharp Moq 26 grudnya 2012 u Wayback Machine Typemock 26 grudnya 2012 u Wayback Machine Nsubstitute 27 sichnya 2013 u Wayback Machine NMock 21 grudnya 2012 u Wayback Machine Dlya movi programuvannya Python Pymox 25 grudnya 2012 u Wayback Machine Python Mocker 18 grudnya 2012 u Wayback Machine Dlya movi programuvannya Ruby on Rails Mocha 31 serpnya 2009 u Wayback Machine RR 21 serpnya 2009 u Wayback Machine Zasterezhennya shodo vikoristannyaVikoristannya maketnih ob yektiv mozhe priv yazati yunit testi do faktichnoyi realizaciyi kodu yakij prohodit viprobuvannya Napriklad frejmvorkiv dlya yunit testuvannya dozvolyayut rozrobniku pereviryati skilki raziv i u yakomu poryadku testovanij ob yekt viklikaye maketnij ob yekt refaktoring mozhe zminiti poryadok takih viklikiv i pri tomu sho faktichno kod zalishatimetsya robochim test bude ne projdeno Taki testi nazivayut krihkimi Ce dovodit sho maketnij ob yekt maye imituvati lishe zovnishnyu povedinku spravzhnogo i ne priv yazuvatisya do detalej vnutrishnoyi realizaciyi RealizaciyaNehaj nasha aplikaciya mistit operaciyi iz konvertuvannyam groshej U nij prisutnij nastupnij servis public interface ICurrencyExchange Task lt Money gt Convert Money originalAmount Currency destinationCurrency Shob pereviriti robotu logiki yake zalezhit na comu servisi stvorimo imitaciyu neobhidnoyi nam povedinki var mock new Mock lt ICurrencyExchange gt mock Setup x gt x Convert It IsAny lt Money gt It Is lt Currency gt c gt c Currency Euro ReturnsAsync new Money 10 Currency Euro ICurrencyExchange currencyExchange mock Object Zv yazok z inshimi paternamiMaket ob yekta ta zaglushka servisu chasto plutayut Ta varto rozumiti sho maket ob yekta vikoristovuyutsya dlya imitaciyi povedinki odniyeyi chi dekilkoh funkcij ta zalezhno vid umov cya imitaciya mozhe vidriznyatis v toj chas yak zaglushka servisu zaminyuye cilij servis ta jogo realizaciya zalishayetsya nezminnoyu Div takozhZaglushka servisu shablon proyektuvannya Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno listopad 2013 Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi