Miss any of our Open RFC calls?Watch the recordings here! »


0.0.3 • Public • Published


Just a super easy load-testing framework.

  • no complex GUI to get lost in
  • load tests == code, and yes you should check them in :)
  • easy to plug-in to your CI server
  • get started in seconds


Getting started

Freeloader uses 4 basic keywords:

  • request to create an HTTP request using unirest
  • emit to push the request down the pipeline
  • send to make the actual HTTP call
  • join to join 2 streams together

The simplest test looks like:

// See unirest documentation for all the options (headers, file uploads...)
var r = request.get('http://localhost:3000/people')
               .header('Accept', 'application/json');

That's it! This test sends a single HTTP request, and finishes as soon as the response is received.

Building a pipeline

It becomes a lot more interesting when we start building a pipeline. Each step in the pipeline has access to all requests & responses. They can modify payloads, generate more requests, or collect data for reporting.

freeloader-bundle contains a lot of useful modules to get started. Each module is an instance of a Node.js stream, and you can also easily create your own.


Which outputs something like:

Waiting for pending requests to finish...
Response count = 112
Response times
  Min             =  16ms
  Max             = 182ms
  Mean            =  66ms
  Median          =  58ms
  75th percentile =  82ms
  95th percentile = 150ms

The test suite will end:

  • when every request has been sent
  • or when you press Ctrl-C
  • or when a module adds its own stopping condition

Test pipelines can easily be included in a CI test suite:

it('generates load test reports', function(done) {

Joining streams

Streams can also be joined for more complex scenarios. Here are a few examples:

  • Emit 2 different requests with a total concurrency of 50
join(emit(r1), emit(r2))
  • Emit 2 different requests with a concurrency of 50 each
var s1 = emit(r1).pipe(concurrent(50));
var s2 = emit(r2).pipe(concurrent(50));
join(s1, s2)

It's up to each reporter to either give global stats, or group the report by request URL.


npm i freeloader

DownloadsWeekly Downloads






Last publish


  • avatar
  • avatar