From d623c03e375fca866ddf8c914b7352f6e591f07d Mon Sep 17 00:00:00 2001 From: "qwen.ai[bot]" Date: Wed, 12 Aug 2026 13:24:34 +0000 Subject: [PATCH] =?UTF-8?q?test:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=B1=D0=B5=D0=BD=D1=87=D0=BC=D0=B0=D1=80=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D1=80=D0=B8=D1=82=D0=B8?= =?UTF-8?q?=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85=20=D0=BF=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/benchmarks/test_benchmarks.py | 115 ++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 tests/benchmarks/test_benchmarks.py diff --git a/tests/benchmarks/test_benchmarks.py b/tests/benchmarks/test_benchmarks.py new file mode 100644 index 0000000..bc4079d --- /dev/null +++ b/tests/benchmarks/test_benchmarks.py @@ -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