Тестове и документация
22.10.2013
Днес няма да си говорим за acceptance testing, quality assurance или нещо, което се прави от "по-низшия" отдел във фирмата.
Всичко тук е дело на програмиста.
Проектът идва с готово, подробно задание.
Прави се дизайн.
С него работата се разбива на малки задачи.
Те се извършват последователно.
За всяка от тях пишете кода и приключвате.
Изискванията не се променят, нито се добавя нова функционалност.
Щом съм написал един код, значи ми остава единствено да го разцъкам - няколко print-а, малко пробване в main функцията и толкова.
Така или иначе няма да се променя.
А ако (не дай си боже) това се случи - аз съм го писал, знам го, няма как да допусна грешка.
Най-много да го поразцъкам още малко.
Заданията винаги се променят.
Често се налага един код да се преработва.
Писането на код е сложна задача - допускат се грешки.
Програмистите са хора - допускат грешки.
Промяната на модул в единия край на системата като нищо може да счупи модул в другия край на системата.
Идва по-добра идея за реализация на кода, по ред причини
За всичко съмнително ще пишем сценарий, който да "цъка".
Всеки сценарий ще изпълнява кода и ще прави няколко твърдения за резултатите.
Сценариите ще бъдат обединени в групи.
Пускате всички тестове с едно бутонче.
Резултатът е "Всичко мина успешно" или "Твърдения X, Y и Z в сценарии A, B и C се оказаха неверни".
Искаме да тестваме и производителността на нашия код
n
пъти и записват времето, отнело за изпълнениеРазбрахме се, че тестовете са ни супер важни.
Очевидно в стандартната библиотека на Go, има пакет за това.
За да тестваме foo.go
, създаваме foo_test.go
в същата директория, който тества foo.go
testing.T
Test
и слеващата буква да е главнаt.Error()
, t.Fail()
, t.Fatal()
...testing.B
Benchmark
и слеващата буква да е главнаfor
цикъл, извикващ t.N
пъти тестваната функцияgo
е достатъчно умен да реши колко пъти да я извика, за да получи адекватни резултати
go
генерира автоматична документация на нашия код, вземйаки под внимание:
godoc -http=:6060
Тук вече нещата стават шантави.
Example
, последвана от типа (ErrorFoo
)ErrorFoo_Bar
)Output: