본문 바로가기
일단기록

알고리즘 문제 테스트를 위한 테스트 실행 함수 만들기

by 떤떤 2024. 5. 3.

요즘 기업 코딩 테스트 대비하기 위해서 열심히 알고리즘 문제를 풀고 있다. 프로그래머스 문제만 푼다면 편하게 프로그래머스를 이용하면 되지만 책에 있는 문제도 풀어보고 인프런 강의 문제도 풀다보니 바로 테스트 할 수 있고 실행시간도 알 수 있는 테스트 함수가 필요하다고 생각했다. 문제 풀 때 함수 자동완성이랑 포맷팅 때문에 마침  VSCODE에서 풀고 깃허브에 올리고 있는데 마침 잘 됐다!

 

완전 럭키잖앙 ㅎ 

 

test-helper.js

import assert from 'assert';

/**
 * @param {string} testName - 테스트케이스 이름
 * @param {Function} soluctionFunc - 테스트 진행할 함수
 * @param {*} expectedResult - 함수 예상 결과
 * @param {...*} args - 함수에 전달할 값
 * @returns {void}
*/
export function runTest(testName, soluctionFunc, expectedResult, ...args) {
    try {
        const startTime = process.hrtime();

        const result = soluctionFunc(...args);

        const endTime = process.hrtime(startTime);
        const duration = endTime[0] * 1000 + endTime[1] / 1000000;

        if (typeof expectedResult === 'object') {
            assert.deepStrictEqual(result, expectedResult);
        } else {
            assert.strictEqual(result, expectedResult);
        }

        console.log(`${testName}: Success! (${duration} ms)`);
    } catch (error) {
        console.error(`${testName}: ${error.message}`);
    }
}
  1. 가져다 쓸 때 파라미터 순서 헷갈려서 JSDoc를 추가해줬다.
  2. Date 클래스 사용하는 것보다 나노초 단위로 반환하는 process.hrtime()이 더 정확해서 이걸 사용했다.
  3. duration 변수는 나노초 단위에서 밀리초 단위로 변환해서 저장했다.
  4. 문제에 필요한 파라미터 개수 확장성을 고려해서  ...args로 해줬다
  5. 결과값이 object 타입일 때 strictEqual() 을 사용하면 메모리에서 동일한 위치에 저장되어있는지 엄격하게 확인하기 때문에 동일한 구조, 동일한 요소인지 확인하기 위해 deepStrictEqual()로 확인했다.

 

runTest() 함수 사용 예시

runTest('convertDecimalToBinary #1', convertDecimalToBinary, 1011, 11);
runTest('convertDecimalToBinary #2', convertDecimalToBinary, 10111, 23);
runTest('convertDecimalToBinary #3', convertDecimalToBinary, 1111000, 120);
runTest('checkEqualSubsetSums #1', checkEqualSubsetSums, 'YES', 6, [1, 3, 5, 6, 7, 10]);
runTest('checkEqualSubsetSums #2', checkEqualSubsetSums, 'NO', 9, [3, 6, 13, 11, 7, 16, 34, 23, 12]);
runTest('checkEqualSubsetSums #3', checkEqualSubsetSums, 'YES', 10, [3, 6, 9, 13, 11, 7, 16, 34, 23, 12]);

 

 

 

야호~! 성공하면 이렇게 뜬다.