mirror of
https://github.com/azaion/detections.git
synced 2026-04-22 11:56:31 +00:00
86b8f076b7
- Modified the health endpoint to return "None" for AI availability when inference is not initialized, improving clarity on system status. - Enhanced the test documentation to include handling of skipped tests, emphasizing the need for investigation before proceeding. - Updated test assertions to ensure proper execution order and prevent premature engine initialization. - Refactored test cases to streamline performance testing and improve readability, removing unnecessary complexity. These changes aim to enhance the robustness of the health check and improve the overall testing framework.
80 lines
2.1 KiB
Python
80 lines
2.1 KiB
Python
import json
|
|
import time
|
|
|
|
import pytest
|
|
|
|
|
|
def _percentile_ms(sorted_ms, p):
|
|
n = len(sorted_ms)
|
|
if n == 0:
|
|
return 0.0
|
|
if n == 1:
|
|
return float(sorted_ms[0])
|
|
k = (n - 1) * (p / 100.0)
|
|
lo = int(k)
|
|
hi = min(lo + 1, n - 1)
|
|
w = k - lo
|
|
return sorted_ms[lo] * (1 - w) + sorted_ms[hi] * w
|
|
|
|
|
|
@pytest.mark.slow
|
|
@pytest.mark.timeout(300)
|
|
def test_nft_perf_01_single_image_latency_p95(
|
|
warm_engine, http_client, image_small
|
|
):
|
|
times_ms = []
|
|
for _ in range(10):
|
|
t0 = time.perf_counter()
|
|
r = http_client.post(
|
|
"/detect",
|
|
files={"file": ("img.jpg", image_small, "image/jpeg")},
|
|
timeout=120,
|
|
)
|
|
elapsed_ms = (time.perf_counter() - t0) * 1000.0
|
|
assert r.status_code == 200
|
|
times_ms.append(elapsed_ms)
|
|
sorted_ms = sorted(times_ms)
|
|
p50 = _percentile_ms(sorted_ms, 50)
|
|
p95 = _percentile_ms(sorted_ms, 95)
|
|
p99 = _percentile_ms(sorted_ms, 99)
|
|
print(
|
|
"nft_perf_01_csv,run_ms,"
|
|
+ ",".join(f"{x:.2f}" for x in sorted_ms)
|
|
+ f",p50,{p50:.2f},p95,{p95:.2f},p99,{p99:.2f}"
|
|
)
|
|
assert p95 < 5000.0
|
|
|
|
|
|
@pytest.mark.slow
|
|
@pytest.mark.timeout(300)
|
|
def test_nft_perf_03_tiling_overhead_large_image(
|
|
warm_engine, http_client, image_small, image_large
|
|
):
|
|
t_small = time.perf_counter()
|
|
r_small = http_client.post(
|
|
"/detect",
|
|
files={"file": ("small.jpg", image_small, "image/jpeg")},
|
|
timeout=120,
|
|
)
|
|
small_ms = (time.perf_counter() - t_small) * 1000.0
|
|
assert r_small.status_code == 200
|
|
config = json.dumps(
|
|
{"altitude": 400, "focal_length": 24, "sensor_width": 23.5}
|
|
)
|
|
t_large = time.perf_counter()
|
|
r_large = http_client.post(
|
|
"/detect",
|
|
files={"file": ("large.jpg", image_large, "image/jpeg")},
|
|
data={"config": config},
|
|
timeout=120,
|
|
)
|
|
large_ms = (time.perf_counter() - t_large) * 1000.0
|
|
assert r_large.status_code == 200
|
|
assert large_ms < 120_000.0
|
|
print(
|
|
f"nft_perf_03_csv,baseline_small_ms,{small_ms:.2f},large_ms,{large_ms:.2f}"
|
|
)
|
|
assert large_ms > small_ms - 500.0
|
|
|
|
|