반응형
Coroutine의 유닛 테스팅
Coroutine
의suspend Function
들은runblocking
코드블럭으로 수행하면된다.- 다만,
동적으로 Scope
를 만드는 경우에는Dispatchers
를parameter
를 넘겨받는ViewModel
을 사용해야 한다.
Android Architecture Component와 함께 사용
- Android Architecture Component와 함께 사용하면,
LifeCycle
관리등 장점도 많이 있지만, 주의해야할 점들도 있다. Andorid
특징을 고려해서는Coroutine
코드는Viewmodel
에 놓는 것이 적합하다.
Job
Debug Mode
Debug mode
에서 Job
을 toString
하면, 아래와 같은 형식으로 나온다.
“coroutine#1”:BlockingCoroutine{Active}@6d311334
Debugging Coroutine
and Threads
Coroutine
은한 Thread
에서 실행되어다른 Thread
에서Resume
될 수 있다.- 심지어
Single-Threaded Dispatcher
의 경우에도 어떤 일을 어디서 언제 수행하는지 알아내기 힘들 수 있다. 일반적인 Debugging 방법
은 **Thread name
을 Log로 출력**하는 것이다, 이는Logging Framework
를 통해 쉽게 할 수 있다,.coroutine
을 사용할 때,쓰레드
만 찍으면,context
정보를 충분히 알 수 없기 때문에,kotlinx.coroutine
에 debugging 용도로 함수들이 들어가 있다.'-Dkotlinx.coroutines.debug'
*JVM option 과 함께 아래 코드를 실행하면Thread.currentThread().name
만 출력해도 *“main @coroutine#1
” 과 같이 출력된다.- JVM 이
-ea
옵션으로 실행되는 한 debug mode 는 항상 켜져 있으며,
debug mode 일 때는coroutine#1
의 숫자는 순차적으로 assign 되어 출력된다.
fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")
runBlocking{
val a = async{
log(“I’m a”)
6
}
val b = async{
log(“I’m b”)
7
}
log(“answer is ${a.await() * b.await()}”)
}
- 위의 경우 아래와 같이 3개의
Coroutine
이 있다.- answer 를 print 하는 main coroutine (#1)
- I’m a 를 print 하는 main coroutine (#2)
- I’m b 를 print 하는 main coroutine (#3)
Naming Coroutine For Debugging
- 자동으로 Assign된 id도 로그를 자주 찍으면 상호관계를 보기에는 좋다.
- 그러나,
coroutine
이특정 request
의 processing에 묶여있거나,특정 background task
를 수행한다면, Debug 용도로 이름을 주는 것이 좋다. CoroutineName
도Context Element
로Thread Name
과 같은 기능을 한다.- 마찬가지로 Debugging mode가 켜져 있다면,
thread name
과 함께 표시된다.
- 마찬가지로 Debugging mode가 켜져 있다면,
runBlocking(CoroutineName(“main”)){
log(“Started main coroutine”)
val v1 = async(CoroutineName(“v1coroutine”)){
delay(500L)
log(“Computing v1”)
252
}
val v2 = async(CoroutineName(“v2coroutine”)){
delay(1000L)
log(“Computing v2”)
6
}
log(“The answer for v1 / v2 = ${v1.await() / v2.await(){“)
}
/* OUTPUT */
[main @main#1] Started main coroutine
[main @v1coroutine#2] Computing v1
[main @v2coroutine#3] Computing v2
[main #main#1] The answer for v1 / v2 = 42
반응형
'IT > Kotlin' 카테고리의 다른 글
[Kotlin/Coroutine] 6. Coroutine의 Structured Concurrency(구조화된 동시성) (0) | 2023.05.19 |
---|---|
[Kotlin/Coroutine] 5. Coroutine의 예외처리와 취소 (0) | 2023.05.08 |
[Kotlin/Coroutine] 4. Coroutine의 구성요소: Coroutine의 생성과 활용 (0) | 2023.04.22 |
[Kotlin/Coroutine] 3. launch와 async의 Job과 Deferred (0) | 2023.04.07 |
[Kotlin/Coroutine] 2. Kotlin에서의 Coroutine: launch와 async (0) | 2023.03.24 |