Как в браузере можно программно измерить скорость интернет-соединения?

«Как в браузере можно программно измерить скорость интернет-соединения?» — вопрос из категории Веб-тестирование, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Скорость соединения можно приблизительно измерить, засекая время загрузки файла известного размера с сервера. Однако этот метод имеет погрешности и ограничения браузера.

Базовый алгоритм на JavaScript:

async function measureNetworkSpeed(fileUrl, fileSizeInBytes) {
    const startTime = performance.now();

    try {
        const response = await fetch(fileUrl, { cache: 'no-store' }); // Отключаем кеш
        const reader = response.body.getReader();

        let receivedLength = 0;
        while (true) {
            const { done, value } = await reader.read();
            if (done) break;
            receivedLength += value.length;
        }

        const endTime = performance.now();
        const durationInSeconds = (endTime - startTime) / 1000;

        // Расчет скорости в Mbps (мегабитах в секунду)
        const speedMbps = (fileSizeInBytes * 8) / (durationInSeconds * 1_000_000);
        return { speedMbps, durationInSeconds };
    } catch (error) {
        console.error('Measurement failed:', error);
        return null;
    }
}

// Использование: файл 5 МБ
measureNetworkSpeed('https://example.com/test.bin', 5 * 1024 * 1024);

Важные ограничения и лучшие практики:

  1. Точность размера: Сервер должен отдавать Content-Length заголовок, или размер должен быть заранее известен.
  2. Кеширование: Обязательно используйте cache: 'no-store' или добавляйте уникальный параметр к URL.
  3. Погрешности: На результат влияет задержка (ping), TCP slow start, и ограничение скорости самим браузером.
  4. Надежность: Для production-измерений лучше использовать специализированные сервисы (Speedtest by Ookla, librespeed) или нативные API (например, NetworkInformation API, который предоставляет теоретическую скорость, но не фактическую).