代码之家  ›  专栏  ›  技术社区  ›  Sorskoot

URL中会话ID为的WebTest

  •  3
  • Sorskoot  · 技术社区  · 15 年前

    我们有一个ASP.NET网站,它将您重定向到显示会话ID的URL。如下所示:

    http://localhost/(S(f3rjcw45q4cqarboeme53lbx))/main.aspx

    此ID对于每个请求都是唯一的。

    是否可以使用标准的Visual Studio 2008/2010 WebTest测试此网站?如何提供测试此数据?

    我必须用同一个ID调用几个不同的页面。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Nat    15 年前

    是的,这样做相对容易。但是,您需要创建一个编码的WebTest。

    在我的示例中,我们有一个登录日志,它将返回包含会话字符串的URL。 就在我们将登录后请求(request3)提供给枚举器之后,我调用了以下命令。

    WebTestRequest request3 = new WebTestRequest((this.Context["WebServer1"].ToString() + "/ICS/Login/English/Login.aspx"));
    //more request setup code removed for clarity
    yield return request3;
    string responseUrl = Context.LastResponse.ResponseUri.AbsoluteUri;
    string cookieUrl = GetUrlCookie(responseUrl, this.Context["WebServer1"].ToString(),"/main.aspx"); 
    request3 = null;
    

    其中geturlcookie是这样的:

    public static string GetUrlCookie(string fullUrl, string webServerUrl, string afterUrlPArt)
        {
            string result = fullUrl.Substring(webServerUrl.Length);
            result = result.Substring(0, result.Length - afterUrlPArt.Length);
            return result;
        }
    

    一旦您有了会话cookie字符串,就可以很容易地在请求/发布的任何后续URL中替换它。 例如

    WebTestRequest request4 = new WebTestRequest((this.Context["WebServer1"].ToString() + cookieUrl + "/mySecureForm.aspx"));
    

    我为我的代码太粗糙而道歉,但是它在我的项目中被否决了,并且从代码库的第一个版本中被删除了——并且说它很简单:)

    对于任何负载测试,根据您的应用程序的不同,您可能必须想出一个存储过程来调用,以便在每次运行测试时提供不同的登录信息。

    注意,由于无法提前确定响应URL,因此对于登录日志,必须临时关闭urlvalidationEventHandler。为此,我将validationRuleEventHandler存储在本地变量中:

            ValidateResponseUrl validationRule1 = new ValidateResponseUrl();
            urlValidationRuleEventHandler = new EventHandler<ValidationEventArgs>(validationRule1.Validate);
    

    然后可以根据需要打开和关闭它:

    this.ValidateResponse -= urlValidationRuleEventHandler ;
    this.ValidateResponse += urlValidationRuleEventHandler ;
    

    另一种方法是自己编写这样的代码(从Visual Studio代码中反射出来并更改为不区分大小写)。

    class QueryLessCaseInsensitiveValidateResponseUrl : ValidateResponseUrl
    {
        public override void Validate(object sender, ValidationEventArgs e)
        {
            Uri uri;
            string uriString = string.IsNullOrEmpty(e.Request.ExpectedResponseUrl) ? e.Request.Url : e.Request.ExpectedResponseUrl;
            if (!Uri.TryCreate(e.Request.Url, UriKind.Absolute, out uri))
            {
                e.Message = "The request URL could not be parsed";
                e.IsValid = false;
            }
            else
            {
                Uri uri2;
                string leftPart = uri.GetLeftPart(UriPartial.Path);
                if (!Uri.TryCreate(uriString, UriKind.Absolute, out uri2))
                {
                    e.Message = "The request URL could not be parsed";
                    e.IsValid = false;
                }
                else
                {
                    uriString = uri2.GetLeftPart(UriPartial.Path);
                    ////this removes the query string
                    //uriString.Substring(0, uriString.Length - uri2.Query.Length);
                    Uri uritemp = new Uri(uriString);
                    if (uritemp.Query.Length > 0)
                    {
                        string fred = "There is a problem";
                    }
                    //changed to ignore case
                    if (string.Equals(leftPart, uriString, StringComparison.OrdinalIgnoreCase))
                    {
                        e.IsValid = true;
                    }
                    else
                    {
                        e.Message = string.Format("The value of the ExpectedResponseUrl property '{0}' does not equal the actual response URL '{1}'. QueryString parameters were ignored.", new object[] { uriString, leftPart });
                        e.IsValid = false;
                    }
                }
            }
        }
    }