Да бисте тестирали систем, изоловајте споредне ефекте

Узимање споредних ефеката један је од најбољих начина за прављење тестираног кода

Слика боксерске утакмице два борца за мушкарце. Лица су им изван оквира. Борац са леве стране је послао леву удицу борцу у десној. Борац са десне стране носи црвени кратки с малим симболом Совјетског Савеза.

Ноцк је позната библиотека написана на ЈаваСцрипт-у корисна за ублажавање мрежних захтева. Враћа статички одговор за тестове тако да се могу покренути чак и ако ХТТП сервер није доступан.

Међутим, такође има мирис.

Резултат повезивања између извора података и тестираног система је трошак који може утицати на кориговање кода и одржавање.

Ево зашто.

Рецимо да постоји сервер који враћа листу постова и функција која користи одговор са тог сервера да би направила листу наслова постова. Тест за функцију користи Ноцк за спречавање одговора са сервера:

Дијаграм који приказује блок са леве стране са натписом „Креирај листу постова“. Једна стрелица показује на блок са натписом

Код је пристојне покривености. Међутим, постоје нека питања у вези с тим.

Ако промените врсту садржаја одговора, морате да промените тестове, чак и ако понашање кода остане исто:

Исто се примењује ако унесете измене у УРЛ, заглавља или параметре у које Ноцк смета. Морате променити тестове чак и ако понашање система остане исто:

Функција "креирање листе постова" је систем под тестом (СУТ). Подаци са ХТТП позива су Извор података.

Код можете дизајнирати тако да Извор података има опћенито сучеље које се може прикључити на СУТ. У том случају можете користити вежбу без потребе за превеликим подешавањем.

Дијаграм који приказује блок са леве стране с натписом „листа наслова постова“. Једна стрелица показује на блок са натписом „Ин-мемори дата дата“. Друга стрелица показује на блок са натписом „Подаци ХТТП сервера. Извор.

У тестном окружењу можете убризгати „Ин-Мемори Соурце Дата“. За производњу можете користити „ХТТП Сервер Дата Соурце“.

„Опште сучеље“ у претходном ЈСФиддле-у је метода „пронађи наслов постова.“ Без обзира на то како сте направили интерфејс, имате контролу над свим позиваоцима. Стога су промене јасне. Мартин Фовлер назива то "необјављено сучеље."

С друге стране, ако послужитељ прекрши уговор свог Објављеног сучеља, рецимо да се атрибут класе промијенио из пост-наслова у наслов чланка, морате промијенити само имплементацију Извор података. Не морате свугде да мењате промене.

Оно што је важно за тестирање и рану повратну информацију јесте тест на понашање, а не податке. Стога је кључно дизајнирати код да умањи количину напора потребног за промене логике. У овом случају, логика је трансформација улаза из извора података у ХТМЛ листу без наруџбе.

Новим дизајном сте раздвојили Извор података из тестираног система. Стога можете уклонити Ноцк.

Нови дизајн такође смањује рад неопходан за додавање новог правила у систем без копирања / лепљења:

Ипак, „Извор података ХТТП сервера“ има неку непровјерену логику унутар приватне функције „питајте наслов из хтмл-а“.

Да бисте то тестирали, можете поновити исти образац. Притисните бочне ефекте и учините да се механизам "гет рекуест" укључи у "ХТТП Соурце Дата Соурце". На овај начин још увек можете тестирати код без потребе за Ноцком:

Обзиром да већ имате тестове за потврђивање да "листа објава порука" функционише са "Ин-Мемори Дата Дата", можете одлучити да тестирате Извор података у изолацији како бисте били сигурни да враћа исправан резултат:

Потпуно сте потиснули споредни ефекат из логике. У овом случају, стварна "гет захтјев" ​​функција је нуспојава. Сада можете користити Ноцк да то покријете.

Међутим, с обзиром на то да је логика унутар „захтева за захтев“ тривијална и да Ноцк има значајне трошкове, има смисла имати мали број интеграционих тестова који могу да спроведу целокупну апликацију, укључујући и споредне ефекте. Можете да користите Ноцк да избегнете везу са ливе сервером, а ипак, користите ХТТП захтеве да бисте проверили да ли апликација враћа разуман одговор када се сви делови сједине заједно.

Ноцк је користан за успостављање везе у ХТТП слоју и за пружање статичког одговора. Међутим, користите га умерено. За сваки тест који ублажите, повећавате значајно повезивање и трошкове промене.

Ако се не користи штедљиво, Ноцк може да створи Ноцк Хелл.

Проблем који желите да решите је да смањите број грешака и трошкове промене. Ако промените структуру кода без промене у понашању, тестови се не смеју сломити. Ако то ураде, онда нисте успели да напишете корисне тестове.

Ваш циљ би требао бити да побољшате квалитет покривања теста логиком до које вам је стало и постигнете ране повратне информације. Све то, а да не утичете на вашу способност да код направите поново.

Издвојите споредне ефекте и ограничите употребу алата као што је Ноцк на границе апликације.

То би вам требало дати довољно самопоуздања да извршите промене и не прекидате ствари.

Укључите се у борбу, гурните споредне ефекте, а затим ... Одвојите.

Хвала за читање. Ако имате неке повратне информације, обратите ми се на Твиттеру, Фацебооку или Гитхубу.

Захваљујемо Едуарду Сломпу и Гуилхерме Ј. Трамонтини на проницљивим коментарима на овај пост.