性能测试中的随机数性能问题探索
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()
使用当前时间作为随机数的种子。在负载测试中,我们经常会得到几个以相同的“当前时间”值开始的测试用例,因此它们都会生成相同的随机数集。请对线程安全的随机数做一些研究。以上是关于性能测试中的随机数性能问题探索的主要内容,如果未能解决你的问题,请参考以下文章