Кодът за тестване, който използва функционални лещи, може да бъде предизвикателно, но възнаграждаващо начинание. Като доставчик на функционални лещи имах възможността да се задълбоча дълбоко в тази тема и да разбера нюансите, свързани с това. В тази публикация в блога ще споделя някои прозрения за това как ефективно да тествам код, който използва функционални лещи, заедно с реални примери и най -добри практики.


Разбиране на функционалните лещи
Преди да скочим в тестване, е от решаващо значение да разберем стабилно какви са функционалните лещи. Функционалните лещи са мощна концепция във функционалното програмиране. Те предоставят начин за достъп и промяна на части от структурата на данни по неизменно и композиционно.
Нека вземем прост пример на език за програмиране като Haskell. Да предположим, че имаме структура на данни, представляваща потребител:
data user = user {username :: string, userage :: int, useraddress :: адрес} адрес за данни = адрес {adressstreet :: string, addresscity :: string}
Обектив ни позволява да имаме достъп и актуализиранепотребителско имеилиадресбез да се налага да пишете изрични функции за аксесоар и мутатори за всяка част от структурата на данните. В Хаскел можем да използвамеобективБиблиотека за създаване на лещи:
USERNAMELENS :: Потребителски низ на обектива usernamelens = обектив Потребителско име (\ un -> u {username = n}) addresscityLens :: адрес на обектива string addresscityLens = addresscity (\ ac -> a {adresscity = c})
След това тези лещи могат да се използват за получаване и задаване на стойности по функционален начин.
Защо тестването е важно
Кодът за тестване, който използва функционални лещи, е от съществено значение по няколко причини. Първо, функционалните лещи често се занимават със сложни структури от данни. Малка грешка в дефиницията или използването на обектива може да доведе до трудно - до проблеми с отстраняването на грешки. Например, ако обективът е неправилно дефиниран за актуализиране на поле в структура на данни, в някои случаи може да работи добре, но се проваля в други.
Второ, тъй като функционалните лещи са проектирани да бъдат композитни, бъг в един леща може да се разпространи през множество части на кода. Тестването помага за изолиране на тези проблеми в началото на цикъла на развитие.
Функционални лещи за тестване на единица
Тестването на единица е първата линия на отбрана, когато става въпрос за тестов код, който използва функционални лещи. Целта на тестването на единици е да се тестват изолирано отделни лещи.
Тестване на обективи
Първият аспект за тестване е Getter на обектива. Като се има предвид обектив, искаме да гарантираме, че той правилно извлича стойността от структурата на данните. Ето пример в JavaScript с помощта наРамБиблиотека, която осигурява функционалност на обектива:
const r = изискване ('ramda'); const user = {name: 'John', възраст: 30, адрес: {Street: '123 Main St', City: 'New York'}}; const namelens = r.lensprop ('име'); const cityLens = r.lenspath (['адрес', 'city']); // тествайте името обектив getter const getName = r.view (namelens); console.assert (getName (потребител) === 'john', 'name lens getter трябва да върне правилно име'); // Тествайте градския обектив getter const getCity = r.view (cityLens); console.assert (getCity (потребител) === 'New York', 'City Lens Getter трябва да върне правилния град');
В този пример използвамеПрегледфункция отРамЗа да получите стойността от обектива. След това използвамеconsole.assertЗа да проверите дали извлечената стойност е правилна.
Тестване на сетериите на обективите
След като тестваме Getters, трябва да тестваме сетериите на обектива. Сетърът трябва да актуализира правилно структурата на данните, като същевременно запазва непокътната неизменност.
const setName = r.set (namelens, 'jane'); const newuser = setName (потребител); console.assert (newuser.name === 'jane', 'name lens setter трябва да актуализира името'); console.assert (user.name === 'John', 'Оригиналният обект на потребителите трябва да остане непроменен'); const setCity = r.set (CityLens, 'Los Angeles'); const ornishnewuser = setCity (потребител); console.assert (ornishnewuser.address.city === 'Los Angeles', 'City Lens Setter трябва да актуализира града'); console.assert (user.address.city === 'New York', 'Оригиналният потребителски обект трябва да остане непроменен');
Тук използвамекомплектфункция отРамЗа да актуализирате стойността в структурата на данните. След това проверяваме дали актуализираният обект има новата стойност и оригиналният обект остава непроменен.
Тестване на интеграция
Тестването на единица е чудесно за тестване на отделни лещи, но в реален световен сценарий лещите често се използват в комбинация с други части на кода. Тестването на интеграцията помага да се гарантира, че лещите работят правилно в контекста на цялото приложение.
Тестване на състава на обектива
Една от основните характеристики на функционалните лещи е съставът. Можем да комбинираме множество лещи за достъп и модифициране на вложени части от структура на данни. Например, в Haskell, можем да съставимПотребителскииAddressCityLensза достъп и промяна на града на адреса на потребителя.
userAddressCityLens :: Потребителският низ на обектива useradddresscitylens = userAddresslens. AddressCityLens, където userAddresslens = обектив useraddress (\ ua -> u {useraddress = a})
За да тестваме състава на обектива, трябва да гарантираме, че съставената леща се държи както се очаква. Можем да напишем тестове за интеграция, които използват съставения обектив, за да получим и зададем стойности в сложна структура на данни.
Тестване с реални - световни данни
В допълнение към тестването на състава на обектива, тестването на интеграцията също трябва да включва използване на реални данни. Например, ако нашето приложение се занимава с потребителски данни от база данни, можем да използваме примерни данни от базата данни, за да тестваме лещите. Това помага за идентифициране на всички проблеми, които могат да възникнат поради действителния формат или стойности на данните.
Тестване с различни реализации на обектива
Налични са множество библиотеки за внедряване на функционални лещи на различни езици за програмиране. Като функционален доставчик на лещи трябва да гарантираме, че нашият код работи добре с различни реализации на обектива.
Сравняване на производителността
Различните реализации на обектива могат да имат различни характеристики на производителността. Например, някои лещи могат да бъдат по -ефективни - ефективни, докато други може да са по -бързи по отношение на времето за изпълнение. Можем да напишем тестове за ефективност, за да сравним различни реализации на обектива и да изберем този, който най -добре отговаря на изискванията на нашето приложение.
Тестване на съвместимост
Също така трябва да тестваме съвместимостта на нашия код с различни реализации на обектива. Например, ако имаме писмен код, използвайки специфична библиотека на обектива на определен език за програмиране, трябва да тестваме дали един и същ код може лесно да се пренася, за да използва различна библиотека на обектива.
Инструменти за тестване на функционални лещи
Налични са няколко инструмента, които могат да помогнат при тестване на код, който използва функционални лещи.
Рамки за тестване
В повечето езици за програмиране има рамки за тестване, които могат да се използват за писане на тестове за единица и интеграция. Например в JavaScript можем да използвамеЕилиМоказа тестване. Тези рамки предоставят функции като тестови бегачи, библиотеки за твърдения и тестова организация.
Инструменти за отстраняване на грешки
Инструментите за отстраняване на грешки също могат да бъдат много полезни при тестване на функционални лещи. Например в Haskell,GHCIDebugger може да се използва за преминаване през кода и инспектиране на стойностите на променливите в различни точки от изпълнението.
Реални - световни приложения и нашите функционални лещи
Като функционален доставчик на лещи ние предлагаме широка гама от продукти, които могат да се използват в различни реални приложения. НашитеПрогресивен полугори лещае проектиран да осигури безпроблемен преход между различни фокусни разстояния, което го прави идеален за потребители, които трябва да превключват между близко и далечно зрение.
НашитеРазтвор на лещовидна лещасе използва в приложения, при които са необходими 3D ефект или множество ъгли на гледане. Може да се използва при рекламни дисплеи, образователни материали и други.
TheРешение за спортен SV обективе специално създаден за спортни ентусиасти. Той осигурява отлична яснота и защита, което я прави подходящ за различни спортни дейности.
Заключение и призив за действие
Кодът за тестване, който използва функционални лещи, е много фасетен процес, който включва тестване на единица, тестване на интеграция и тестване с различни реализации на обектива. Следвайки най -добрите практики, очертани в тази публикация в блога, можете да гарантирате, че вашият код е здрав и надежден.
Ако се интересувате да научите повече за нашите функционални лещи или да имате въпроси относно кода за тестване, който използва функционални лещи, бихме искали да чуем от вас. Чувствайте се свободни да се свържете с нас за повече информация и да започнете дискусия за обществени поръчки.
ЛИТЕРАТУРА
- Документация на Ramda: https://ramdajs.com/docs/
- Документация на библиотеката на Haskell Lens: https://hackage.haskell.org/package/lens
- Документация на JEST: https://jestjs.io/docs/en/getting - започна
- Документация на Mocha: https://mochajs.org/
