잠못드는 물리학과
189
2020-07-09 14:31:34 작성 2020-07-09 14:38:52 수정됨
4
2017

좋은 테스트란 무엇일까?_뮤테이션 테스트


이번 학기에 배운 수업이 인상에 깊게 남아 그 일부를 정리해보았습니다.


A) 좋은 테스팅의 조건과 coverage intro

테스트 성능을 측정할 때 바라는 것은

  1. 코드의 얼마나 많은 경우를 테스트 할 수 있을까?

  2. 나중에 코드가 변경되었을 때 오류를 어떻게 빨리 잡을 수 있을까?

  3. 테스트가 얼마나 가벼운가?

일것입니다. 오늘은 이중 (1)과 (2)에 대해서만 생각하겠습니다. (1)을 측정할 수 있는 직관적인 척도는 당연 coverage입니다. 많은 연구원분들이 branch coverage, line coverage와 같은 척도를 개발했고 그 중 많이 사용하는 건 line coverage입니다. line coverage보다 더 엄밀하게 경우의 수를 따지는 것도 있지만 코드 구성만 잘한다면 line coverage만으로도 충분히 괜찮다고 생각합니다.


B) coverage가 높은 것에 안심할 수 있을까? - 뮤테이션 테스트

 하지만 코드를 100%커버했다고 좋은 게 아닙니다.  coverage만으로는 (2)를 얼마나 만족하는지 제대로 알 수 없기 때문입니다. OSHI라는 자바 오픈소스 라이브러리를 본적이 있었는데 아래와 같은 테스트가 있더라구요.


assertTrue(proc.getBitness() >= 0);
assertTrue(proc.getBitness() <= 64);

getBitness는 운영체제가 32bit인지 64bit인지 볼 수 있는 메서드입니다.  위를 보면 getBitness가 52와 같은 유효하지 않은 bitness를 출력해도 test를 통과할 수 있습니다. 이런 건 좋은 테스트가 아닙니다. 지금은 이렇게 바뀌었습니다.


assertTrue(os.getBitness() == 32 || os.getBitness() == 64);

이러나 저러나 coverage에는 변함이 없습니다. 그렇기 때문에 위와 같은 문제를 확인할 수 있는 다른 게 필요하겠죠?


저는 이 때 “뮤테이션 테스트(mutation test)” 기법을 사용했습니다. 뮤테이션은 “변종”이란 뜻으로 일부러 코드를 망친 다음 우리의 테스트가 그 문제를 얼마나 잘 찾아내는지 보는 것입니다. 저는 pitest(http://pitest.org/)를 사용했고 위와 같은 문제를 성공적으로 볼 수 있었습니다. 코드를 변형하는 규칙은 http://pitest.org/quickstart/mutators/에 잘 나와있지만 몇가지만 간략히 소개하겠습니다. 

  1. 조건을 반전시킨다

  2. 사칙연산의 연산자를 바꾼다.


    //Before mutation
    if (a == b) {
      a=b+c;
      // do something
    }
    //-------------------------------------
    //After mutation
    if (a != b) {
      a=b-c;
      // do something
    }
    

    뮤테이션 테스트는 이미 많은 곳에서 사용하고 있습니다. javascript는 stryker를 이용해 뮤테이션 테스트를 할 수 있습니다. 


    C) 뮤테이션 테스트도 해결하지 못하는 것이 있다.

     getBitness의 문제는 해결된 듯 합니다. 하지만 아직 해결되지 않은 것이 있습니다. 만약 64bit 운영체제에서 getBitness가 32비트라고 출력하면 이걸 어떻게 해결해야 할까요? 이는 뮤테이션 테스트로는 잡지 못합니다. 그렇기 때문에 뮤테이션 테스트가 coverage의 단점을 보완할 수 있어도 항상 이러한 한계점이 있다는 것 또한 아셔야 할것입니다.


    짧은 글재주로 써봤는데 읽어주셔서 감사합니다.

    3
    • 댓글 4

    • 봄을찾아서
      243
      2020-07-11 00:28:03

      굉장히 좋은 내용 감사합니다.

      최근 테스트 코드를 작성해 나가면서 이런저런 고민이 생기는데, 이 글을 읽고 고민 중 하나가 해소된 기분입니다.


      혹시, 들으신 강의가 SW 테스팅에 대해 전반적인 내용을 다루는 강의였나요?

      테스팅에 대해 더 깊게 공부하고 싶은데, 마땅한 자료를 찾고 있지 못해서요.

      실례가 되지 않는다면 강의에 참고된 교재 등을 추천해주실 수 있으실까요?

    • 잠못드는 물리학과
      189
      2020-07-11 21:06:58

      네 SW 테스트를 자동화하는 방법에 대해 다룬 수업이었습니다. 교재는 없지만 아래 링크에서 수업자료를 받으실 수 있습니다! 중간고사 이후로는 수업이 실습 위주였기 때문에 그 이후 자료는 보시지 않아도 될 것 같습니다.

      https://coinse.kaist.ac.kr/teaching/2020/cs453/

    • 봄을찾아서
      243
      2020-07-11 21:55:32

      감사합니다!

    • zoso
      2
      2020-07-16 01:28:38

      좋은 글이네요. 잘 보고 갑니다.

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