性能测试中的随机数性能问题探索

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了性能测试中的随机数性能问题探索相关的知识,希望对你有一定的参考价值。

参考技术A

在软件测试中,经常会遇到随机数。我简单分成了两类:

其实第二个场景包含在第一个场景内。对于接口测试来说,通常我们直接使用第二种场景比较多,就是从某一个集合中随机取一个值。如果更复杂一些,每个值拥有不同的权重,其中这个也可以转化成第二个场景来说。

为什么要把第二个场景和第一个场景分开呢,这个问题源于之前写过的文章ConcurrentHashMap性能测试,当时发现自己封装的com.funtester.frame.SourceCode#random(java.util.List )方法性能存在瓶颈,特别消耗CPU资源。

虽然单机QPS也在50万+,但是因为这个方法很多地方都会用到,所以还是想提升一些性能。所以我就搜索了一些高性能随机数的功能,跟我之前搜到的资料一致,使用java.util.concurrent.ThreadLocalRandom这个实现类是性能最高的,方法如下:

针对第二种场景,还有一种实现思路:通过循环去集合中取即可。就是顺序去取,而不是每次都从集合中随机。

举个例子,我们有10万测试用户进行流量回放,演示代码如下:

这里调用了两次com.funtester.frame.SourceCode#random(java.util.List ),当QPS到达10万级别时候,理论上这个方法导致的瓶颈还是有一些影响的。

所以我用了新思路进行改造,下面是两种思路的对比压测用例,这个测试用例里面其实有三个实现:

用例如下:

由于测试中均达到了CPU硬件瓶颈,相同参数情况下结论比较明显,就没有进行多轮的对比测试。下面分享一下测试结果:

没想到用了java.util.concurrent.atomic.AtomicInteger反而性能更高了,这个问题略微有点深奥,暂时没有思路。

下面我们来测试一下单线程的性能,下面是我的用例:

下面是测试结果,这里我记录了执行完所有循环次数的时间,单位是ms(毫秒)。

这下结论明确了,就java.util.concurrent.atomic.AtomicInteger了。

最终写了一个新的随机对象的方法:

「BUG挖掘机·性能征服者·头顶锅盖」

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

【中文标题】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

移动游戏客户端性能测试探索

啄木鸟性能测试WAS内存使用的探索和分析

Visual Studio 2010 性能测试

Siege---Linux性能压测工具及结果分析

性能测试迭代与检查点(loadrunner12.55)