구글의 뮤테이션 테스팅
휴일에 심심해서 논문 하나 소개해 드리려고 합니다.
ICSE(International Conference on Software Engineering) 2021에 소개된 "Does mutation testing improve testing practices?" 이라는 논문입니다. 논문과 발표 영상은 https://conf.researchr.org/track/icse-2021/icse-2021-papers 에서 보실 수 있습니다.
제1저자가 구글 엔지니어로 구글이 2014년부터 뮤테이션 테스팅을 도입한 후, 6년간의 데이터로 뮤테이션 테스팅이 얼마나 효과적인가에 대해 다루는 논문입니다.
대략 1500개의 구글내의 버그 픽스를 대상으로 연구를 했는데, 대략 70% 가량이 뮤테이션 테스팅으로 막을 수 있었던 버그라고 합니다. 나머지 30% 중에서도 대략 절반정도는 뮤테이션이 충분하지 않아서 그렇지 뮤테이션 테스팅 개념자체는 충분히 유효하다는 분석입니다. 구글에서는 이미 뮤테이션 테스팅을 도입했는데 왜 버그가 발생했냐면, 뮤테이션 테스팅의 오류를 수정하는 건 필수가 아니라서 그렇습니다.
아래는 뮤테이션 테스팅이 무엇인지 모르시는 분을 위해서 간단히 소개를 하겠습니다.
뮤테이션 테스팅은 코드에 사소한 변화를 주어서 (= 버그를 만들어 내서), 테스트 코드가 이를 검출하는지를 통해서 테스트 코드의 품질을 알아보는 방법입니다. 또 다른 테스트 품질을 측정하는 방법으로 커버리지가 있지만 뮤테이션 테스팅은 커버리지가 찾지 못하는 문제를 찾을 수 있습니다.
간단한 예제로
int code(int a, int b) {
return a + b;
}
void test() {
assert code(5, 0) == 5;
}위와 같은 코드와 테스트가 있을 때, 테스트 코드가 코드 함수의 모든 라인을 실행했기 때문에 커버리지는 100%가 됩니다. 하지만 위의 테스트는 아래의 변종(=mutant)에도 여전히 통과합니다.
int mutant(int a, int b) {
return a - b;
}뮤테이션 테스팅은 이와 같이 원래 code를 아래 mutant처럼 변화시키고, 테스트 코드가 이를 찾을 수 있는지를 알아보는 방법입니다. 여기서는 테스트 코드가 mutant에서도 통과하기 때문에, 테스트 코드가 불충분하다는 걸 알 수 있죠.
질문이나 지적 모두 환영합니다.
p.s. 코로나로 학회가 원격으로 진행되면서 ICSE 2021은 모든 발표자료 영상이 올라와 있네요. ICSE면 소프트웨어 엔지니어링 분야에서는 탑 티어급의 학회인데. 심심하실때 한번씩 보시면 좋을 것 같네요.