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. Мы поговорим об аннотациях и макросах, доступных при написании тестов, о поведении по умолчанию и параметрах запуска тестов, а также о том, как организовать тесты в модульные и интеграционные.