mirror of
https://github.com/Horizontal42/netsleuth.git
synced 2026-11-11 01:02:10 +03:00
test: добавить бенчмарки для критических по производительности функций
This commit is contained in:
parent
39cb91e34d
commit
d623c03e37
1 changed files with 115 additions and 0 deletions
115
tests/benchmarks/test_benchmarks.py
Normal file
115
tests/benchmarks/test_benchmarks.py
Normal file
|
|
@ -0,0 +1,115 @@
|
||||||
|
"""Бенчмарки для критических по производительности функций netsleuth."""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from ipaddress import IPv4Network, IPv6Network
|
||||||
|
|
||||||
|
|
||||||
|
class TestReputationBenchmarks:
|
||||||
|
"""Бенчмарки для модуля reputation.py."""
|
||||||
|
|
||||||
|
def test_netset_index_lookup_performance(self, benchmark):
|
||||||
|
"""Тест производительности поиска в NetsetIndex.
|
||||||
|
|
||||||
|
Цель: < 1ms на поиск при 10K префиксов в памяти.
|
||||||
|
"""
|
||||||
|
from netsleuth.reputation import NetsetIndex
|
||||||
|
|
||||||
|
# Создаем индекс с 10K префиксов
|
||||||
|
prefixes = [
|
||||||
|
IPv4Network(f"10.{i//256}.{i%256}.0/24")
|
||||||
|
for i in range(10000)
|
||||||
|
]
|
||||||
|
|
||||||
|
index = NetsetIndex(prefixes, "test_netset")
|
||||||
|
|
||||||
|
# Тестируем производительность поиска
|
||||||
|
def lookup():
|
||||||
|
return index.hits(IPv4Network("10.50.100.0/24"))
|
||||||
|
|
||||||
|
result = benchmark(lookup)
|
||||||
|
assert isinstance(result, bool)
|
||||||
|
|
||||||
|
def test_netset_index_large_dataset(self, benchmark):
|
||||||
|
"""Тест производительности на большом датасете (100K префиксов)."""
|
||||||
|
from netsleuth.reputation import NetsetIndex
|
||||||
|
|
||||||
|
prefixes = [
|
||||||
|
IPv4Network(f"{i//65536}.{(i//256)%256}.{i%256}.0/24")
|
||||||
|
for i in range(100000)
|
||||||
|
]
|
||||||
|
|
||||||
|
index = NetsetIndex(prefixes, "large_test")
|
||||||
|
|
||||||
|
def lookup():
|
||||||
|
return index.hits(IPv4Network("50.100.150.0/24"))
|
||||||
|
|
||||||
|
result = benchmark(lookup)
|
||||||
|
assert isinstance(result, bool)
|
||||||
|
|
||||||
|
|
||||||
|
class TestBGPBenchmarks:
|
||||||
|
"""Бенчмарки для BGP-модулей."""
|
||||||
|
|
||||||
|
def test_asn_lookup_performance(self, benchmark):
|
||||||
|
"""Тест производительности ASN lookup."""
|
||||||
|
from netsleuth.bgp import get_asn_info
|
||||||
|
|
||||||
|
async def lookup():
|
||||||
|
return await get_asn_info("8.8.8.8")
|
||||||
|
|
||||||
|
# Асинхронный бенчмарк
|
||||||
|
result = benchmark.pedantic(
|
||||||
|
lambda: lookup(),
|
||||||
|
iterations=10,
|
||||||
|
rounds=5
|
||||||
|
)
|
||||||
|
assert result is not None
|
||||||
|
|
||||||
|
|
||||||
|
class TestSpeedMathBenchmarks:
|
||||||
|
"""Бенчмарки для математических операций speedtest."""
|
||||||
|
|
||||||
|
def test_percentile_calculation(self, benchmark):
|
||||||
|
"""Тест производительности расчета перцентилей."""
|
||||||
|
from netsleuth.stats import percentile
|
||||||
|
|
||||||
|
data = list(range(10000))
|
||||||
|
|
||||||
|
def calc_p95():
|
||||||
|
return percentile(data, 95)
|
||||||
|
|
||||||
|
result = benchmark(calc_p95)
|
||||||
|
assert result == 9500
|
||||||
|
|
||||||
|
def test_bufferbloat_grading(self, benchmark):
|
||||||
|
"""Тест производительности grading bufferbloat."""
|
||||||
|
from netsleuth.interpret import grade_bufferbloat
|
||||||
|
from netsleuth.config import BufferbloatBands
|
||||||
|
|
||||||
|
bands = BufferbloatBands()
|
||||||
|
|
||||||
|
def grade():
|
||||||
|
return grade_bufferbloat(100, 50, bands)
|
||||||
|
|
||||||
|
result = benchmark(grade)
|
||||||
|
assert result in ["A", "B", "C", "D", "F"]
|
||||||
|
|
||||||
|
|
||||||
|
class TestTraceparseBenchmarks:
|
||||||
|
"""Бенчмарки для парсинга трассировок."""
|
||||||
|
|
||||||
|
def test_hop_parsing_performance(self, benchmark):
|
||||||
|
"""Тест производительности парсинга хопов."""
|
||||||
|
from netsleuth.traceparse import parse_mtr_output
|
||||||
|
|
||||||
|
# Симуляция вывода mtr с 50 хопами
|
||||||
|
sample_output = "\n".join([
|
||||||
|
f"| {i}| 192.168.{i//256}.{i%256}| 0.5| 0.2| 0.1| 0.0|"
|
||||||
|
for i in range(50)
|
||||||
|
])
|
||||||
|
|
||||||
|
def parse():
|
||||||
|
return parse_mtr_output(sample_output)
|
||||||
|
|
||||||
|
result = benchmark(parse)
|
||||||
|
assert len(result) == 50
|
||||||
Loading…
Add table
Reference in a new issue