Custom Web Performance Test Plugin

I was recently doing a workshop on Web Performance and Load Testing in Visual Studio when we stumbled upon a testing scenario that required an input of unique invoice identifiers. Essentially, the business logic would fail to create an invoice if the identifier matched one that already existed. This seems like a trivial problem, but when one could be running potentially thousands of invoice requests during load testing, a random integer seems like a solution that would cause a lot of collisions – in turn failing the web performance test. Because of this, we needed to create a plugin that would require a unique (unique-enough) alphanumeric string to be used as the invoice identifier. There is an out-of-box Guid generator, but the max invoice identifier length was 20 characters instead of 32. This required a little bit of string manipulation to be used.

There are a lot of great resources on how to create web performance test plugins, and it is surprisingly trivial to build these plugins. Here’s a couple of resources I found to be useful when creating the web test plugin for my customer:

That being said, this is how I created my own custom web performance test plugin and used it in a test.

Create the plugin

The first thing that we need to do is create the plugin itself. This requires a little bit of coding to be done. We will need to create a new public class either in the web performance and load testing project itself, or another project within the solution. In this example, I created the class within the same project as my web performance test. Here is the code I used:

[System.ComponentModel.DisplayName("Generate Guid Custom Length")]
[System.ComponentModel.Description("Generates a new Guid with a custom length")]
public class UniqueIdentifierPlugin : WebTestPlugin
    [System.ComponentModel.DisplayName("Target Context Parameter Name")]
    [System.ComponentModel.Description("Name of the context parameter that will receive the generated value.")]
    public string ContextParamTarget { get; set; }

    [System.ComponentModel.DisplayName("Output Format")]
    [System.ComponentModel.Description("Format for guid (optional). Ex: N")]
    public string OutputFormat { get; set; }

    [System.ComponentModel.DisplayName("Guid Length")]
    [System.ComponentModel.Description("Length of the generated guid.")]
    public int GuidLength { get; set; }

    public override void PreWebTest(object sender, PreWebTestEventArgs e)
        // Generate new guid with specified output format
        var newGuid = System.Guid.NewGuid().ToString(OutputFormat);

        // Create substring of specified length
        if (GuidLength > 0 && GuidLength < newGuid.Length)
            newGuid = newGuid.Substring(0, GuidLength - 1);

        // Set the context paramaeter with generated guid
        e.WebTest.Context[ContextParamTarget] = newGuid;

        base.PreWebTest(sender, e);
  1. Create a class and make sure it is public
  2. Add a reference to Microsoft.VisualStudio.TestTools.WebTesting and put a using statement in for it.
  3. Derive the class from WebTestPlugin.
  4. Add any context parameters that you want to expose to the user
  5. Override the PreWebTest method to run your code prior to every web performance test run

It truly is as simple as that. There are other classes you can derive from for specific purposes, but the WebTestPlugin will work just fine for our purposes. Once the class has been created, make sure that you build your solution so it will appear in the plugin list for web performance tests.

NOTE: If you have created this plugin in a different project, ensure that your web performance and load testing project has a reference to that project.

Add plugin to web performance test

Once the plugin has been created, and the solution has been built, we can add the custom plugin to a web performance test for use. The first thing we will want to do is create a context parameter that we want to set as the unique identifier.


Figure 1: Add Context Parameter in a web performance test

Right-click on the web test and select the Add Context Parameter. This will add a context parameter to the web test which we can set dynamically using the custom plugin we just wrote. After the parameter has been created, we can rename it to an appropriate label. There is no need to set it to any values, as we will set it through the custom plugin. I named mine InvoiceId:


Figure 2: InvoiceId context parameter

Now, all we have to do is add the custom plugin and set the correct properties for our plugin. To do so, click the button at the top of the web performance test itself called Add Web Test Plug-in:


Figure 3: Add Web Test Plug-in button

This will bring up the dialog to add a web test plugin. If all goes according to plan, we should be able to see our custom plugin in the list. Select the custom plugin and set the appropriate properties:


Figure 4: Set the plugin, set the plugin properties, and click OK

After setting the properties click OK, and the plugin will be added to your web performance test. I have set the following properties:

  • Target Context Parameter Name = InvoiceId : InvoiceId is the name of the context parameter we want to set the unique identifier to.
  • Output Format = N : N is the guid without any hyphens in it. Here’s a link defining the possible guid formats:
  • Guid Length = 12 : This is the length of the string that I want.

Once all is said and done, we should have a web performance test that looks along the lines of this:


Figure 5: Web test with a custom plugin and context parameter

Now, whenever the web performance test is run – whether it be by itself, or during a load test – a guid will be generated and the first 12 digits will be set as the InvoiceId.

For further reading on how to create, and run, load tests see my previous blog post: Web Performance and Load Testing with Visual Studio 2012 – Remote Execution.


About the Author:


  1. Kunal Raje May 8, 2014 at 12:08 am

    Hi James,

    Can you please guide me for
    installation and configuring Controllers and Agents for Web Performance and
    Load test using VSTS 2013 Ultimate? Also, Kindly let me know Is there a
    need for separate machines for Controllers and Agents OR one machine will do the
    same test? I need to perform these tests for our internal Share Point

    Thanks and Regards,

    Kunal Raje

  2. Ian Hodgetts November 19, 2014 at 4:00 am

    Excellent instructions. I’ve been struggling with something very similar for weeks. I’m new to both VS2013 and C# so this helped a great deal!

  3. James Tupper November 20, 2014 at 7:59 am

    Glad it helped you out! 🙂

  4. James Tupper November 20, 2014 at 8:00 am

    Hi Kunal – I actually have another blog post that covers this particular subject:

    Let me know if you have any further questions!

  5. Jason Eales March 2, 2017 at 6:15 pm

    Hi James
    Good Post!
    I have an issue creating a property inside a WebRequestPlugin.
    The property should provide a dropdown list box with choices the performance developer can make .
    i.e. source.Browser, source.Mobile, source.CourierPigeon
    Browser = “someawesomecode”;
    Mobile = “wickedtextsecret”
    CourierPigeon = “Seeds”
    The developer sees a property called “Source” with a dropdown box and the options displayed in the dropdown box are Browser, Mobile and CourierPigeon.

  6. Bipin Kumar March 28, 2017 at 4:29 am


    I am getting below error after adding Web Test Plugin in Web Test.

    Request failed: Exception in PreWebTest event: Could not load file or assembly ‘Project Name, Version=, Culture=neutral, PublicKeyToken=null’ or one of its dependencies. The system cannot find the file specified.

    We have created the Plugin in same solution file.

    Please help.

Leave A Comment