Bird
Raised Fist0
Kotlinprogramming~5 mins

Testing coroutines with runTest in Kotlin - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of runTest in Kotlin coroutine testing?

runTest is used to run coroutine code in a controlled test environment. It helps to test suspend functions by providing a special coroutine scope and controlling the virtual time.

Click to reveal answer
intermediate
How does runTest help with timing in coroutine tests?

runTest controls virtual time, allowing you to advance time manually without waiting in real time. This makes tests faster and deterministic.

Click to reveal answer
intermediate
What happens if a coroutine launched inside runTest is not completed by the end of the test?

The test will fail because runTest checks for uncompleted coroutines to avoid leaks and ensure all work is done.

Click to reveal answer
beginner
Show a simple example of using runTest to test a suspend function.
<pre>import kotlinx.coroutines.test.runTest
import kotlin.test.Test
import kotlin.test.assertEquals

class MyTest {
    @Test
    fun testSuspendFunction() = runTest {
        val result = suspendFunction()
        assertEquals("Hello", result)
    }

    suspend fun suspendFunction(): String {
        return "Hello"
    }
}</pre>
Click to reveal answer
intermediate
Why should you avoid using Thread.sleep() inside runTest?

Thread.sleep() blocks the thread and does not advance virtual time in runTest. Instead, use advanceTimeBy() or delay() to simulate time passing.

