← Back to list

Jest에서 toBe() 대신 toBeCloseTo()를 사용해야 할 때

최근 프로젝트에서 좌표 계산 관련 util 함수에 대한 테스트 코드를 작성했습니다.

Yeouniverses · 2026-06-02 05:48 · 0 claps · 3.7 min read
#nestjs #testcode #jest #to-be #tobecloseto
Open on Medium ↗

Jest에서 toBe() 대신 toBeCloseTo()를 사용해야 할 때

최근 프로젝트에서 좌표 계산 관련 util 함수에 대한 테스트 코드를 작성했습니다.

테스트 코드 작성 시 먼저 Claude Code에게 테스트 코드 생성을 요청하였습니다.

예를 들어 아래와 같은 euclideanDistance 함수에 대한 테스트 코드입니다.

describe('euclideanDistance', () => {
  it('같은 점 두 개를 입력하면 거리 0을 반환한다', () => {
    expect(euclideanDistance(MOCK_PT_3_4, MOCK_PT_3_4)).toBe(0);
  });

it('3-4-5 직각삼각형 좌표를 입력하면 거리 5를 반환한다', () => {
    expect(euclideanDistance(MOCK_PT_ORIGIN, MOCK_PT_3_4)).toBe(5);
  });
  it('음수 좌표를 입력해도 올바른 양수 거리를 반환한다', () => {
    expect(euclideanDistance(MOCK_PT_NEG_3_4, MOCK_PT_ORIGIN)).toBe(5);
  });
});

위 테스트에서는 모두 toBe()를 사용하고 있습니다.

expect(euclideanDistance(MOCK_PT_ORIGIN, MOCK_PT_3_4)).toBe(5);

toBe()를 사용할 수 있을까요?

이번 테스트에서 검증하는 값들은 모두 정확하게 떨어지는 정수이기 때문입니다.

예를 들어 원점 (0, 0)(3, 4) 의 거리는 다음과 같습니다.

√((3 - 0)² + (4 - 0)²)
= √(9 + 16)
= √25
= 5

결과가 정확히 5이므로 toBe(5)로 비교해도 문제가 없습니다.

실제로 위 세 개의 테스트는 모두 정상적으로 통과합니다.

그런데 다른 수학 계산 함수의 테스트 코드를 확인하던 중 흥미로운 점을 발견했습니다.

어떤 테스트는 toBe()를 사용하고 있었지만, 어떤 테스트는 toBeCloseTo()를 사용하고 있었습니다. 따라서 “왜 이렇게 작성했을까?”라는 궁금증이 생겼습니다.

그래서 Jest의 toBe()toBeCloseTo()가 정확히 어떤 차이가 있는지 직접 찾아보게 되었습니다.

결론부터 이야기하면, 그 차이는 부동소수점(Floating Point) 오차 때문이었습니다.

이번 글에서는 실제 프로젝트에서 사용한 euclideanDistancerpy2rotmat 테스트 코드를 기준으로 toBe()toBeCloseTo()를 언제 사용해야 하는지 정리해 보겠습니다.

모든 숫자 계산이 이렇게 깔끔한 것은 아니다

처음에는 비교는 전부 toBe()를 사용하면 된다고 생각했습니다.

하지만 회전 행렬을 계산하는 rpy2rotmat 함수를 테스트하면서 문제가 발생했습니다.

const mat = rpy2rotmat(0, 0, 0);

단위 행렬이 반환되어야 하므로 다음과 같이 테스트를 작성했습니다.

expect(mat[0][0]).toBe(1);

직관적으로는 맞는 코드처럼 보입니다.하지만 실제로는 테스트가 실패하는 경우가 있었습니다.값을 출력해 보니 다음과 같은 결과가 나왔습니다.

0.9999999999999998

사람이 보기에는 1과 거의 동일한 값입니다.

하지만 toBe()는 값이 완전히 동일해야 하기 때문에 실패하게 됩니다.

그래서 toBeCloseTo()를 사용한다

이런 경우에는 toBeCloseTo()를 사용해야 합니다.

expect(mat[0][0]).toBeCloseTo(1);

toBeCloseTo()는 완전히 같은 값인지 비교하는 것이 아니라 충분히 가까운 값인지를 비교합니다.

따라서 부동소수점 연산이 포함된 함수에서는 toBe()보다 훨씬 안전하게 사용할 수 있습니다.

저는 현재 다음 기준으로 사용하고 있습니다.

  • 정확한 정수 결과 → toBe()
  • Math.sin(), Math.cos(), 행렬 연산 → toBeCloseTo()

이번 euclideanDistance 테스트에서는 결과가 정확한 정수로 떨어지기 때문에 toBe()를 사용했습니다. 반면 rpy2rotmat처럼 삼각함수가 포함된 계산에서는 toBeCloseTo()를 사용하는 것이 적절합니다.

코드를 따라가다 보니 toBeCloseTo()를 왜 사용하는지, 그리고 부동소수점 오차가 무엇인지까지 자연스럽게 공부하게 되었습니다.

앞으로도 단순히 코드를 작성하는 것에서 끝나지 않고, 왜 그렇게 구현되었는지 이해하며 기준을 가지고 문제를 풀어내는 개발자가 되고 싶습니다.


메타데이터
post_id
2a96a5a4d553
slug
jest에서-tobe-대신-tobecloseto-를-사용해야-할-때-2a96a5a4d553
url
https://medium.com/@yeouniverses/jest%EC%97%90%EC%84%9C-tobe-%EB%8C%80%EC%8B%A0-tobecloseto-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%A0-%EB%95%8C-2a96a5a4d553
canonical_url
https://medium.com/@yeouniverses/jest%EC%97%90%EC%84%9C-tobe-%EB%8C%80%EC%8B%A0-tobecloseto-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%A0-%EB%95%8C-2a96a5a4d553
author_url
https://medium.com/@yeouniverses
status
ok
fetched_at
2026-06-18 00:10:23