Написание автоматических тестов

Тестирование программы может быть весьма эффективных средством проверки на наличие ошибок, но оно, к сожалению, положительно пройденные тесты не могут говорить об отсутствии ошибок. Эдсгер Вибе Дейкстра, “Скромный программист” (1972)

"Программа работает корректно" означает, что её код выполняет именно то, что мы от него ожидаем. В языке программирования Rust этому аспекту работы программ уделяется весьма много внимания. К сожалению, не всегда этого возможно достичь на все 100%. Система типов Rust способствует упрощению достижения этой цели, но, к сожалению, не может обеспечить исключения возможных ошибок. Именно поэтому в язык программирования была включена поддержка тестирования.

Например, мы написали функцию add_two, которая добавляет два к любому введённому в данную функцию числи и возвращает результат. После реализации и в момент компиляции данной функции, Rust проверит типы и владение, для того чтобы исключить возможные ошибки. К сожалению, компилятор не сможет проверить, что функция выполняет именно то, что от неё требуется (т.е. не будет возвращаться иное значение, нежели то, что было задумано программистом). Решить эту задачу поможет тестирование.

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

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