Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Написание автоматизированных тестов

В своем эссе 1972 года «Скромный программист» Эдсгер В. Дейкстра сказал, что «тестирование программы может быть очень эффективным способом показать наличие ошибок, но совершенно непригодно для доказательства их отсутствия». Это не значит, что мы не должны стараться тестировать как можно больше!

Корректность наших программ – это степень, в которой код делает то, что мы от него ожидаем. Rust спроектирован с большим вниманием к корректности программ, но корректность сложна, и доказать ее непросто. Система типов Rust берет на себя огромную часть этой нагрузки, но она не может поймать все ошибки. Поэтому Rust включает поддержку написания автоматизированных тестов программного обеспечения.

Допустим, мы пишем функцию add_two, которая прибавляет 2 к любому переданному ей числу. Сигнатура этой функции принимает целое число как параметр и возвращает целое число как результат. Когда мы реализуем и компилируем эту функцию, Rust выполняет все проверки типов и проверки заимствований, которые вы уже изучили, чтобы гарантировать, например, что мы не передаем в эту функцию значение String или недействительную ссылку. Но Rust не может проверить, что эта функция сделает ровно то, что мы задумали: вернет параметр плюс 2, а не, скажем, параметр плюс 10 или параметр минус 50! Именно здесь нужны тесты.

Мы можем написать тесты, которые утверждают, например, что при передаче 3 в функцию add_two возвращаемое значение равно 5. Мы можем запускать эти тесты каждый раз, когда меняем код, чтобы убедиться, что существующее правильное поведение не изменилось.

Тестирование – сложный навык: хотя в одной главе невозможно охватить каждую деталь написания хороших тестов, в этой главе мы обсудим механику средств тестирования Rust. Мы поговорим об аннотациях и макросах, доступных при написании тестов, о поведении по умолчанию и параметрах запуска тестов, а также о том, как организовывать тесты в модульные и интеграционные тесты.