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.

Creating JMeter Test Plans with Fiddler
Performance Reliability
Creating a Performant System
Monitoring Cache Performance
The Appetite to Eat Efficiency
Twitter
LinkedIn
RSS