ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 올바른 단위테스트 검증 로직 작성법
    Object & Test 2010. 12. 6. 13:43

    테스트를 작성할 때 코드를 어떻게 작성해야 할지 고민되는 시점이 있는데 바로 작성한 테스트가 잘 수행되었는지 검증(Verification)하는 부분을 작성할 때입니다. 검증할 데이터가많거나 복잡한 경우 Assert문으로 검증하는 게 어렵게 느껴지기 때문입니다.

    예를 들어, 검증할 객체가 리스트 안에 여러 개 들어 있다거나, 리스트 안에 들어있긴 한데 몇 번째 있는지는 모른다거나, 아니면 들어 있는 순서가 테스트 수행할 때마다 바뀐다던가 하는 경우에 특히 그렇습니다

    이럴 경우테스트를 검증하기 위해 루프나 조건문을 사용하고자 하는유혹을 느끼게 됩니다뭐 딱히 안될 것도 없구요다음은 그렇게 해서 등장하는 검증 로직입니다저도 이전에 이런 식으로 테스틀 작성하곤 했습니다.

    public void testCrud() {
    List<Type> types = accountService.readTyps();
    assertEquals(2, types.size());
    for (Type type : types) {
    if (type.getCode().equals("INVEST_DIVIDEND")) {
    assertEquals("I", type.getDebit().getCode());
    assertEquals("INVEST", type.getCredit().getCode());
    } else if (type.getCode().equals("DEF_DIVIDEND")) {
    assertEquals("I", type.getDebit().getCode());
    assertEquals("DEFERRED", type.getCredit().getCode());
    }
    }
    }

     

    하지만, 이런 식의 검증 로직은 좋지 않습니다. 테스트 코드 내에 루프나 조건 문이 들어갈 경우 제어의 흐름이 여러 개로 분리될 수 있으며, 테스터는 여러 경우를 모두 대비해서 코딩을 해야 합니다. 게다가다른 사람이 테스트 코드를 보게 될 경우에는 이런 제어 흐름을 분석하는데 시간을 낭비하게 됩니다.

    따라서, 테스트 작성자는 테스트하는 로직에 대한 반응을 정확히 알고(예측) 테스트를 작성해야 합니다. 다시말해, 수행되는 코드가 어떻게 행동할지를 정확히 알고 테스트를 작성해야 한다는 말입니다.

    만약, 위에서 예로 든 루프나 조건문을 갖는 검증 코드가 테스트코드 내에 등장한다면, 로직을 잘 못 작성하거나, 테스트를 잘 못 작성한 것입니다. 리스트 안. 몇 번째에 원하는 결과가 있는지도 정확히 예측하여 테스트를 작성해야 한다는 말입니다. 다음은 위의 코드를 하나의 제어 흐름만을 갖도록 수정한 케이스입니다. 여기서 눈여겨 봐야할 것 같은 리스트 안에서 순서까지도 고려되어 테스트케이스가 작성되었다는 것입니다.

    public void testCrud() {

     List<Type> types = accountService.readTyps();
     assertEquals(2, types.size());

    assertEquals("INVEST_DIVIDEND", types.get(0).getCode());
    assertEquals("I", types.get(0).getDebit().getCode());
    assertEquals("INVEST", types.get(0).getCredit().getCode());

    assertEquals("DEF_DIVIDEND", types.get(1).getCode());
    assertEquals("I", types.get(1).getDebit().getCode());
    assertEquals("DEFERRED", types.get(1).getCredit().getCode());
    }

    사소한 것이라고 치부하고 넘어갈 수도 있지만, 이런 코드들이 모여 테스트 코드의 강인성 만들므로, 항상 올바른 방식으로 테스트 코드를 작성해야 합니다.

Designed by Tistory.