Load test any system
with a distributed cluster

Create distributed load test scenarios entirely using plain C# or F#. It is designed to test any system regardless of the protocol or a semantic model (Pull/Push)

Loved by 10,000+ developers and trusted by 99+ businesses

Next Insurity Trainline Covetrus Genius Aveva Next Insurity Trainline Covetrus Genius Aveva
Covetrus Genius Aveva Next Insurity Trainline Covetrus Genius Aveva Next Insurity Trainline

Protocol
agnostic

A fundamental feature of NBomber is that you can test any system from database to web server or message broker. Define and run your tests without any dependency on a protocol (HTTP/WebSockets/AMQP etc) or a semantic model (Pull/Push). You can test any system: HTTP WebSockets gRPC GraphQL AMQP, RabbitMQ, MQTT, Kafka, SQL, MongoDB, Redis, Cassandra.

var httpClient = new HttpClient();

var scenario = Scenario.Create("http_scenario", async context =>
{
    var request =
        Http.CreateRequest("GET", "https://nbomber.com")
            .WithHeader("Accept", "text/html")
            .WithBody(new StringContent("{ some JSON }"));
            
    var response = await Http.Send(httpClient, request);
    return response;
})
.WithLoadSimulations(
    Simulation.Inject(rate: 100,
                      interval: TimeSpan.FromSeconds(1),
                      during: TimeSpan.FromMinutes(3))
);

NBomberRunner
    .RegisterScenarios(scenario)
    .Run();
var scenario = Scenario.Create("mqtt_scenario", async ctx =>
{
    using var client = new MqttClient(new MqttFactory().CreateMqttClient());
    var topic = "/clients/" + ctx.ScenarioInfo.InstanceId;
    
    var connect = await Step.Run("connect", ctx, async () =>
    {
        var clientOptions = new MqttClientOptionsBuilder()
            .WithTcpServer("localhost")
            .WithClientId(ctx.ScenarioInfo.InstanceId)
            .Build();
    
        var response = await client.Connect(clientOptions);
        return response;
    });

    var subscribe = await Step.Run("subscribe", ctx, () => client.Subscribe(topic));

    var publish = await Step.Run("publish", ctx, async () =>
    {
        var msg = new MqttApplicationMessageBuilder()
            .WithTopic(topic)
            .WithPayload(payload)
            .Build();
        
        var response = await client.Publish(msg);
        return response;
    });

    var receive = await Step.Run("receive", ctx, async () =>
    {
        var response = await client.Receive();
        return response;
    });

    var disconnect = await Step.Run("disconnect", ctx, () => client.Disconnect());
    return Response.Ok();
});

var scenario = Scenario.Create("ping_pong_websockets", async ctx =>
{
    using var websocket = new WebSocket(new WebSocketConfig());

    var connect = await Step.Run("connect", ctx, async () =>
    {
        await websocket.Connect("ws://localhost:5233/ws");
        return Response.Ok();
    });

    var ping = await Step.Run("ping", ctx, async () =>
    {
        await websocket.Send(payload);
        return Response.Ok(sizeBytes: payload.Length);
    });
    
    var pong = await Step.Run("pong", ctx, async () =>
    {
        using var response = await websocket.Receive();
        return Response.Ok(sizeBytes: response.Data.Length);
    });
    
    var disconnect = await Step.Run("disconnect", ctx, async () =>
    {
        await websocket.Close();
        return Response.Ok();
    });
    return Response.Ok();
});
var redis = ConnectionMultiplexer.Connect("redis0:6380");
var db = redis.GetDatabase();
var random = new Random();

var scenario = Scenario.Create("redis_scenario", async context =>
{
    var userId = random.Next(1_000);
    byte[] data = await db.StringGetAsync($"user-{userId}");
    return Response.Ok(statusCode: "ok", sizeBytes: data.Length);
})
.WithLoadSimulations(
    Simulation.Inject(rate: 100,
                      interval: TimeSpan.FromSeconds(1),
                      during: TimeSpan.FromMinutes(3))
);
NBomberRunner
      .RegisterScenarios(scenario)
      .Run();

Why choose NBomber

Build, run, analyze, and scale performance tests with a developer-first framework designed for local environments, Kubernetes, distributed systems, and AI-assisted workflows.

Deploy, Debug & Run

Deploy, Debug & Run

NBomber is .NET cross-platform framework which works seamlessly on all operating systems. You can develop and natively debug your load tests using your favorite IDE. It can be used with containers technologies such as Docker, Kubernetes and Swarm. NBomber is shipped as .NET library and can be installed via NuGet package manager.

AI Agent-Friendly

AI Agent-Friendly

NBomber is a code-first load testing framework built for developers, QA engineers, and AI agents. No buttons, no drag-and-drop — just flexible, type-safe C#/F# code that AI can generate, understand, refactor, and automate. Generate your load tests from a prompt.

Load Testing in Kubernetes

Load Testing in Kubernetes

Easily manage, deploy, and scale load tests in Kubernetes — schedule and run your load tests directly from NBomber Studio.

Informative HTML reports

Informative HTML reports

NBomber provides informative HTML report as an artifact for every load test run. They provide detailed insights into various performance metrics, helping you identify bottlenecks, optimize performance. More about reports.

Real-time reporting

Real-time reporting and historical data analysis

Monitor tests in real time with NBomber Studio and conduct detailed result analysis to identify trends. In addition to its native solution, NBomber offers integration with popular systems for real-time monitoring: InfluxDB, TimescaleDB, Grafana.

Distributed cluster

Distributed cluster

Simulate millions of concurrent users by running your tests in distributed mode with NBomber Cluster.

Continuous integration

Continuous integration

Easy integration with your CI/CD pipeline to run your tests automatically, specify thresholds and catch any performance degradation. You can run NBomber as Console application or as Unit test project (xUnit/NUnit).

Pluggable integrations

Pluggable integrations

Take advantage of the pluggable architecture and use protocol integrations: HTTP, WebSockets, MQTT, WebBrowser.

Keep costs low with BYOC

Keep costs low with BYOC

NBomber and NBomber Studio provide a cost-effective load testing platform. Run scalable tests on your own infrastructure with no limits, vendor lock-in, or usage-based fees.

FAQ

Can I use NBomber for free?

You can use it for free, only for personal use. For the organization usage, you should have a license.

Is your license priced for the entire company, or is it based on a per-developer seat model?

Our pricing is per company, not per developer seat

Can multiple teams use the same license within one organization?

Yes, a single license can be shared for the whole organization

How many users can use the license in parallel?

Unlimited

How many executions can be run in parallel?

Unlimited

How many instances can be installed with one NBomber license?

Unlimited

How NBomber can be installed?

NBomber is shipped as .NET library and can be installed via NuGet package manager

How can I run NBomber load test scenario?

You can run it as Console application or as Unit test (xUnit/NUnit)

Can I try NBomber Cluster without purchasing a license?

Yes, you can try Local Dev Cluster mode. Additionally, you can install NBomber Studio, which integrates with Kubernetes and allows you to run the cluster for directly from Studio.

Do you support money refund?

Yes, we offer a 30-day money-back guarantee.

Do you support subscription cancellation?

Yes, we support subscription cancellation.