Welcome to Magazine Premium

You can change this text in the options panel in the admin

There are tons of ways to configure Magazine Premium... The possibilities are endless!

Member Login
Lost your password?

Automatic transaction and timing name prefixes

In this post I will explain how to set up automatic transaction prefixes depending on various situations.
First let’s describe a situation where this would be needed. Imagine that you have several groups of users that use the same sub-sequence of scripts, e.g. Login scripts. Even though transactions are the same you may want to see the difference between Group #1 and Group #2 and if the transaction names are the same, this is not possible.
First thing we need to do is overload all transaction related methods. I will be only showing code for startTransaction method, as all other methods are very similar. We need to do this overloading in these files:
VirtualUserScript.h

public:
    void startTransaction(const string& transactionName);

VirtualUser.h

public:
    void startTransaction(const string& transactionName);

public:
    // Dictionary for format tags and their values
    SimpleDataDictionary formatTags;

I will be creating a pattern based prefixing that I will be able to set in any of data sources available to user. This way I can provide control over names of transactions without interfering with code.
I will be using these format tags:

  • %VUGroupName% – The Virtual User group name;
  • %VUScriptName% – Current running script name;
  • %VUIndex% – Virtual User index;
  • %Iteration% – Current iteration;
  • %TransactionName% – Passed transaction name;

As some of these variables don’t change at all, and some are available only in VirtualUserScript and not VirtualUser, we will have to set these variables accordingly.
VirtualUserScript.cpp

void VirtualUserScript::startTransaction(const string& transactionName) {
    getVU().formatTags.setString("VUScriptName", getScriptName());
    getVU().formatTags.setString("Iteration", str(getCurrentIteration()));

    getVU().startTransaction(transactionName);
}

VirtualUser.cpp

void VirtualUser::pre() {
    // As Group Name and Index doesn’t change while running a test,
    // we need to only set this once, so we are doing this in VirtualUser::pre() method.
    formatTags.setString("VUGroupName", getVUName());
    formatTags.setString("VUIndex", str(getIndex()));
}

void VirtualUser::startTransaction(const string& transactionName) {
    // Setting last formatTag - this transaction's name
    formatTags.setString("TransactionName", transactionName);
    // By default only Transaction Name is used.
    string transactionFormat = getString("transactionFormat", "%TransactionName%");
    // We are using SimpleDataDictionary's makeSubstitutionsInto method to replace places
    // in transactionFormat (set in any of data sources) that match the pattern of %key%
    // with values that correspond to this key.
    formatTags.makeSubstitutionsInto(transactionFormat);

    // Now we need to call parent of this class to execute actual transaction method
    WebBrowserUser::startTransaction(transactionFormat);
}

You can repeat this for all transaction / timing methods you are using, the idea is the same just change code in few places.

Share

Tags: , ,




Leave a Reply

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

*