지금 토스페이먼트 결제를 연동하고있는데 토스에서 결제 요청-인증을 하면 토스에서 주소에 파라미터로 paymentKey을 주는데 이 paymentKey을 가지고 백엔드에서 토스의 api에 결제 승인 요청을 해야합니다. 그런데 서비스 단에서는 컨트롤러에서 파라미터을 통해 paymentKey을 알 수 있지 서비스단의 테스트 코드 작성 시는 paymentKey을 알 수 가 없는데 이런 경우는 테스트 코드를 어떻게 작성해야할까요? 추가적으로 외부 api 에서 paymentkey을 파라미터로 주는 컨트롤러는 어떻게 테스트해야할까요?
안녕하세요. 강의 잘 들었습니다 ! 강의 수강 후 제가 진행했던 프로젝트에서 테스트 코드를 작성해보고 있는데 엔티티들의 연관 관계에 대해서 궁금한게 생겨서 질문 드립니다. 강의에서 Order의 create를 테스트하기 위해 Product를 먼저 생성 후 DB에 저장하는 것과 비슷하게, 커뮤니티의 게시글이라면, 게시글(Board)과 작성자(User)는 엔티티에서 연관 관계가 설정되어 있고 Board 테이블에는 User의 PK가 참조키로 설정해야할 때, given에서 User 엔티티도 DB에 save 후 저장된 User를 Board가 참조하도록 테스트 코드를 작성하는게 맞을까요 ? 제가 궁금한 것은, 실제 서비스라면 엔티티들은 수많은 연관 관계가 있을텐데 한 엔티티의 비즈니스 로직 등을 테스트하기 위해, 그 엔티티와 연관 관계에 있는 다른 엔티티들을 모두 given 절에서 생성하고 DB에 저장해야 하는지 궁금합니다. 감사합니다 !
안녕하세요. LocalDateTime.now () 를 이용하여 테스트 하는 걸 지양하자라는 강사님 강의 중에 제가 겪었던 경험에 대해 질문이 있습니다. 현재 개인적인 프로젝트에서 테스트 코드를 작성하고 있습니다.회원가입을 할때 가입한 시점을 저장하기 위해 LocalDateTime 을 파라미터로 받고 있는데요, 이 로직을 검증하기 위해 테스트 코드를 작성하였습니다. 그러나 아래와 같은 에러가 발생하더라구요 org.opentest4j.AssertionFailedError: expected: 2024-01-03T21:25:11.333406800 (java.time.LocalDateTime) but was: 2024-01-03T21:25:11.333407 (java.time.LocalDateTime) when comparing values using 'ChronoLocalDateTime.timeLineOrder()' Expected :2024-01-03T21:25:11.333406800 (java.time.LocalDateTime) Actual :2024-01-03T21:25:11.333407 (java.time.LocalDateTime) 대략 에러 메세지를 확인해보니 LocalDateTime.now 로 생성한 값과 저장한 뒤에 조회한 시간의 오차가 발생하여 테스트가 실행하는 것 이었습니다. 해서 LocalDateTime.now 가 아닌 임의의 시점을 지정해주어서 문제를 해결할 수 있었는데 혹시 비슷한 경험을 하신적이 있으신지? 있으시다면 제가 말한 방법대로 테스트 코드를 작성하는게 적절한지? 가 궁금합니다! 감사합니다!!
Jupyter command jupyter-contrib not found. 지금 이 오류가 떠서 설치가 안되고 있는데요. 어떻게 해결해야 할까요?? 제가 봤을땐, pip install jupyter_contrib_nbextensions 이 부분은 실행이 되는데 jupyter contrib nbextension 이 부분에서 오류가 생기는 것 같습니다. ㅠㅠ
클래스 정의하고 호출하면 42번 줄에 player1에 해당하는 height와 weight의 값이 둘 다 나와야 하는데 저는 한가지 값만 출력이 됩니다. weight를 지우고 height 값만 쓰면 height값이 출력되고 둘다 쓰면 height값은 안나오고 weight값만 출력이 되는데 왜 이런 걸까요?
안녕하세요. 테스트 환경 통합 강의를 보다가 궁금한 점이 생겨서 질문하게 되었습니다! 강사님께서는 테스트 환경 통합을 위하여 테스트 클래스에서 테스트 환경 추상 클래스(IntegrationTestSupport, ControllerTestSupport)를 상속하는 방식을 사용하셨습니다. ControllerTest에서는 MockMvc, ObjectMapper, @MockBean 처리할 Service들을 protected 필드로 넘겨줄 필요가 있어서 추상 클래스를 사용하는 방식에 대해 되게 좋다고 생각했는데요! Service와 Repository 테스트의 경우에는 그런 공통된 필드들이 필요하지 않기 때문에 추상 클래스가 아닌 커스텀 어노테이션을 생성하여 구성하여도 되지 않을까? 싶어서 질문드리게 되었습니다! @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @ActiveProfiles("test") @SpringBootTest public @interface IntegrationServiceTest { } @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @ActiveProfiles("test") @Transactional @SpringBootTest public @interface RepositoryTest { } 제가 생각한 코드는 위와 같습니다! 제가 생각했을 때의 어노테이션으로 테스트 환경을 관리하였을 때의 장점은 자바에서는 다중 상속이 안되기 때문에 조금 더 유연하다고 생각했습니다! 강사님께서는 커스텀 어노테이션을 사용하여서 테스트 환경을 통합하는 방식에 대하여 어떻게 생각하시는지 궁금합니다! (강의 너무 유익하게 잘 듣고 있습니다! 새해 복 많이 받으시구 내년에도 화이팅입니다ㅎㅎ)
안녕하세요. 테스트 코드를 수강하고 있는 학생입니다. 긴 작업일 경우 트랜잭션을 걸지 말라고 하셨는데. 조회용 트랜잭션이 Repository 단에서 걸린다는 말씀을 하셨는데 Repository의 조회 로직이 수행될 때 트랜잭션이 걸리는 건가요? 뭔가 잘못 이해한거 같기도 해서 질문합니다. 그리고 @RequiredArgsConstructor @Service public class MailService { private final MailSendClient mailSendClient; private final MailSendHistoryRepository mailSendHistoryRepository; public boolean sendMail(String fromEmail, String toEmail, String subject, String content) { boolean result = mailSendClient.sendEmail(fromEmail, toEmail, subject, content); if (result) { mailSendHistoryRepository.save(MailSendHistory.builder() .fromEmail(fromEmail) .toEmail(toEmail) .subject(subject) .content(content) .build() ); return true; } return false; } } 여기서는 Transaction을 걸어줘야 하는게 맞는거 같아서. 이 부분도 궁금합니다. 요약 저는 서비스 Layer 에서 Transaction 을 걸어 db작업에서 문제가 발생했을 경우 rollback 되어야 한다고 생각했습니다. 강의에서 긴 작업들이 실제로 트랜잭션에 참여하지 않아도 되는데 -> OrderStatisticsService 에서는 CUD 작업이 아니니깐 Transaction을 안 걸어도 된다.? MailService 에서는 Transaction을 걸어줘야 하는게 아닌가요? (Create 작업 수행) 조회용 트랜잭션이 Repository 단에서 걸린다.? 뭔지 잘 모르겠습니다.
controller테스트를 할때 mockMVC를 사용하면 DB에 CRUD 작업은 수행되지 않나요? 디버깅을 해보면 각 Layer별로 동작이 수행되는거 같은데 DB접근하여 데이터를 가져오는 부분에서는 null이 계속 나오네요(MyBatis 사용중). 또 만약 실제 프로덕션 controller처럼 모든 동작이 수행된다면 왜 "하위 Layer를 모두 mocking처리" 라고 표현하시는지 궁금합니다.
안녕하세요~~ 루비네 코딩 입니다 ^^ 최근 앱을 런칭할 때 다음과 같은 오류가 발생하고 있습니다. ModuleNotFoundError: No module named 'altair.vegalite.v4' 이런경우, 다음과 같이 altair 패키지의 버전을 바꾸어 설치해 주세요 ^^ 감사합니다~ pip uninstall altair pip install altair==4.2.2
안녕하세요. 현재 섹션 5까지 수강을 하고 헷갈리는 것이 있어 질문 남기게 되었습니다. 섹션 5에서 3개의 레이어에 대한 테스트를 진행하는 데 이 테스트들은 단위 테스트인지 통합 테스트인지 헷갈립니다. @SpringBootTest 어노테이션을 사용하는 것으로 봐서는 스프링 빈을 전부 로드하는 통합테스트 같기도 하면서, @WebMvcTest 어노테이션을 사용하는 것을 봤을 때는 다른 레이어와 독립적인 테스트를 진행하는 것 같아 단위테스트 같은 것 같다고 생각했습니다. 이번 섹션에서 진행한 테스트는 어떤 종류의 테스트인가요? 만약 단위(혹은 통합)테스트라면 다른 종류에 있는 테스트는 어떻게 진행해야 하는지, 아니면 이 테스트만으로 충분하지 궁금합니다.
안녕하세요 연구실에서 자체적으로 실험기기와 컴퓨터랑 통신을 진행하는 중인데, 하나가 해결이 안 되어서 너무 답답해서 고수님들께 자문을 구하려고 합니다. Rs232 rtu 모드를 지원한다고 한 OS-20 overhead stirrer과 통신을 진행 중 입니다. 이 친구의 통신 규격과 방식은 아래 그림 3개와 같습니다. 이중 stirrer control 부분을 제가 참조해서 저 command를 hex 방식으로 입력하였는데 도무지 안되는 겁니다. 그런데 웃긴게 이 회사에서 지원하는 공식 통신프로그램을 사용하면 작동이 잘 되더군요. Instruction overview에서 나온 규칙은 다음과 같습니다. Command 구조는 Prefix Instruction_code Data_frame Checksum로 되어 있고 입력의 prefix는 0xfe로 시작하며 responce는 0xfd로 시작합니다. 모든 바이트 사이에는 50ms delay가 존재해야하며 Dataframe은 큰 수 자리부터 전송합니다. ex) 1000rpm을 data frame에 입력하려고 할 시 Hex값이 03E8이니까 앞에 두 자리를 0x03에 해당하고 뒤에 두 자리를 0xE8로 해당시킵니다. Null은 0x00입니다. Checksum 방식은 0xfe,0xfd인 prefix를 제외하고 나머지를 전부 더한 값으로 0xnn 이런식으로 표현됩니다. 신기하게도 16진수의 2자리를 넘어가도 뒤에 2 자리만 붙이면 된다고 하더군요. ex) 0xfe 0xb1 0x03 0xe8 0x00 checksum인데 0xfe를 제외하고 다 더하면 019c이지만 0x9c만 입력하면 되는 형식입니다. 그래서 이 규칙대로 코드를 짜서 통신을 해 보았는데, 아무리 해도 안되어서 너무 답답합니다. 심지어 제가 잘못했는지 확인하려고 시리얼 통신 sniffer을 사용하여서 공식 프로그램에서는 어떻게 통신이 되나 뜯어보았습니다. 결과는 아래 사진과 같습니다. 제가 python으로 작성한 코드는 아래와 같습니다. import serial import time ser = serial.Serial( port='COM7', # Update with your actual port baudrate=9600, parity=serial.PARITY_NONE, # No parity stopbits=serial.STOPBITS_ONE, # 1 stop bit bytesize=serial.EIGHTBITS # 8 data bits ) def send_hex_string(hex_string): # Convert the hex string to bytes byte_data = bytes.fromhex(hex_string) # Send the bytes over the serial port ser.write(byte_data) def send_hex_string_with_delay(hex_string, delay_ms=50): for i in range(0, len(hex_string), 2): # Extract each pair of characters and convert to bytes hex_pair = hex_string[i:i + 2] byte_data = bytes.fromhex(hex_pair) # Send the bytes over the serial port ser.write(byte_data) # Wait for the specified delay time.sleep(delay_ms / 1000.0) command = 'feb103e8009c' send_hex_string_with_delay(command) ser.close() 또한 파이썬에서의 결과를 시리얼 전송으로 보면 다음과 같습니다. 입력은 제대로 되는데 기기에는 반응이 제대로 나오지 않네요... 제가 잘못하고 빠뜨린 점이 있을까요? 읽어주셔서 정말 감사드립니다.
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요! 먼저 유사한 질문이 있었는지 검색해 보세요. 서로 예의를 지키며 존중하는 문화를 만들어가요. 현재 자바 백엔드 개발자입니다. 현재 마이바티스로 테스트 코드를 짜려고하는데 검증할 쿼리는 어떤 테이블의 특정 버전의 가장 높은 버전을 가져오는 쿼리로 그 특정버전으로 정렬을 시키고 top(1)을 사용해서 가져오게하는 쿼리로 짜놓은 상태입니다. 그러면 이걸 테스트를 하려고하면 셀렉트 쿼리를 하나 더짜서 그 특정버전에 max()를 사용해서 값으로 가져온 후 검증을 하는 방법이 떠오르는데요 그러면 이런 또하나의 쿼리가 생기는데 또하나의 쿼리가 잘 못 된다면 그 테스트의 경우가 잘못되는것을 말하는데 이런 상황에서 어떻게 하셨는지 궁금합니다