Click to reveal answer
What does runTest provide when testing coroutines?
AA replacement for <code>Thread.sleep()</code>
BA way to run blocking code only
CAutomatic UI updates
DA controlled coroutine scope with virtual time
Which function should you use inside runTest to simulate time passing?
Await()
BThread.sleep()
CadvanceTimeBy()
Dsleep()
What happens if a coroutine is still running after runTest finishes?
AThe test fails due to unfinished coroutines
BThe test passes anyway
CThe coroutine is cancelled silently
DThe coroutine runs on a new thread
Which annotation is commonly used with runTest in Kotlin tests?
A@RunWith
B@Test
C@CoroutineTest
D@SuspendTest
Why is runTest preferred over runBlocking for coroutine tests?
ABecause <code>runTest</code> controls virtual time and detects leaks
BBecause <code>runBlocking</code> is deprecated
CBecause <code>runTest</code> runs faster on the UI thread
DBecause <code>runBlocking</code> cannot run suspend functions
Explain how runTest helps in testing Kotlin coroutines and why controlling virtual time is important.
Think about how waiting in real time can slow tests and how virtual time solves that.
You got /4 concepts.
    Describe a simple test case using runTest to verify a suspend function returns the expected result.
    Imagine you want to check a function that says 'Hello' after a delay.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of using runTest in Kotlin coroutine testing?
      easy
      A. To run coroutine tests quickly and safely
      B. To create new threads for coroutines
      C. To convert coroutines into blocking calls
      D. To disable coroutine dispatchers

      Solution

      1. Step 1: Understand the role of runTest

        runTest is designed to run coroutine tests in a controlled environment that is fast and safe.
      2. Step 2: Compare options with runTest purpose

        Options A, B, and D describe unrelated or incorrect behaviors. Only To run coroutine tests quickly and safely correctly states the purpose.
      3. Final Answer:

        To run coroutine tests quickly and safely -> Option A
      4. Quick Check:

        runTest purpose = run coroutine tests quickly and safely [OK]
      Hint: Remember: runTest runs coroutine tests safely and fast [OK]
      Common Mistakes:
      • Thinking runTest creates new threads
      • Confusing runTest with blocking calls
      • Assuming runTest disables dispatchers
      2. Which of the following is the correct syntax to start a coroutine test using runTest?
      easy
      A. runTest[] { val result = suspendFunction() }
      B. runTest() => { val result = suspendFunction() }
      C. runTest { val result = suspendFunction() }
      D. runTest -> { val result = suspendFunction() }

      Solution

      1. Step 1: Recall the correct runTest syntax

        The correct syntax uses parentheses with a lambda block: runTest { ... }.
      2. Step 2: Check each option's syntax

        runTest { val result = suspendFunction() } matches the correct syntax. Options B, C, and D use invalid Kotlin syntax for lambdas.
      3. Final Answer:

        runTest { val result = suspendFunction() } -> Option C
      4. Quick Check:

        Correct runTest syntax = runTest { ... } [OK]
      Hint: Use curly braces {} after runTest for coroutine tests [OK]
      Common Mistakes:
      • Using parentheses with arrow syntax incorrectly
      • Using square brackets instead of braces
      • Using arrow (->) instead of braces for lambda
      3. What will be the output of this Kotlin test code using runTest?
      import kotlinx.coroutines.test.runTest
      import kotlinx.coroutines.delay
      
      fun suspendFunction(): String {
          delay(100)
          return "Done"
      }
      
      fun main() {
          println(suspendFunction())
      }
      medium
      A. Done
      B. Compilation error
      C. Runtime exception
      D. No output

      Solution

      1. Step 1: Analyze the suspend function usage

        suspendFunction contains delay(100) call, which requires a suspend function context, but suspendFunction itself is not marked as suspend.
      2. Step 2: Check for compilation errors

        Calling suspend functions like delay inside a non-suspend function causes a compilation error.
      3. Final Answer:

        Compilation error -> Option B
      4. Quick Check:

        Calling delay requires suspend context = compilation error if missing [OK]
      Hint: delay must be called from suspend context [OK]
      Common Mistakes:
      • Assuming suspend functions like delay can be called from normal functions
      • Expecting output without suspend keyword
      • Ignoring suspend function rules
      4. Identify the error in this coroutine test code using runTest and how to fix it:
      import kotlinx.coroutines.test.runTest
      import kotlinx.coroutines.delay
      
      fun suspendFunction(): String {
          delay(100)
          return "Done"
      }
      
      fun main() = runTest {
          val result = suspendFunction()
          println(result)
      }
      medium
      A. suspendFunction should be marked suspend
      B. runTest cannot be called inside main
      C. delay cannot be used inside runTest
      D. println cannot be used inside runTest

      Solution

      1. Step 1: Check suspendFunction declaration

        suspendFunction calls delay(100) but is not marked as suspend, which is incorrect for coroutine code.
      2. Step 2: Fix by marking suspendFunction as suspend

        Marking suspendFunction as suspend allows it to be called inside runTest properly.
      3. Final Answer:

        suspendFunction should be marked suspend -> Option A
      4. Quick Check:

        suspendFunction missing suspend keyword = error [OK]
      Hint: Mark functions calling coroutines as suspend [OK]
      Common Mistakes:
      • Not marking suspendFunction as suspend
      • Thinking runTest can't be in main
      • Believing delay is disallowed in runTest
      5. You want to test a suspend function fetchData() that returns a string after a delay. Which is the best way to write a test using runTest to verify it returns "Success"?
      hard
      A. runTest { val result = fetchData(); assert(result == "Success") }
      B. runTest { val result = fetchData(); println(result) }
      C. runBlocking { val result = fetchData(); assert(result == "Success") }
      D. runTest { val result = fetchData(); assertEquals("Success", result) }

      Solution

      1. Step 1: Choose correct test function and assertion

        runTest is the recommended coroutine test runner. Using assertEquals is the standard way to check expected results in tests.
      2. Step 2: Compare options for best practice

        runTest { val result = fetchData(); assertEquals("Success", result) } uses runTest and assertEquals, making it the best choice. runTest { val result = fetchData(); assert(result == "Success") } uses assert but not the standard function. runTest { val result = fetchData(); println(result) } only prints result. runBlocking { val result = fetchData(); assert(result == "Success") } uses runBlocking which is less preferred for coroutine tests.
      3. Final Answer:

        runTest { val result = fetchData(); assertEquals("Success", result) } -> Option D
      4. Quick Check:

        Use runTest + assertEquals for coroutine tests [OK]
      Hint: Use runTest with assertEquals to verify coroutine results [OK]
      Common Mistakes:
      • Using runBlocking instead of runTest
      • Using print instead of assertions
      • Using assert instead of assertEquals
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard