Test rychlosti HTTP pro REST SMS služby

Potřebujete změřit výkon vaší SMS služby založené na HTTP? Test rychlosti HTTP pro REST SMS služby je výkonný nástroj určený k vyhodnocení rychlosti a spolehlivosti vašich JSON/REST API endpointů. Tato stahovatelná utilita vám umožňuje simulovat SMS požadavky ve vysokém objemu, sledovat úspěšnost a počítat požadavky za sekundu – pomůže vám optimalizovat výkon serveru pod zátěží. Ať už testujete výkon lokálního vývojového prostředí nebo benchmarkujete produkční SMS bránu, tento nástroj poskytuje jasné metriky pro celkový počet požadavků, souběžná připojení a efektivitu HTTP Keep-Alive. Stáhněte si připravené řešení v C# nebo integrujte poskytnutý zdrojový kód do vašeho testovacího workflow pro přesnou analýzu výkonu API.

Stáhnout

HttpSpeedTest.zip

Příklad použití

Obrázek 1 - Jak používat nástroj pro test rychlosti

Zdrojový kód
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

class Program
{
    static readonly Random random = new Random();
    static readonly string[] sampleMessages = {
        "Ahoj, toto je testovací zpráva.",
        "Testování výkonu HTTP serveru.",
        "Měření počtu požadavků za sekundu pro JSON API.",
        "Náhodný obsah zprávy pro testování zátěže.",
        "Další testovací zpráva s odlišným obsahem.",
        "Kontrola kapacity serveru pod zátěží.",
        "Kolik požadavků server zvládne?",
        "Zátěžové testování SMS API endpointu.",
        "Tato zpráva je automaticky generována.",
        "Poslední testovací zpráva v sadě."
    };

