TotT: 좋은 테스트란 무엇인가?
원문: https://testing.googleblog.com/2014/03/testing-on-toilet-what-makes-good-test.html (Translated by Google Gemini)
단위 테스트는 코드의 정확성을 확인하는 중요한 도구입니다. 그러나 좋은 테스트를 작성하는 것은 단순히 정확성을 확인하는 것 이상입니다. 좋은 단위 테스트는 읽기 쉽고 유지 보수 가능하도록 여러 다른 속성을 보여야 합니다.
좋은 테스트의 한 가지 속성은 명확성입니다. 명확성이란 테스트가 사람들에게 읽기 쉬운 문서 역할을 해야 하며, 테스트 중인 코드를 해당 public API 측면에서 설명해야 함을 의미합니다. 테스트는 구현 세부 사항을 직접 참조해서는 안 됩니다. 클래스의 테스트 이름은 클래스가 하는 모든 것을 말해야 하며, 테스트 자체는 클래스 사용 방법에 대한 예시가 되어야 합니다.
두 가지 더 중요한 속성은 완전성과 간결성입니다. 테스트는 본문에 이해하는 데 필요한 모든 정보가 포함되어 있을 때 완전하며, 다른 방해되는 정보가 포함되어 있지 않을 때 간결합니다. 이 테스트는 두 가지 모두에서 실패합니다.
@Test
public void shouldPerformAddition() {
Calculator calculator = new Calculator(new RoundingStrategy(),
"unused", ENABLE_COSIN_FEATURE, 0.01, calculusEngine, false);
int result = calculator.doComputation(makeTestComputation());
assertEquals(5, result); // Where did this number come from?
}
많은 방해되는 정보가 생성자에 전달되고 있으며, 중요한 부분은 헬퍼 메서드에 숨겨져 있습니다. 헬퍼 메서드의 목적을 명확히 함으로써 테스트를 더 완전하게 만들 수 있으며, 계산기 생성의 관련 없는 세부 사항을 숨기기 위해 다른 헬퍼를 사용함으로써 더 간결하게 만들 수 있습니다.
@Test
public void shouldPerformAddition() {
Calculator calculator = newCalculator();
int result = calculator.doComputation(makeAdditionComputation(2, 3));
assertEquals(5, result);
}
좋은 테스트의 마지막 속성은 탄력성입니다. 일단 작성되면, 탄력적인 테스트는 테스트되는 클래스의 목적이나 동작이 변경되지 않는 한 변경될 필요가 없습니다. 새로운 기능을 추가할 때는 기존 테스트를 변경하지 않고 새로운 테스트를 추가하기만 하면 됩니다. (그렇지 않다면 기존 테스트는 탄력성이 부족한 것입니다) 위의 원래 테스트는 새로운 관련 없는 생성자 매개변수를 추가할 때마다 업데이트해야 하므로(그리고 아마도 수십 개의 다른 테스트도!) 탄력적이지 않습니다. 이러한 세부 사항을 헬퍼 메서드로 옮김으로써 이 문제가 해결되었습니다.