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

자동화 테스트 작성하기

Edsger W. Dijkstra는 1972년 에세이 “The Humble Programmer” 에서 “프로그램 테스트는 버그의 존재 를 보여 주는 데는 매우 효과적일 수 있지만, 버그의 부재 를 보여 주기에는 절망적으로 불충분하다”고 말했습니다. 그렇다고 가능한 한 많이 테스트하려는 시도를 포기해야 한다는 뜻은 아닙니다!

프로그램의 정확성(correctness) 이란, 우리의 코드가 우리가 의도한 일을 실제로 수행하는 정도를 뜻합니다. 러스트는 프로그램의 정확성에 큰 비중을 두고 설계되었지만, 정확성은 복잡하고 증명하기 쉽지 않습니다. 러스트의 타입 시스템이 이 부담의 큰 부분을 떠안고 있지만, 타입 시스템이 모든 것을 잡아낼 수는 없습니다. 그래서 러스트는 자동화된 소프트웨어 테스트를 작성하기 위한 지원도 포함합니다.

예를 들어 add_two 라는 함수를 작성해, 인수로 받은 숫자에 2를 더한다고 합시다. 이 함수의 시그니처는 정수를 매개변수로 받고 정수를 반환합니다. 우리가 그 함수를 구현하고 컴파일할 때, 러스트는 지금까지 배운 타입 검사와 대여 검사를 전부 수행해 String 값이나 잘못된 참조가 이 함수에 넘어가지 않도록 막아 줍니다. 하지만 러스트는 이 함수가 “정확히 우리가 의도한 대로”, 즉 “매개변수에 2를 더한 값을 반환하는지”까지는 검사할 수 없습니다. 예를 들어 10을 더하거나 50을 빼는 구현이어도 타입상으로는 문제가 없기 때문입니다. 바로 이런 지점에서 테스트가 필요합니다.

예를 들어 add_two 함수에 3 을 넘겼을 때 반환값이 5 여야 한다고 테스트를 작성할 수 있습니다. 그리고 코드를 수정할 때마다 테스트를 실행해, 기존의 올바른 동작이 바뀌지 않았는지 확인할 수 있습니다.

테스트는 복잡한 기술입니다. 한 장만으로 좋은 테스트 작성법의 모든 세부를 다룰 수는 없지만, 이 장에서는 러스트 테스트 도구들의 작동 방식을 설명합니다. 테스트를 쓸 때 사용할 수 있는 주석과 매크로, 테스트 실행 시의 기본 동작과 각종 옵션, 그리고 테스트를 단위 테스트와 통합 테스트로 나누어 구성하는 방법을 이야기합니다.