인프런 커뮤니티 질문&답변

:)님의 프로필 이미지

작성한 질문수

토비의 스프링 6 - 이해와 원리

학습 테스트

섹션3 학습테스트 시간 비교테스트 질문입니다.

24.07.20 14:44 작성

·

153

·

수정됨

1

섹션3의 학습테스트 과정 중 서로 다른 시간에 생성된 두 개의 Clock systemDefaultZone() 값을 isAfter() 로 비교 테스트 하는 중 아래와 같은 오류가 발생됩니다.

image.png

검색해보니 같은 문제를 겪고 있는 분들께서 WorkAround로 테스트 안정성을 높이기 위해 ChronoUnit.SECONDS 형태와 같이 초 단위까지만 비교하여 같은지 여부를 확인하거나,

Fixed Clock으로 시간을 수동으로 지정하여 검증하는 테스트 방법을 권장하고 있었습니다.

참고 사이트 :

https://velog.io/@weightle55/%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EA%B8%B0-%EC%96%B4%EB%A0%A4%EC%9A%B4-%EC%98%81%EC%97%AD%EC%9D%84-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B3%A0-%EB%B6%84%EB%A6%AC%ED%95%98%EA%B8%B0

강사님께서는 테스트를 바로 통과하셨는데, 차이가 무엇인지 궁금합니다.

답변 1

0

토비님의 프로필 이미지
토비
지식공유자

2024. 07. 21. 22:01

now()를 두 번 따로 실행을 했다면 실행 순간의 현재 시간을 가져오는 것이니 dt1, dt2는 조금이라도 차이가 나는게 분명하다는 것을 보여주려고 만든 간단한 학습 테스트였습니다. 일반 Clock을 사용한다면요. 그래서 저는 항상 dt2가 마이크로세컨드 단위에서 dt1과 얼마간 차이 나는 값이 나오고 그래서 테스트는 항상 성공을 했거든요.

아무리 빠른 CPU라고 하더라도 분명 차이가 나는게 분명한데, 지금 보여주신 에러 메시지를 보면 dt1, dt2에 나노초 단위까지 동일한 값이 들어가네요. 음.. 생각해보지 못했던 결과라 이상하긴 한데 코드를 보면 문제는 없어보이고요.

다른 Mock 툴을 이용해서 LocalDateTime.now()의 결과 값을 강제로 고정시킨 경우가 아니라면.. 무슨 이유일까요.

한 가지 확인을 해보고 싶은데요.

혹시 이 테스트 코드의 asssertThat 앞에 for-loop를 30번 정도 돌면서 LocalDateTime.now(clock)을 실행한 결과 값을 print 해보실 수 있을까요? 어떻게 결과가 나오는지 궁금합니다.

그와 다르게 dt1, dt2를 생성하는 중간에 Thread.sleep(1) 정도만 넣어주었을 때는 어떤 결과가 나오는지도 궁금합니다.

그리고 테스트 하신 OS 와 사용하시는 시스템 종류도 알려주시면 좋겠습니다.

요청드린 결과를 보여주시면 그 다음 추리를 해보도록 하겠습니다. 시간을 다루는 건 역시 쉽지 않네요.

 

Seonguk Lee님의 프로필 이미지

2024. 08. 09. 23:27

안녕하세요 토비님 저도 동일 증상 발생하여 누군가가 쓴 내용이 있나 커뮤니티를 눌러보았다 이 글을 발견했습니다. 30번 돌려보면 동일시간이 찍히다 갑자기 시간이 바뀌네요

2024-08-09T23:23:51.311053300

2024-08-09T23:23:51.311053300

2024-08-09T23:23:51.311053300

2024-08-09T23:23:51.311053300

2024-08-09T23:23:51.311053300

2024-08-09T23:23:51.311053300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

2024-08-09T23:23:51.312056300

 

Window11 사용하며 intel cpu 입니다.

토비님의 프로필 이미지
토비
지식공유자

2024. 08. 10. 07:32

그렇군요. 테스트 해주셔서 감사합니다.

윈도우 자바에서 사용하는 현재 시간을 가져오는 기능에서 시간을 캐싱을 하다가 한번씩 변경을 하는 듯하네요. 그래서 두 번 따로 now()를 호출해도 동일 값이 돌아오는 경우가 생기는군요.

제 맥 장비에서는 한번도 경험해보지 못했던 현상이라, 이런 경우가 있을지 미리 예측을 못했습니다.

 

제가 연속으로 30번 now()를 호출하면 다음처럼 모두 다 다른 값이 나옵니다. 다음에 윈도우 환경에서 테스트를 좀 해봐야겠네요.

앗. 마지막에 한번 같은 값이 나오네요. 기본 실행환경에서 시간이 마이크로초 까지만 나와서 그런 것 같은데, 요즘은 워낙 CPU가 빨라서 나노초까지 확인이 필요하긴 하겠네요.

사용 OS, Java 버전 등에 따라서 시간이 어떤식으로 처리되는지 한번 정리를 해봐야겠습니다.

 

2024-08-10T07:29:38.443003

2024-08-10T07:29:38.443128

2024-08-10T07:29:38.443151

2024-08-10T07:29:38.443173

2024-08-10T07:29:38.443187

2024-08-10T07:29:38.443201

2024-08-10T07:29:38.443216

2024-08-10T07:29:38.443228

2024-08-10T07:29:38.443241

2024-08-10T07:29:38.443256

2024-08-10T07:29:38.443270

2024-08-10T07:29:38.443284

2024-08-10T07:29:38.443303

2024-08-10T07:29:38.443317

2024-08-10T07:29:38.443328

2024-08-10T07:29:38.443365

2024-08-10T07:29:38.443394

2024-08-10T07:29:38.443415

2024-08-10T07:29:38.443431

2024-08-10T07:29:38.443445

2024-08-10T07:29:38.443458

2024-08-10T07:29:38.443470

2024-08-10T07:29:38.443484

2024-08-10T07:29:38.443496

2024-08-10T07:29:38.443511

2024-08-10T07:29:38.443522

2024-08-10T07:29:38.443533

2024-08-10T07:29:38.443544

2024-08-10T07:29:38.443556

2024-08-10T07:29:38.443566

:)님의 프로필 이미지

작성한 질문수

질문하기