When a user creates a new casefile in our system. Its created as a custom content-type that inherits from SharePoint’s document set. My load tests need at least the following information in order to continue working with that casefile:
- The title of the document set.
- SharePoint’s ID of the content-type.
- SharePoint’s ID of the list item.
- SharePoint’s ID of the list where its created in.
The POST to a MVC controller is the starting point for our system to create the casefile. The only way to find out what the values are is by following a URL contained within the HTTP 200 response (looks like this)
<script type="text/javascript">window.parent.location.href="https://...../DocSetHome.aspx?......";</script>
By doing a GET request to that URL, we get a HTTP 302 response, Visual Studio automatically follows the redirect and the final HTTP 200 response’s URI contains all the dynamic values as querystring parameters:
https://……/docsethomepage.aspx?ID=…&FolderCTID=…&List=…&RootFolder=…&RecSrc=…
Visual Studio doesn’t have an out-of-the-box plugin that can extract the values of those querystring parameters. So I created my own:
using System; using System.Linq; using Microsoft.VisualStudio.TestTools.WebTesting; using System.Globalization; using System.ComponentModel; using System.Web; using System.Collections.Specialized; using Microsoft.VisualStudio.TestTools.WebTesting.Rules; namespace LoadTestPlugins { [DisplayNameAttribute("Extract querystring parameter")] [DescriptionAttribute("Extracts the value of a querystring parameter from the URI of a response")] public class ExtractQuerystringParameter : ExtractionRule { //Which field to parse and store in the context [Description("Name of the querystring parameter to extract"), DisplayName("Field name")] public string FieldName {get; set;} public override void Extract(object sender, ExtractionEventArgs e) { if (e.Response.ResponseUri != null) { NameValueCollection NVC = HttpUtility.ParseQueryString(e.Response.ResponseUri.Query); string value = NVC[this.FieldName]; if(!string.IsNullOrEmpty(value)) { //The last part of the RootFolder or RecSrc contains the name of the //documentset. It needs to be Url encoded as it might contain spaces if ( this.FieldName.ToLower().Equals("RootFolder".ToLower()) || this.FieldName.ToLower().Equals("RecSrc".ToLower())) { value = Uri.EscapeUriString(value.Split('/').Last()); } e.WebTest.Context.Add(this.ContextParameterName, value); e.Success = true; return; } else { e.Success = false; e.Message = string.Format(CultureInfo.CurrentCulture , "Querystring Parameter Not Found: {0}" , this.FieldName); } } } } }