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 года «Смиренный программист» (The Humble Programmer) Эдсгер Дейкстра заметил, что «тестирование программ может весьма эффективно показывать наличие ошибок, но безнадёжно непригодно для доказательства их отсутствия». Но это не значит, что тестировать нужно меньше!

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

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

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

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