    static async Task Main(string[] args)
    {
        Console.WriteLine("Testovač výkonu JSON API HTTP serveru");
        Console.WriteLine("---------------------------------------");

        if (args.Length < 3)
        {
            Console.WriteLine("Použití: Program    [useKeepAlive]");
            Console.WriteLine("Příklad: Program http://198.50.122.178:8080 1000 50 true");
            Console.WriteLine("Příklad: Program https://api.example.com/sms 5000 100 false");
            Console.WriteLine("Příklad: Program http://localhost/innotest/innotest.php 50 10 false");
        
            return;
        }

        string baseUrl = args[0];
        if (!Uri.TryCreate(baseUrl, UriKind.Absolute, out Uri uriResult) ||
            (uriResult.Scheme != Uri.UriSchemeHttp && uriResult.Scheme != Uri.UriSchemeHttps))
        {
            Console.WriteLine("Neplatná základní URL. Musí být platná HTTP nebo HTTPS URL.");
            return;
        }

        if (!int.TryParse(args[1], out int totalRequests) || totalRequests <= 0)
        {
            Console.WriteLine("Neplatná hodnota totalRequests. Musí být kladné celé číslo.");
            return;
        }

        if (!int.TryParse(args[2], out int concurrentRequests) || concurrentRequests <= 0)
        {
            Console.WriteLine("Neplatná hodnota concurrentRequests. Musí být kladné celé číslo.");
            return;
        }

        bool useKeepAlive = args.Length > 3 && bool.TryParse(args[3], out bool keepAlive) && keepAlive;

        Console.WriteLine($"Testovací parametry:");
        Console.WriteLine($"- Základní URL: {baseUrl}");
        Console.WriteLine($"- Celkový počet požadavků: {totalRequests}");
        Console.WriteLine($"- Souběžné požadavky: {concurrentRequests}");
        Console.WriteLine($"- HTTP Keep-Alive: {(useKeepAlive ? "Povoleno" : "Zakázáno")}");
        Console.WriteLine();

        var httpClientHandler = new HttpClientHandler
        {
            UseProxy = false,
            MaxConnectionsPerServer = concurrentRequests
        };

        var httpClient = new HttpClient(httpClientHandler)
        {
            Timeout = TimeSpan.FromSeconds(30),
            BaseAddress = new Uri(baseUrl)
        };

        if (useKeepAlive)
        {
            httpClient.DefaultRequestHeaders.ConnectionClose = false;
            httpClient.DefaultRequestHeaders.Connection.Add("keep-alive");
        }
        else
        {
            httpClient.DefaultRequestHeaders.ConnectionClose = true;
        }

        httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(
         "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "+
         "(KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36");
        httpClient.DefaultRequestHeaders.Accept.ParseAdd("application/json");

        var stopwatch = Stopwatch.StartNew();
        var tasks = new List(concurrentRequests);
        var completedRequests = 0;
        var successfulRequests = 0;
        var failedRequests = 0;

        Console.WriteLine("Spouštím test...");

        var semaphore = new System.Threading.SemaphoreSlim(concurrentRequests, concurrentRequests);
        var jsonOptions = new JsonSerializerOptions
        {
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
            WriteIndented = false
        };

        for (int i = 0; i < totalRequests; i++)
        {
            await semaphore.WaitAsync();

            tasks.Add(Task.Run(async () =>
            {
                try
                {
                    var requestData = new
                    {
                        sender = "+0000000",
                        gsm = GenerateRandomPhoneNumber(),
                        text = GetRandomMessage(),
                        usrClient = "Pruebas",
                        pasClient = "Pruebas"
                    };

                    var json = JsonSerializer.Serialize(requestData, jsonOptions);
                    var content = new StringContent(json, Encoding.UTF8, "application/json");

                    var response = await httpClient.PostAsync(baseUrl, content);

                    System.Threading.Interlocked.Increment(ref completedRequests);

                    if (response.IsSuccessStatusCode)
                    {
                        System.Threading.Interlocked.Increment(ref successfulRequests);
                    }
                    else
                    {
                        System.Threading.Interlocked.Increment(ref failedRequests);
                        Console.WriteLine($"Požadavek selhal se stavem: {response.StatusCode}");
                    }
                }
                catch (Exception ex)
                {
                    System.Threading.Interlocked.Increment(ref completedRequests);
                    System.Threading.Interlocked.Increment(ref failedRequests);
                    Console.WriteLine($"Požadavek selhal: {ex.Message}");
                }
                finally
                {
                    semaphore.Release();
                }
            }));
        }

        await Task.WhenAll(tasks);
        stopwatch.Stop();

        Console.WriteLine("\nTest dokončen!");
        Console.WriteLine($"Celkový čas: {stopwatch.Elapsed.TotalSeconds:F2} sekund");
        Console.WriteLine($"Dokončené požadavky: {completedRequests}");
        Console.WriteLine($"Úspěšné požadavky: {successfulRequests}");
        Console.WriteLine($"Neúspěšné požadavky: {failedRequests}");
        Console.WriteLine($"Požadavků za sekundu: {totalRequests / stopwatch.Elapsed.TotalSeconds:F2}");
    }

    static string GenerateRandomPhoneNumber()
    {
        return $"+{random.Next(100, 999)}{random.Next(1000000, 9999999)}";
    }

    static string GetRandomMessage()
    {
        return sampleMessages[random.Next(sampleMessages.Length)];
    }
}

Vysvětlení kódu

1. Přehled

Tato konzolová aplikace v C# testuje zatížení HTTP(S) SMS API endpointu odesíláním souběžných JSON požadavků a měří výkonnostní metriky jako:

  • Požadavky za sekundu (RPS)
  • Úspěšnost/neúspěšnost
  • Celkový čas provedení

2. Klíčové komponenty

A. Nastavení a konfigurace

Generování náhodných dat:

  • sampleMessages: Předdefinovaná sada vzorových SMS zpráv pro realistické testování.
  • GenerateRandomPhoneNumber(): Vytváří falešná telefonní čísla (např. +1234567890).
  • GetRandomMessage(): Vybere náhodnou zprávu z sampleMessages.

Argumenty příkazového řádku:

Program <baseUrl> <totalRequests> <concurrentRequests> [useKeepAlive]
  • Ověřuje vstupy (formát URL, kladná čísla pro počty požadavků).
  • Konfiguruje nastavení HTTP klienta (časový limit, keep-alive, user-agent).

