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"