• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Junit5 테스트 관련 질문있습니다.

22.10.02 16:15 작성 조회수 263

0

강사님 제가 스프링부트, 스프링시큐리티, JPA로 간단한 프로젝트를 만들면서 mockmvc를 이용해 컨트롤러 쪽 테스트를 하는데 특정 메소드가 해당 메소드만 테스트를 했을 때에는 잘 수행이 되는데 해당 메소드가 속한 테스트 클래스를 전체 수행했을 때에 다른 메소드들은 다 정상 작동하는데 특정 한 메소드만 자꾸 NoSuchElementException 에러가 납니다. 혹시 이유를 알 수가 있을까요?..

답변 6

·

답변을 작성해보세요.

3

OMG님의 프로필

OMG

2022.10.02

안녕하세요. 박정훈님, 공식 서포터즈 OMG입니다.

.
코드를 본 것이 아니기 때문에 제가 생각하는 예상가는 점에 대해 말씀드리겠습니다.
단일 테스트 실행 시에는 테스트가 성공하나, 다른 테스트와 함께 실행 시 문제가 된다면

이전 테스트 데이터가 실패하는 테스트에 영향을 주고 있지 않나 생각합니다.

가령, A라는 테스트에서 발생한 로직(데이터 생성, 삭제 등)으로 인해 B라는 테스트의 동작에 영향을 주어 B에서 NoSuchelementException이 발생하여 실패하는 것이지 않나 생각합니다.

이 부분에서 확인해봐야 할 것은

1.테스트와 DB를 접근하는 영역에서 @Transactional이 선언되어있는지

2.@BeforeEach, @AfterEach로 다른 테스트에 영향을 주지 않고 독립적인 실행이 가능하도록 되어있는지

두 가지를 확인해보셔야 할 것 같아요.

추가)

질문 내용을 보니, 컨트롤러 관련 테스트라면 1번 보다는 2번 쪽에서 문제가 발생하지 않나 싶습니다.

.

감사합니다.

0

박정훈님의 프로필

박정훈

질문자

2022.10.08

네 답변 감사합니다!!!

0

OMG님의 프로필

OMG

2022.10.08

안녕하세요. 박정훈님, 공식 서포터즈 OMG입니다.
.

프로젝트 코드 확인해보았습니다.

처음 답변드렸던 이전 테스트의 영향이 맞네요. 해결 방안은 아래를 참고해주세요


 

제 pc에 mariaDB가 설치되어 있지 않기도 하고, 테스트에서 실행은 h2로도 가능하여 h2로 변경하였습니다.

build.gradle

dependencies {      
    runtimeOnly 'com.h2database:h2' // 추가
}

test에 yml 추가

image

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password:
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        show_sql: true
        format_sql: true
    open-in-view: false

logging.level:
  org.hibernate.SQL: debug
#  org.hibernate.type: trace

 

어노테이션 추가

@SpringBootTest
@Transactional
@AutoConfigureMockMvc
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) // 추가
class MemberControllerTest {

결과

image

해당 어노테이션을 추가하여 해결 할 수 있습니다.

발생 이유는 아래 링크에서 설명하는 것과 동일하며, 단일 테스트에서 성공한 이유와 전체로 실행 시 실패한 이유를 확인 할 수 있습니다.

https://n1tjrgns.tistory.com/250

id로 검색하기보다는 username으로 사전 중복 검증 로직을 추가하셨으므로 이름으로 조회하여 테스트를 작성하는 것이 나을 것 같습니다. 

.
감사합니다.

0

박정훈님의 프로필

박정훈

질문자

2022.10.04

감사합니다.

링크는 아래와 같습니다.

https://drive.google.com/file/d/17aIxPGU98QP8Oj4LWcRBQ3BXoba73fAK/view?usp=sharing

파일 압축 해제 하신 다음 테스트 코드 쪽에 controller 폴더의 MemberControllerTest 를 실행시키면

edit_password_post 메소드 에서만 에러가 발생합니다. 하지만 edit_password_post 메소드 하나만 실행시키면 에러가 발생하지 않습니다.

Member 라는 테이블에 데이터가 들어있어야 하는 페이지들이 있어 @BeforeEach에 데이터를 추가하는 로직을 담았습니다. 그런데

Member 테이블을 이용하는 메소드가 join_post, edit_post, edit_password_post 인데 이 중에서 edit_password 만 혼자 실행시킬 때는 잘 작동하고 클래스 단위로 실행시키면 에러가 납니다.

0

안녕하세요. 박정훈님

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

0

박정훈님의 프로필

박정훈

질문자

2022.10.02

답변 감사합니다. 그런데 테스트와 DB 접근 하는 쪽 코드가 1, 2번의 조건을 모두 갖춘 것 같은데도 그런 것 같습니다...