Плюсы і мінусы тэсціраванай распрацоўкі

Якія плюсы і мінусы распрацоўкі з выкарыстаннем выпрабаванняў (TDD)?

Test Driven Development - гэта метадалогія распрацоўкі праграмнага забеспячэння, пры якой вы пішаце і бегчы набор тэстаў перад напісаннем кода.

Ідэя заключаецца ў тым, што спачатку гэтыя тэсты не атрымаюцца, а потым вы пачнеце пісаць дастаткова кода, каб паспрабаваць прайсці ўсе тэсты. Праходжанне ўсіх тэстаў можа стаць мерай выкананых крытэрыяў (распрацавана), а таксама павышае ўпэўненасць у якасці кода.


Тым не менш, як і ў любых іншых метадалогій распрацоўкі, у TDD ёсць некаторыя плюсы і мінусы. Тут мы пералічым некаторыя з іх, але перад гэтым лепш удакладніць пару момантаў:

  • Рабіць адзінкавыя тэсты не азначае рабіць TDD. Вы можаце зрабіць першае без другога. На самай справе вы можаце рабіць TDD без адзінкавага тэсціравання (але большасць людзей гэта робіць), у гэтым выпадку людзі звычайна дапаўняюць модульнае тэсціраванне іншымі відамі тэстаў. Вам напэўна трэба аўтаматычнае тэставанне, якім бы яно ні было.
  • Вы можаце выканаць TDD для тэставання белай скрынкі, каб праверыць ваш код. Але вы таксама можаце выканаць TDD для тэставання чорных скрынь, што часта называюць распрацоўкай паводзін.

Традыцыйна гэты працэс заключаўся ў праграмаванні вялікай колькасці модуляў, а затым у напісанні модульных тэстаў для праверкі кода. Гэта метад спачатку, тэст пазней. Але калі пасля кадавання часу няма, альбо вас прымушаюць выпусціць, тады ўсё практыкаванне модульнага тэсціравання прапускаецца альбо ў лепшым выпадку робіцца рэтраспектыўна.


Зараз, пра плюсы і мінусы TDD:





Плюсы распрацоўкі на аснове выпрабаванняў

  • Паколькі вы пішаце невялікія тэсты адначасова, гэта прымушае ваш код быць больш модульным (у адваротным выпадку іх цяжка праверыць). TDD дапаможа вам даведацца, зразумець і засвоіць асноўныя прынцыпы добрай модульнай канструкцыі.
  • TDD таксама абумоўлівае добрую архітэктуру. Для таго, каб зрабіць код адзінкавым для праверкі, яго неабходна правільна модуляваць. Пішучы тэсты, розныя архітэктурныя праблемы, як правіла, узнікаюць раней.
  • Дакументуе ваш код лепш, чым дакументацыя (ён не састарэе, бо вы ўвесь час яго выкарыстоўваеце).
  • Палягчае абслугоўванне і перапрацоўку кода. TDD дапамагае забяспечыць яснасць у працэсе ўкаранення і забяспечвае сетку бяспекі, калі вы хочаце перарабіць код, які вы толькі што напісалі.
  • Рабіць супрацоўніцтва прасцей і эфектыўней. Члены каманды могуць з упэўненасцю рэдагаваць адзін аднаго, таму што тэсты паведамляюць ім, калі коды паводзяць сябе нечакана.
  • Паколькі TDD па сутнасці прымушае пісаць адзінкавыя тэсты перад напісаннем кода рэалізацыі, рэфактарызацыя кода становіцца прасцей і хутчэй. Код рэфактарынгу, напісаны два гады таму, ёсць цяжка . Калі гэты код падмацаваны наборам добрых адзінкавых тэстаў, працэс значна прасцей.
  • Дапамагае прадухіліць дэфекты - ну, па меншай меры, гэта дапамагае знайсці праблемы з дызайнам альбо патрабаваннямі ў самым пачатку. TDD забяспечвае ранняе папярэджанне пра дызайнерскія праблемы (калі іх лягчэй выправіць).
  • Дапамагае праграмістам сапраўды зразумець іх код.
  • Стварае аўтаматызаваны набор тэстаў на рэгрэсію, у асноўным бясплатна. г.зн. вам не трэба марнаваць час на напісанне модульных тэстаў для праверкі кода рэалізацыі.
  • Гэта заахвочвае невялікія крокі і паляпшае дызайн, бо прымушае скараціць непатрэбныя залежнасці для палягчэння наладкі.
  • Гэта дапамагае ўдакладніць патрабаванні, таму што вы павінны канкрэтна высветліць, якія матэрыялы вы павінны падаваць і якія вынікі чакаеце.
  • Адзінкавыя тэсты асабліва каштоўныя як ахоўная сетка, калі код трэба змяніць альбо для дадання новых функцый, альбо для выпраўлення існуючай памылкі. Паколькі на тэхнічнае абслугоўванне прыпадае ад 60 да 90% жыццёвага цыкла праграмнага забеспячэння, цяжка пераацаніць, як час, неабходны для стварэння прыстойнага набору модульных тэстаў, можа акупляцца зноў і зноў на працягу ўсяго тэрміну праекта.
  • Тэставанне падчас запісу таксама прымушае вас паспрабаваць зрабіць вашыя інтэрфейсы дастаткова чыстымі, каб іх можна было праверыць. Часам цяжка зразумець перавагу гэтага, пакуль вы не папрацуеце над корпусам кода, дзе гэта не было зроблена, і адзіны спосаб ажыццявіць і засяродзіцца на дадзеным фрагменце кода - запусціць усю сістэму і ўсталяваць кропку прарыву. .
  • 'Дурныя' памылкі ловяцца практычна адразу. Гэта дапамагае распрацоўшчыкам знаходзіць памылкі, якія змарнавалі б час усіх, калі б іх знайшлі ў кантролі якасці.


