C# Regex:从 Web 性能和负载测试项目中的 HTTP 响应中获取随机 URL

Posted

技术标签:

【中文标题】C# Regex:从 Web 性能和负载测试项目中的 HTTP 响应中获取随机 URL【英文标题】:C# Regex: Get random URL from HTTP response in Web Perfomance and Load Test Project 【发布时间】:2016-12-07 12:58:08 【问题描述】:

你能帮我解决这个问题吗?

我有网络请求

 WebTestRequest request1 = new WebTestRequest("http://www.theverge.com/");
        request1.ParseDependentRequests = false;
        yield return request1;

以及对此的回应:

      <li><a href="https://www.facebook.com/verge" tabindex="2">
        <svg class="p-svg-icon"><use xlink:href="#icon-facebook"></use></svg>
      </a></li>

      <li><a href="https://twitter.com/verge" tabindex="3">
        <svg class="p-svg-icon"><use xlink:href="#icon-twitter"></use></svg>
      </a></li>

      <li><a href="/rss/index.xml" tabindex="4">
        <svg class="p-svg-icon"><use xlink:href="#icon-rss"></use></svg>
      </a></li>

我想查找此页面上的所有 URL,并在下一步中随机使用它们。 据我了解,我应该使用

string response = LastResponse.BodyString;

比正则表达式,创建一个ArrayList 类并采用随机网址。

有人可以帮我吗?

【问题讨论】:

【参考方案1】:

我主要使用了两种方法。首先使用正则表达式并获取所有匹配项。 创建一个匹配所有想要的 URL 但不匹配不需要的 URL 的正则表达式。 我测试的一个网站有许多 URL,其中 href= 前面有一个 class= 有几个数字级别。我只想要级别 2 和 3,导致下面代码中的表达式。

当您确信 html 在测试开发和测试执行的整个持续时间内将采用固定格式时,此方法将起作用。如果href=s(或附近)的 HTML 可能会发生变化,那么您需要更复杂的正则表达式或其他方法。

我使用了GetARandomNumber 方法,因为.NET 随机数生成器不是线程安全的。例如,请参阅here。

public class GetAUrl : WebTestRequestPlugin

    public string ContextParameter  get; set; 

    public override void PostRequest(object sender, PostRequestEventArgs e)
    
        string body = e.Response.BodyString;

        // Looking for requests in a specific class.

        string pattern = "\\bclass=\"nav__link-[23]\" +href=\"(/[^\"]*)\"";
        // The URL is in this capture:                        ^^^^^^^^^

        MatchCollection matches = Regex.Matches(body, pattern);

        int randomIndex = GetARandomNumber(matches.Count);
        //  Above will get a value 0 <= randomIndex < matches.Count

        e.WebTest.Context[ContextParameter] = matches[randomIndex].Groups[1].Value;
    


另一种方法使用HtmlAgilityPack,其中方法的本质使用:

HtmlAgilityPack.HtmlNodeCollection nodes = input_doc.DocumentNode.SelectNodes("//a");

然后您筛选节点集合以选择感兴趣的节点,然后随机选择一个。

【讨论】:

嗨@AdrianHHH,感谢您的帮助。我真的很感激。我会尝试弄清楚并在我的项目中使用它。【参考方案2】:

结果:

string response = LastResponse.BodyString;
            string pattern = @"regexp";

            MatchCollection results = Regex.Matches(response, pattern);
            Random rnd = new Random();
            string randomUrl = results[rnd.Next(results.Count)].Groups[1].Value;

【讨论】:

正如我在回答中所说,Random 不是线程安全的。此外,调用new Random() 使用当前时间作为随机数的种子。在负载测试中,我们经常会得到几个以相同的“当前时间”值开始的测试用例,因此它们都会生成相同的随机数集。请对线程安全的随机数做一些研究。

以上是关于C# Regex:从 Web 性能和负载测试项目中的 HTTP 响应中获取随机 URL的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 中录制 Web 负载测试项目

Django 性能测试

全网火爆,Jmeter性能场景设计 - 压力负载测试性能场景+分析性能指标

《质量全面管理—从项目管理到容灾测试》_性能测试部分

我在哪里指定要测试我的负载测试项目的 URL

性能测试轻量级压测工具Hey