Moe's Tech Blog

[알고리즘] Specification Based Testing에 관하여 본문

Algorithms/Notes

[알고리즘] Specification Based Testing에 관하여

moe12825 2022. 3. 6. 02:39

들어가며

우리는 주로 코딩 시험을 연습할 때 "제출 후 채점하기" 버튼을 눌러 틀렸는지 맞았는지를 확인합니다. 연습할 때는 괜찮지만 실전은 다릅니다. 회사에서 일을 할 때 선배에게 "선배님 이게 맞습니까?" 하고 계속 물어볼 수 없습니다. 또한 코딩 테스트에서는 "제출 후 채점하기" 버튼을 누르면 서버에 기록이되 많이 누르면 누를수록 안 좋게 보일 수 있습니다. 필자는 Maurício Aniche의 Effective Software Testing에 나와있는 specification based testing을 공부하며 이 문제 점들을 막을 수 있으라고 생각합니다.

 

 

Specification Based Testing 절차

Step 1: 문제를 읽고 무엇을 목표로 함수를 만드는지, 함수에 들어가는 매개변수,  제한사항 그리고 return 값을 이해합니다.

 

예를 들어 프로그래머스에 나와있는 "나머지가 1이 되는 수 찾기" 문제를 읽으면은 목표, 들어가는 매개변수 그리고 return 값을 이해할 수 있습니다.

 

 

필자는 책에서 제한사항을 찾아야 하는 문구를 찾지 못했으나, 제한사항을 읽고 인지하고 있어야 한다는 생각을 깊이 갖고 있습니다. 초창기에 필자는 이 부분을 읽지 않고 문제를 풀었었는데 필요 이상 범위를 cover하는 알고리즘을 만들며 오랜 시간이 걸렸었습니다.

 

Step 2: 입출력 예를 보며 프로그램이 어떻게 작동해야 하는지 파악합니다. 

 

첫번째 입출력 예를 보면 입력 값 n이 10이고 출력 값이 3 입니다. 왜 일까요? 자연수 숫자 1부터 10의 나머지 숫자를 찾아봅시다. 이 자연수 숫자를 도전과 실패로 하나씩 하나씩 올리다 보면은 3에서 나머지 숫자 1이 나옵니다.

 

두번째 입출력 예를 봅시다. 첫번째 입출력 예의 경험을 살려 자연수 1부터 차근차근 도전하다보면은 11에서 나머지 숫자 1이 나오는것을 보실 수 있습니다.

 

Step 3: 자기 자신만의 입출력 예를 만들며 입력 값에 따라 알고리즘의 성격이 바뀌는 경계선을 찾습니다.

 

여기에서는 문제의 이해하지 못한 부분을 자신만의 예를 만들어 이해를 합니다.

 

예를 들어 문제 "나머지가 1이 되는 수 찾기"에서 제한사항 "3 <= n <= 1,000,000"을 보며 "3이 첫번째 입력 숫자구나. n이 3일땐 출력 값이 무엇일까? 여기에 알고리즘에 성격이 바뀌는 경계선이 있을까?" 하며 문제를 풀어나갑니다.

 

연습할때는 마음껏 예를 만들고 풀 수 있습니다. 하지만 이것은 시험환경에서는 시간적 이유로 어렵습니다. 따라서 필자는 이때 제한사항을 보며 감각적으로 경계선 일것 같다는 예를 찾아 풀어 나갑니다.

 

Step 4: 경계선을 분석합니다. 

 

예를 들어 문제 "나머지가 1이 되는 수 찾기"에서는 경계선이 될 수 있는 부분이 "n == 3 하고 n == 1,000,000" 입니다. 물론, 이 알고리즘 문제에서는 n == 3 이하 그리고 n == 1,000,000 이상의 입력값이 나오지 않습니다. 하지만 회사에서는 이 외의 입력 값이 들어가면은 "잘못된 입력 값 입니다." 하며 에러 메세지를 내어야 합니다.

 

필자는 경험으로 step 2, step3, 그리고 step 4를 동시에 했습니다. 그렇지 않으면 주어진 시간안에 풀기 힘듭니다.

 

Step 5: 테스트 케이스를 만듭니다.

 

이 문제에서는 현제 입출력 예 만으로 충분 합니다. 하지만, "n == 2"를 넣거나 "n == 1,000,001"을 넣어 실패 케이스를 테스는 하는것도 괜찮습니다.

 

Step 6: 알고리즘을 만들고 실행하며 쌓인 경험으로 테스트 케이스를 보충합니다.

 

처음에 못찾았다고 해서 민망해 하시지 않아도 됩니다. 알고리즘을 만들면서 "어... 이 부분을 cover하지 않았구나" 생각을 종종 갖게 됩니다. 연습을 하다보면 아차 하는 생각을 보다 적게 갖을 수 있습니다.

 

끝맺으며

기초는 익힐 수 있으나, 이 스킬을 마스터 할때까지는 끝임없는 연습이 필요합니다. 필자는 현제 프로그래머스의 level 1 문제들을 풀으며 경험을 쌓고 있습니다. 오늘의 경험이 코딩 테스트를 할때 빛이 보일것이라고 믿습니다.