3

I have a K6 test where load testing a flow and I'm grouping each page request. What I want to do is perform a check on each group's duration so something like


  group('Home page', function(){
         http.get('localhost:8080')
   });
   //something like this 
   check(group.duration, function()=>{'performs check logic'})

   group('search page', function(){
    http.get('localhost:8080/Search?term=mysearch')
   })
   check(group.duration, function()=>{'performs check logic'})

The documentation states that group emits group_duration but doesn't state how to listen for it. Not strong in JS so my apologies if this is something simple.

S.Will
  • 380
  • 4
  • 13

1 Answers1

2

Groups currently do not return their duration.

Emit in that contexts means that if you are using json output/influxdb/stastsd/load impact's cloud for metrics storage than a metric that is that group duratioon will be send and you can later ... do whatever you want from inside the metric storage.

Also the syntax for check is check(variable_name_to_use, map_of_name_to_function_to_calls) so something like

check(group.duraiton, {
  "checking duration is less than 20 as normal function": function(d){ return d<20}, 
  "checking duration is less than 20 as arrow function": (d)=>{ return d<20}, 
  "checking duration is less than 20 as arrow function without the brackets": (d)=>d<20, 
})

You would also need to provide the scheme for the url when using http.*.

I would also like to point out that the idea of group is to measure how much a given group(!) of requests or operations takes. They can for example be used to group all the operations that comprise your "login", "adding an item to a cart", "checkout and payment" and so on. They are definitely useful but grouping single requests when all your groups are single request is not adding any new data :)

Solution 1: you can do it yourself like this:

import { check, group } from "k6";
import http from 'k6/http';

export default function() {
        var group_duration;
    group('Home page', function(){
                var start = new Date();
        http.get('http://localhost:8080');
                group_duration = new Date() - start;
    });
    check(group_duration,  {
                "Name of group check": function(d){return d<200}
        })

    group('search page', function(){
                var start = new Date();
        http.get('http://localhost:8080/Search?term=mysearch');
                group_duration = new Date() - start;
    })
        console.log(group_duration);
    check(group_duration,  {
                "Name of group check": (d)=>d<200
        })
}

You can of course move this to a function and just return the duration as:

function mygroup(name, f) {
        var start = new Date();
        group(name, f);
        return new Date() - start;
}

And than call mygroup and get the duration as

var group_duration = mygroup('Home page', function(){
    http.get('http://localhost:8080');
});

Solution 2: In your case where you are using only a single request in each group you can use the fact that request do actually return how much they took. So

resp = http.get("google.com");
check (resp.timings.duration, {
    "check response time", (d) => d<200
});

Will check that a given request took less than 200 millisecond. You can see more things that are in the response in the docs

As a k6 developer I think that what you are proposing is not a bad idea and I would like if you actually open an issue