Modern QA2026Testing Inference Latency — tiles
Log inJoin
55 / 66 · 09 Mobile & Cross-Platform Testing · On-Device ML Model Testing← prev⊞ allnext →☰ Read as one page

10.3Testing Inference Latency

# tests/ml/test_ondevice_model.py
import time
from appium.webdriver.common.appiumby import AppiumBy

def test_image_classification_latency(driver):
    """On-device ML inference must complete within 200ms."""
    driver.find_element(AppiumBy.ACCESSIBILITY_ID, "ml-classify-btn").click()

    # Inject test image
    driver.push_file("/sdcard/test_images/cat.jpg", source_path="test_data/cat.jpg")

    start = time.time()
    driver.find_element(AppiumBy.ACCESSIBILITY_ID, "classify-image").click()

    # Wait for result
    result = driver.find_element(AppiumBy.ACCESSIBILITY_ID, "classification-result")
    elapsed = time.time() - start

    assert elapsed < 0.2, f"Inference took {elapsed:.3f}s, exceeding 200ms threshold"
    assert "cat" in result.text.lower()

def test_inference_latency_p95(driver):
    """Measure p95 inference latency across multiple runs."""
    latencies = []

    for i in range(20):
        driver.push_file(
            f"/sdcard/test_images/test_{i}.jpg",
            source_path=f"test_data/validation/image_{i}.jpg"
        )

        start = time.time()
        driver.find_element(AppiumBy.ACCESSIBILITY_ID, "classify-image").click()
        driver.find_element(AppiumBy.ACCESSIBILITY_ID, "classification-result")
        elapsed = (time.time() - start) * 1000  # Convert to ms
        latencies.append(elapsed)

        # Reset for next image
        driver.find_element(AppiumBy.ACCESSIBILITY_ID, "clear-result").click()

    latencies.sort()
    p95 = latencies[int(len(latencies) * 0.95)]

    assert p95 < 200, f"p95 inference latency is {p95:.0f}ms, exceeding 200ms threshold"