We measure how long tests take to run to find slow tests and improve speed.
When you want to know if a test is taking too long to run.
When you want to compare test speeds before and after code changes.
When you want to find tests that slow down your whole test suite.
When you want to optimize your testing process for faster feedback.
Syntax
JUnit
long startTime = System.currentTimeMillis();
// run test code
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
Use System.currentTimeMillis() to get the current time in milliseconds.
Subtract start time from end time to get how long the test took.
Examples
This prints how many milliseconds the test took.
JUnit
long startTime = System.currentTimeMillis();
// test logic here
long endTime = System.currentTimeMillis();
System.out.println("Test took " + (endTime - startTime) + " ms");
This JUnit test measures and prints its own execution time.
JUnit
@Test
void exampleTest() {
long start = System.currentTimeMillis();
assertEquals(4, 2 + 2);
long end = System.currentTimeMillis();
System.out.println("Execution time: " + (end - start) + " ms");
}
Sample Program
This test checks if 2 + 3 equals 5 and measures how long the test takes. It prints the time and asserts the time is not negative.
JUnit
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class ExecutionTimeTest {
@Test
void testAdditionExecutionTime() {
long startTime = System.currentTimeMillis();
int result = 2 + 3;
assertEquals(5, result);
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
System.out.println("Test execution time: " + duration + " ms");
assertTrue(duration >= 0, "Execution time should be zero or positive");
}
}
OutputSuccess
Important Notes
Execution time can vary depending on your computer speed and workload.
Very fast tests may show 0 ms because of millisecond precision.
Use this method to find slow tests and improve them.
Summary
Measure test time by recording start and end times.
Use execution time to find and fix slow tests.
Print or log times to see test speed during runs.
Practice
(1/5)
1. What is the main purpose of measuring test execution time in JUnit?
easy
A. To automatically fix failing tests
B. To check if tests are written with correct syntax
C. To verify the correctness of test assertions
D. To identify slow tests and improve test suite performance
Solution
Step 1: Understand test execution time concept
Measuring execution time helps find tests that take longer than expected.
Step 2: Identify the goal of measuring time
Knowing slow tests allows developers to optimize or fix them, improving overall test speed.
Final Answer:
To identify slow tests and improve test suite performance -> Option D
Quick Check:
Execution time = find slow tests [OK]
Hint: Execution time helps spot slow tests to speed up runs [OK]
Common Mistakes:
Confusing execution time with test correctness
Thinking it fixes tests automatically
Ignoring performance impact of slow tests
2. Which JUnit code snippet correctly measures the execution time of a test method?
easy
A. long start = System.nanoTime(); // test code here
long end = System.nanoTime(); System.out.println(end - start);
B. long start = System.currentTimeMillis(); // test code here
long end = System.currentTimeMillis(); System.out.println(end - start);
C. int start = System.nanoTime(); // test code here
int end = System.nanoTime(); System.out.println(end - start);
D. int start = System.currentTimeMillis(); // test code here
int end = System.currentTimeMillis(); System.out.println(end - start);
Solution
Step 1: Check correct data type for time
System.nanoTime() returns long, so variables must be long, not int.
Step 2: Verify correct method usage
System.nanoTime() is preferred for measuring elapsed time with better precision.
Final Answer:
long start = System.nanoTime(); // test code here long end = System.nanoTime(); System.out.println(end - start); -> Option A
Quick Check:
Use long + System.nanoTime() for timing [OK]
Hint: Use long type with System.nanoTime() for precise timing [OK]
Common Mistakes:
Using int instead of long for time variables
Using System.currentTimeMillis() for high precision timing
Mixing data types causing compile errors
3. Given the following JUnit test snippet, what will be printed?
long start = System.nanoTime();
Thread.sleep(100);
long end = System.nanoTime();
System.out.println((end - start) / 1_000_000 + " ms");
medium
A. Approximately 100 ms
B. Exactly 100 ms
C. Approximately 0 ms
D. Compilation error due to Thread.sleep
Solution
Step 1: Understand Thread.sleep effect
Thread.sleep(100) pauses the thread for about 100 milliseconds.
Step 2: Calculate elapsed time in milliseconds
Elapsed time = (end - start) in nanoseconds, divided by 1,000,000 converts to milliseconds, close to 100 ms.
Final Answer:
Approximately 100 ms -> Option A
Quick Check:
Sleep 100ms prints ~100 ms [OK]
Hint: Sleep pauses ~100ms, nanoTime difference shows ~100 ms [OK]
Common Mistakes:
Expecting exact 100 ms (sleep is approximate)
Confusing nanoseconds with milliseconds
Thinking Thread.sleep causes compile error
4. Identify the error in this JUnit test measuring execution time:
@Test
void testMethod() {
long start = System.nanoTime();
// test code
long end = System.nanoTime();
System.out.println(end - start);
}
medium
A. Missing exception handling for test code
B. Using System.nanoTime() is incorrect for timing
C. No error; code correctly measures time
D. Printing time inside test causes test failure
Solution
Step 1: Review timing code correctness
Using System.nanoTime() before and after test code correctly measures elapsed time.
Step 2: Check for syntax or runtime errors
No syntax errors or exceptions are present; printing time is allowed and does not fail test.
Final Answer:
No error; code correctly measures time -> Option C
Quick Check:
System.nanoTime() timing code is valid [OK]
Hint: Timing code with nanoTime and print is valid [OK]
Common Mistakes:
Assuming print causes test failure
Thinking exception handling is mandatory here
Confusing nanoTime with incorrect timing method
5. You want to fail a JUnit test if it runs longer than 500 milliseconds. Which approach correctly implements this using execution time measurement?
hard
A. Use System.currentTimeMillis() and assert elapsed time <= 500 nanoseconds without conversion
B. Record start and end time with System.nanoTime(), then assert elapsed time <= 500_000_000 nanoseconds
C. Print execution time and manually check after test runs
D. Use Thread.sleep(500) inside the test to limit execution time
Solution
Step 1: Understand time units and assertion
System.nanoTime() returns nanoseconds; 500 ms = 500,000,000 ns.
Step 2: Implement assertion on elapsed time
Calculate elapsed = end - start; assert elapsed <= 500_000_000 to fail if too slow.
Final Answer:
Record start and end time with System.nanoTime(), then assert elapsed time <= 500_000_000 nanoseconds -> Option B
Quick Check:
Assert elapsed ≤ 500ms in nanoseconds [OK]
Hint: Convert 500ms to nanoseconds and assert elapsed ≤ that [OK]
Common Mistakes:
Using Thread.sleep to limit test time
Not converting time units correctly
Only printing time without assertion
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.