엡실론
2k
2022-01-02 04:17:48
2
633

구글의 뮤테이션 테스팅


휴일에 심심해서 논문 하나 소개해 드리려고 합니다.

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면 소프트웨어 엔지니어링 분야에서는 탑 티어급의 학회인데. 심심하실때 한번씩 보시면 좋을 것 같네요.


2
  • 댓글 2

  • 앙앙이
    4k
    2022-01-02 08:48:40

    int a, int b 라는 파라미터에서 테스트는 

    양수, 음수 이렇게 2가지 그룹이 있어 {양수, 양수}, {양수, 음수},  {음수, 양수}, {음수, 음수} 테스트 케이스가 있어야 한다고 생각하겠고 좀더 생각을 한다면 최대값, 양수 임의 값, 0,  음수 임의 값, 최소값 5가지에서 2가지 조합이 되겠네요.


    하지만 이정도도 하기 힘든것이 현실이라 1가지 경우만 테스트 케이스로 만든건데요.

    뮤테스트까지 할까요?

    중요한 테스트라면 풀테스트 비용이 너무 크기때문에 뮤테스트를 고려할 필요가 있다고 생각합니다.

    하지만 비용 문제때문에 뮤테스트를 선뜻 도전하기 어렵네요.

  • 엡실론
    2k
    2022-01-02 13:25:25

    테스트 케이스를 만들자면 한도 끝도 없지만, 저 예제에서는 적어도 5, 0 보다는 5, 3인 쪽이 더 낫다는 걸 뮤테이션 테스팅과 더불어 보여드리고 싶었습니다.

    비용이라면 테스트 실행시간을 말씀하시는 건가요?

    뮤테이션 테스팅은 실행 시간이 만만치 않죠. 구글에서는 모든 커밋에 뮤테이션 테스팅을 적용하고 있습니다. 각각의 커밋에서 변경되는 부분에 대해서만 뮤테이션 테스팅을 적용해서 비교적 적은 비용으로 꽤 효과를 얻고 있는 거죠.

    거기다 논문에 많은 경우에 한 코드 라인에 하나의 뮤테이션을 적용하는 것과 여러 종류의 뮤테이션을 적용하는 것에 큰 차이가 없었다는 내용이 있습니다. 그런식으로 뮤테이션 테스팅 실행 시간을 줄일 수 있겠죠.

    모든 뮤턴트를 다 제거하는 비용이라면, 그것도 조금 부담스럽긴 합니다만 논문 결과를 봤을 때는 장기적인 관점에서는 충분히 가치가 있을 것 같습니다. 논문 내용에서 한가지 아쉬운 점이라면 얼마나 많은 뮤테이션 테스팅 결과가 실제 버그로 이어지느냐 인데, 이 부분은 측정이 쉽지 않을 것 같네요.

    구글에서도 아직 뮤테이션 테스팅 통과를 필수로 하지 않는 건 비용 문제와도 관계가 있겠죠. 

  • 로그인을 하시면 댓글을 등록할 수 있습니다.