작성
·
411
·
수정됨
0
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 이 테스트 스레드가 수행중인 메서드가 종료되었을 때 다른 유저 스레드를 강제로 종료시키지는 않습니다.
이 부분은 저도 정확한 원인을 좀 더 찾아 봐야 겠지만 테스트 스레드가 일반적으로 우리가 알고 있는 유저 스레드의 흐름에 좀 더 특수성을 가지도록 설계되어 있을 수도 있습니다.
좀 더 서치가 필요할 것 같습니다.