Мінусы тэсціраванай распрацоўкі

  • Сам набор тэстаў павінен падтрымлівацца; тэсты могуць быць не цалкам дэтэрмінаванымі (г.зн. залежыць ад знешніх залежнасцей).
  • Тэсты складана напісаць, асабліва. за ўзровень адзінкавага тэсціравання.
  • Першапачаткова гэта запавольвае развіццё; для хутка ітэрацыйных асяроддзяў запуску код рэалізацыі можа быць не гатовы на працягу некаторага часу з-за марнавання часу на напісанне тэстаў. (Але ў перспектыве гэта фактычна паскарае развіццё)
  • Як і любое праграмаванне, ёсць вялікая розніца паміж тым, каб рабіць гэта і рабіць гэта добра. Напісанне добрых адзінкавых тэстаў - гэта від мастацтва. Гэты аспект TDD часта не абмяркоўваецца, многія кіраўнікі, як правіла, засяроджваюцца на такіх паказчыках, як ахоп кода; гэтыя паказчыкі нічога не кажуць пра якасць адзінкавых выпрабаванняў.
  • Адзінае тэсціраванне - гэта тое, што павінна набыць уся каманда.
  • Выклік для навучання. Спачатку гэта можа запалохаць і нялёгка навучыцца, асабліва спрабуючы навучыцца самастойна. Гэта патрабуе вялікай самааддачы (дысцыплінаванасці, практыкі, настойлівасці), і вы павінны мець мэту, якую хочаце пастаянна ўдасканальваць.
  • Цяжка прымяніць да існуючага састарэлага кода.
  • Шмат памылковых уяўленняў, якія перашкаджаюць праграмістам вучыцца гэтаму.
  • Цяжка пачаць працаваць такім чынам. Асабліва, калі вы шмат гадоў працуеце інакш.
  • Часам даводзіцца здзекавацца з мноства рэчаў ці з таго, што цяжка здзекавацца. Гэта карысна ў доўгатэрміновай перспектыве, але зараз балюча.
  • Вы павінны выконваць уборку дома пастаянна. Паколькі браніраванне новых і новых тэстаў робіць вашу зборку ўсё больш і больш доўгай, неабходна ўдасканаліць гэтыя тэсты, каб яны хутчэй працавалі, альбо выдаліць залішнія тэсты.
  • Як і любая добрая тэхніка, адзінкавае тэсціраванне можа быць даведзена да крайнасці. Самыя вялікія выгады прыносяць умераныя намаганні, таму што тэсты заўсёды выкарыстоўваюць код як мага больш простым спосабам. Калі вы часта перарабляеце тэсты, ёсць вялікая верагоднасць, што вы марнуеце занадта шмат часу на набор тэстаў.
  • У рамках модульнага тэсціравання можна лёгка адцягнуцца на 'пух' ці мудрагелістыя функцыі. Мы павінны памятаць, што простыя тэсты ствараюцца самымі хуткімі і простымі ў кіраванні.
  • Хаця гэта абсалютна неабходна, стварэнне тэстаў на збоі можа быць стомным, але ў выніку гэта акупляецца вялікім часам.
  • Рэфактарынг на ранняй стадыі патрабуе і тэставых заняткаў па рэфактарынгу.
  • Калі ўсе ўдзельнікі каманды правільна не праводзяць свае тэсты, уся сістэма можа хутка пагоршыцца.