Reading list Switch to dark mode

    Artillery- testing a chat(Socket.io) application

    Updated 22 September 2018

    Testing the quality of real-time Socket.io-client integration application focus mainly in how much traffic it can handle before falling over. No one capture interest about the quality of socket.io-client integration on the front-end, the reason would be, the UI plays its role in the last phase of application.
    The Socket.io engine in Artillery lets us to send data to server and optionally wait for and verify responses that come in response.

    loadTestChatApp.yaml

    config:
      target: http://your.chatApp.link
      phases:
      - duration: 300
        arrivalRate: 50
      processor: "./getRandomIds.js"
    scenarios:
    - engine: socketio
      flow:      
          - function: "setMessage"
          - emit:
              channel: send_message
              data: {sender: "{{ randomuidsender }}",receiver: "{{ randomuidreciver }}", text: "lets c {{ message }}"}

    Here the emit channel is named as ‘send_message’ because at the code(developer end), a function is called to emit a socket this name itself. When we need to get some dynamic values of some variables, we can add use some javascript function to do so. The send_message takes parameters with name ‘sender’ , ‘receiver’ and ‘text’. The value of  ‘randomuidsender’, ‘randomuidreciver’ and ‘message’ are taken from a javascript file named ‘getRandomIds,js’. The content of the js file can be written as:

    getRandomIds.js

    'use strict';
    module.exports = {
      setMessage: setMessage
    };
    
    var i= 0
    const RANDOMID = 
    [
      'a2iYSFeDJZzV',
      'LVcqlcn0aslH',
      '4lxmwIqOhOUf',
      'o5XZFPzdLYtU',
      'of9J1gpaeSie',
      's8Z5OsAatCL7',
      '1BDMyFZhMuXY',
      'uGbyRJbv4Slm',
      'HQhYrDaQGrSF',
      'h2Y6DA4fHorL',
      'jc3HPcYMctyt'
    ];
    
    function setRandomUid(context, events, done)
    {
    	return done();
    }
    
    function setMessage(context, events, done) {
      i= i+1;
      context.vars.message = i;
      var indexsender = Math.floor(Math.random() * RANDOMID.length);
      context.vars.randomuidsender = RANDOMID[indexsender];
    
      var indexreciver = Math.floor(Math.random() * RANDOMID.length);
    
      if(indexsender==indexreciver)
      {
      	if(indexreciver>0)
      		indexreciver=indexreciver-1;
      	else
      		indexreciver=indexreciver+1;
      }
      context.vars.randomuidreciver = RANDOMID[indexreciver];
      return done();
    }

    In the yaml file, we have  set a load of 50 users with a duration of 500 second . The yaml says that we are using ‘engine​’ as socket.io, the target url(without or without port number) is given under config option. presently we have only one flow to emit socket for specific duration, we can also add some multiple flow with different phases , lets have a look to the yaml.

    Start your headless eCommerce
    now.
    Find out More
    config:
      target: http://your-chatApp.com:8080
      phases:
      - duration: 300
        arrivalRate: 1
      variables:
        greeting: ["hello", "goedemorgen", "добрый день", "guten tag", "bonjour", "hola"]
      processor: "./function.js"
    scenarios:
    - engine: socketio
      flow:
        - function: "setMessage"
        - emit:
            channel: send_message
            data: {sender: 3Hzki7ya3cDz, reciever: 0srVrMCwlPrv, text: "this is a {{ message }}"}
        - think: 1
        - emit:
            channel: send_message
            data: {sender: 0srVrMCwlPrv, reciever: 3Hzki7ya3cDz, text: second msg}
        - think: 1
        - emit:
              channel: "new_message"
              data: "this is new message {{ message }}"
          - loop:
              - function: "setMessage"
              - emit:
                  channel: "new_message"
                  data: "this is new message {{ message }}"
              - think: 10
            count: 10
          - think: 60
    
    

    Suggestion are appreciated in the comments 😀

    . . .

    Leave a Comment

    Your email address will not be published. Required fields are marked*


    Be the first to comment.

    Back to Top

    Message Sent!

    If you have more details or questions, you can reply to the received confirmation email.

    Back to Home