현재 제가 겪고 있는 상황인데 조언 부탁드립니다.
547
작성한 질문수 4
SpringBoot 에서 멀티 스레드로 크롤러가 돌아가는 프로젝트 입니다.
junit 테스트 코드를 통해 크롤러가 10개 정도 게시판 페이지를 정상적으로 가져오는지 확인하려고 하는데요.
현재 작성된 테스트 케이스는 아래와 같습니다.
@Test
void crawlerTest() {
// 크롤링 시작
crawlerRun();
while(스레드풀 작업 종료됐나??) {
// 작업이 안끝났으면
Thread.sleep(5000);
}
}
while 문이 있으면 정상적으로 10개의 게시판 페이지를 크롤링한 이후 DB에 적재됩니다.
다만 강의를 보면서 while 문이 없어도 되지 않을까 생각해서 삭제하거나 주석처리하면 올바르게 동작하지 않습니다.
[while 문 제거 후]
디버깅을 통해 값이 제대로 들어오는지 확인하면서
테스트 케이스를 돌리면 4~5 개정도만 DB 에 크롤링한 데이터가 저장되고 갑자기 오류도 없이 테스트가 종료됩니다.
디버깅없이 그냥 실행시키면 6개 정도 DB에 저장되고 테스트가 종료됩니다.
crawlerTest() 라는 테스트 코드가 Main Thread 라고 쳤을 때 다른 Thread 들은 정상적으로 동작 중이어야 하지 않나요..?
아니면 Spring 환경이라서 이런 문제가 발생하는 것인지
junit 테스트 코드라서 이런 문제가 발생하는건지 궁금합니다!
( Daemon Thread 는 아닙니다! )
답변 2
1
저도 예전에 비슷한 상황을 마주친 적이 있어서 질문을 올렸고,
스스로 답을 찾은 적이 있습니다. 해당 질문 링크를 공유합니다.
https://www.inflearn.com/questions/567543
추가적으로 이런 일정 시간 대기 또는 비동기 동작에 대한 Junit 테스트를 하고 싶다면
을 알아보시면 좋을 거 같습니다.
1
음..
이 부분은 테스트 스레드에서 수행하는 메카니즘과 메인 스레드에서 수행하는 메카니즘이 다르거나 여러 내부적인 연결고리가 있을 수 있습니다.
당장 메인 스레드에서 테스트 했을 때 그런 현상이 발생하지 않는다면 말이죠..
사실 JVM 이 테스트 스레드가 수행중인 메서드가 종료되었을 때 다른 유저 스레드를 강제로 종료시키지는 않습니다.
이 부분은 저도 정확한 원인을 좀 더 찾아 봐야 겠지만 테스트 스레드가 일반적으로 우리가 알고 있는 유저 스레드의 흐름에 좀 더 특수성을 가지도록 설계되어 있을 수도 있습니다.
좀 더 서치가 필요할 것 같습니다.
멀티스레드 단일스레드
0
56
0
new Condition 부분 질문
0
83
1
13:00 강의 내용 이해 질문
0
99
1
강의 출시 질문 있습니다.
0
117
1
InterruptedExceptionThreadStopExample 질문입니다.
0
94
2
instance.getMyField()의 값이 왜 다른가요?
0
115
1
해당 강의 내용 무단 도용 신고
0
211
2
Thread Waiting 상태 관련 질문 드립니다.
0
186
1
단일연산변수 api
0
126
0
synchronized 블럭과 메인메모리 반영
0
147
0
실무에서 자바가 제공하는 락을 사용하는 경우
1
243
1
뮤텍스나 세마포어는 busy waiting이 없는 게 맞을까요?
0
159
1
16:50부분에서 타입락 질문드립니다.
0
110
2
16분 7초 뮤텍스 코드 관련해 질문드립니다.
0
160
2
동기화가 보장된다고 하더라도 스레드간 데이터 불일치가 발생할 수 있지 않나요??
0
199
2
리액티브-part2
0
180
2
문자열 풀 값을 이용한 String 변수
0
207
2
스레드 라이브러리는 커널과 같은 역할을 하지 못하나요?
0
173
1
자식 프로세스를 쓰는 이유
0
186
1
커널 모드 전환시 질문이 있습니다!
0
146
1
[공유] setName 시 threadName이 1부터 시작하는 이유
0
178
1
synchronized = 모니터
0
285
2
Thread의 Context Switching 문의드립니다.
1
257
1
동기 & 논블록킹 질문 드립니다.
0
232
2





