일단기록

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

떤떤 2024. 5. 3. 02:33

요즘 기업 코딩 테스트 대비하기 위해서 열심히 알고리즘 문제를 풀고 있다. 프로그래머스 문제만 푼다면 편하게 프로그래머스를 이용하면 되지만 책에 있는 문제도 풀어보고 인프런 강의 문제도 풀다보니 바로 테스트 할 수 있고 실행시간도 알 수 있는 테스트 함수가 필요하다고 생각했다. 문제 풀 때 함수 자동완성이랑 포맷팅 때문에 마침  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]);

 

 

 

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