Това е първият от цикъл постове за test-driven development и автоматизирано тестване.
Има ред причини да пишем тестове – по-лесна поддръжка, документация, дори по-добър сън. Несъмнено сте чували повечето. Но ето една по-рядка – мързел.
Как писахте код когато се учихте да програмирате? Аз писах нещо и после го пробвах. Ако не работеше, го преработвах и го пробвах пак. Продължавах в същия дух, докато програмата тръгне както искам. В добрите случаи проверката бе няколко print
-а тук-там. В лошите бе цъкане в браузъра или разговор с конзолата. В крайна сметка, като напишеш нещо, трябва да се увериш че работи.
В цикъла (1) мислене какво, (2) писане и (3) тестване, последната стъпка бе най-досадна. Машинално трябваше да повтарям едно и също. Не само – в нея допусках най-много грешки. Дълго смятах, че е неизбежно. Научих се да мисля повече преди да компилирам. Да осмислям как промените ми ще повлиаят на кода. Да внимавам повече.
Всичко това бе хубаво, но в крайна сметка прекарвах половината време в досадни, повтарящи се задачи, в които лесно се допуска грешка. А нашата цивилизация има отговор на това – автоматизацията. В частност, компютрите. Наистина, защо да не напишем малка програма, която проверява дали кодът ни работи, вместо всеки път да пробваме ръчно?
Сметката е проста. Представете си, че ми отнема 30 секунди да тествам кода си на ръка и 2 минути да напиша автоматизирана проверка. Ако проверявам ръчно три пъти, няма да спечеля. Но на четвъртия нещата се изравняват, а всеки следващ – бонус. И смятам консервативно – не вземам предвид нито възможността за грешки, нито увереността при бъдещи промени.
Писането на тестове е продължение на тази идея, но по организиран и систематичен начин. Вместо всеки път да откривате топлата вода, ползвате утвърдене инструмент. Правите тестовете си по-разбираеми за колеги и се опирате на дългогодишен опит на други. Получавате на готово ред допълнителни благинки (code coverage, continuous integration, т.н.).
Още повече, писането на тестове е умение, което се усвоява. Първоначално един тест не отмена 4x повече време – отнема 20x. Но с практика бързо се смъква до 10x, след което до 5x и така докато не отнема съвсем мънично повече (понякога по-малко!), отколкото ръчното тестване.
И стигайки до там, откривате причина да започна да пиша тестове – мързи ме да си проверявам кода на ръка. Предпочитам да го автоматизирам. Спестява ми време и не допускам грешки.
Мързела движи света