B. Konfigurace HTTP klienta

HttpClient přizpůsobení:

  • MaxConnectionsPerServer: Omezuje paralelní připojení k serveru.
  • ConnectionClose/keep-alive: Přepíná trvalá HTTP připojení.
  • Časový limit: 30 sekund na požadavek.
  • Hlavičky: Nastaví User-Agent a Accept: application/json.

C. Provedení testu zatížení

Řízení souběžnosti:

  • Používá SemaphoreSlim k omezení souběžných požadavků (např. 50 najednou).
  • Async/await (Task.Run) pro neblokující I/O operace.

Workflow požadavku:

  1. Serializuje JSON payload s náhodnými telefonními čísly/zprávami:
    {
        "sender": "+0000000",
        "gsm": "+1234567890",
        "text": "Hello, this is a test message.",
        "usrClient": "Pruebas",
        "pasClient": "Pruebas"
    }
  2. Odešle POST požadavek na zadaný endpoint.
  3. Sleduje úspěchy/neúspěchy pomocí Interlocked pro vláknově bezpečné čítače.

D. Metriky a reportování

  • Stopky: Měří celkovou dobu trvání testu.
  • Výstupní metriky:
    • Celkový uplynulý čas.
    • Dokončené/úspěšné/neúspěšné požadavky.
    • Požadavky za sekundu (RPS): totalRequests / elapsedTime.

3. Technické zajímavosti

  • Vláknová bezpečnost:
    • Interlocked.Increment zajišťuje atomické aktualizace čítačů napříč vlákny.
    • SemaphoreSlim zabraňuje přetížení serveru nebo klienta.
  • Zpracování chyb:
    • Zachytává výjimky (např. časové limity, síťové chyby) a zaznamenává neúspěchy.
    • Ověřuje HTTP stavové kódy (IsSuccessStatusCode).
  • Optimalizace výkonu:
    • Znovu používá HttpClient (osvědčený postup pro vyhnutí se vyčerpání TCP portů).
    • Konfigurovatelný keep-alive pro simulaci reálných scénářů.

4. Příklad použití

Pro testování SMS API na http://localhost:8080/sms s 1 000 celkovými požadavky (50 souběžných, keep-alive povoleno):

Program http://localhost:8080/sms 1000 50 true

Výstup:

Test dokončen!
Celkový čas: 12.34 sekund
Dokončené požadavky: 1000
Úspěšné požadavky: 980
Neúspěšné požadavky: 20
Požadavky za sekundu: 81.04

5. Proč je to důležité

  • Benchmarking: Identifikuje úzká místa API (např. limity serveru, síťovou latenci).
  • Regresní testování: Zajišťuje, že výkon se po aktualizacích nezhorší.
  • Plánování kapacity: Určuje maximální zátěž, kterou služba zvládne.

6. Možná vylepšení

  • Přidat logiku opakování pro přechodné chyby.
  • Podpora autentizace (OAuth/API klíče).
  • Export výsledků do CSV/JSON pro analýzu.

Tento nástroj je ideální pro vývojáře a DevOps týmy, kteří ověřují výkon SMS brány před nasazením.

Závěr

HTTP Speed Test pro REST SMS služby poskytuje robustní, snadno použitelné řešení pro benchmarkování výkonu a spolehlivosti SMS API endpointů. Simulací reálného provozu s konfigurovatelnou souběžností, generováním náhodných zpráv a podrobnými výkonnostními metrikami tento nástroj pomáhá vývojářům a QA týmům identifikovat úzká místa, ověřit škálovatelnost a optimalizovat odezvu API. Ať už testujete zatížení nového nasazení nebo auditujete existující SMS bránu, dodaný zdrojový kód v C# nabízí flexibilitu pro přizpůsobení, zatímco předpřipravený spustitelný soubor poskytuje rychlé, akční poznatky. Stáhněte si nástroj ještě dnes a zajistěte, že vaše SMS služba splňuje očekávání výkonu pod zátěží—a doručuje bezproblémový zážitek koncovým uživatelům.

More information