인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

denia park님의 프로필 이미지
denia park

작성한 질문수

코틀린 코루틴 완전 정복

코루틴 단위 테스트 심화

[코루틴 테스트 심화] runTest의 스레드 관련 문의

해결된 질문

작성

·

43

1

안녕하세요 강사님!

강의 복습 중에 runTest 관련 문의가 있어서 다음과 같이 질문을 남기게 됐습니다.

 

코루틴 테스트 심화강의의 4:07초에 시작되는 부분을 보면 runTest를 호출해 실행되는 코루틴은 메인 스레드를 사용한다라고 해주셨습니다.

 

image.png

 

제가 실제로 runTest를 이용해 코드를 실행시켜 보니 Test worker스레드를 사용하고 있다고 나왔습니다.

 

실행 코드

    @Test
    fun `메인 스레드만 사용하는 runTest`() = runTest {
        println("[${Thread.currentThread().name}] 메인 시작")
        delay(100)
        println("[${Thread.currentThread().name}] 메인 종료")
    }

결과

[Test worker @kotlinx.coroutines.test runner#2] 메인 시작
[Test worker @kotlinx.coroutines.test runner#2] 메인 종료

 

실제 사용되는 스레드는 Test worker 스레드 이지만, 테스트 코드에서 실행될 때 Test worker 스레드가 메인 스레드 처럼 동작하기 때문에 메인이라고 말씀해주신 걸까요??

 

감사합니다!

답변 2

2

조세영님의 프로필 이미지
조세영
지식공유자

denia park 님 안녕하세요. 지식 공유자 조세영입니다.

runTest는 기본적으로 테스트 환경에서 실행되며, 코루틴 테스트 환경에서 메인 스레드 처럼 동작하는 Test worker 스레드에서 동작합니다. 이 부분은 조금 설명이 잘못 된 부분이 있는 것 같습니다. runTest 함수가 호출되면, runTest로 만들어진 코루틴이 완료될 때까지 호출된 스레드를 점유하고 블로킹하는데요. 이 부분에서는 메인스레드에서 runTest가 호출되었습니다.

즉, runTest는 Test worker 스레드에서 실행되는 것이 맞고, 메인 스레드에서 runTest가 호출되기 때문에 코루틴이 실행 완료될 때까지 메인 스레드가 블로킹되게 됩니다. 따라서 위 설명은 다음과 같이 수정되는 것이 맞습니다.

runTest를 호출해 실행되는 코루틴은 호출 스레드를 블로킹하며, 내부의 모든 코루틴이 실행 완료될 때까지 종료를 방지한다.
이 부분은 빠른 시일 내에 조금 더 명확한 설명으로 대체할 수 있도록 하겠습니다. 질문 주셔서 감사합니다.

denia park님의 프로필 이미지
denia park
질문자

정확하게 제대로 알려주셔서 정말 감사합니다!

제대로 이해가 되었습니다.

 

연말이 얼마 남지 않았는데, 새해 복 많이 받으세요.

1

조세영님의 프로필 이미지
조세영
지식공유자

이 부분 설명을 변경한 강의가 업로드 되었습니다. 리포트 해주셔서 감사합니다!

denia park님의 프로필 이미지
denia park

작성한 질문수

질문하기