用蝗虫进行负荷测试。 第三部分

关于蝗虫压力测试工具的最终文章。 今天,我将分享在此过程中积累的意见。 与往常一样,视频已附加。

第1部分- 使用蝗虫进行测试
第2部分- 高级方案


登入


在用Locust编写我的第一个测试时,我面临登录到一个资源,获取授权令牌的需求,该令牌稍后将用于负载测试。 然后问题立即出现-如何执行此操作,因为该工具经过了改进,可以将所有请求发送到一个资源,我们在开始测试时会在控制台中指出这一点。 有几种解决方法:

  • 禁用测试资源的授权-如果可能的话
  • 预先生成令牌并将其放入发射之前的测试代码中-这是最弱的选项,每次发射都需要体力劳动,但在少数情况下有权存在
  • 使用请求库发送请求并从响应中获取令牌-很好,语法是相同的

我选择了第三个选项。 下面,我从第一篇文章中提出一个重做示例,它具有获得令牌的不同可能性。 Google.com将充当授权服务器,因此
因为没有令牌,我将获得最简单的值

from locust import HttpLocust, TaskSet, task import requests class UserBehavior(TaskSet): def on_start(self): response = requests.post("http://mysite.sample.com/login", {"username": "ellen_key", "password": "education"}) # get "token" from response header self.client.headers.update({'Authorization': response.headers.get('Date')}) # get "token" from response cookies self.client.cookies.set('Authorization', response.cookies.get('NID')) # get "token" from response body self.client.headers.update({'Authorization': str(response.content.decode().find('google'))}) 

从示例中可以看到,在开始工作之前,用户将请求发送到第三方服务器并处理响应,将数据放置在标头或cookie中。

标头


使用请求标头时,需要考虑几个重要的细微差别。
对于每个请求,可以分别指定自己的标题集,如下所示

 self.client.post(url='/posts', data='hello world', headers={'hello': 'world'}) 

当执行上述示例时,hello标头将添加到客户端会话的现有标头中,但仅在此请求中才会出现在以下所有示例中。 要使标题永久存在,可以将其添加到会话中:

 self.client.headers.update({'aaa': 'bbb'}) 

另一个有趣的观察-如果在请求中我们指定了会话中已经存在的标头-它将被覆盖,但仅在此请求上才会被覆盖。 因此,您不必害怕意外擦拭重要的东西。

但是也有例外。 如果我们需要发送多部分表单,则请求将自动生成Content-Type标头,该标头将指示表单数据分隔符。 如果我们强制使用headers参数重写标头 ,则请求将失败,因为无法正确处理表单。

还值得注意的是,所有标头都必须是字符串。 如果您尝试指定一个数字,例如{'aaa':123} ,则不会发送请求,并且代码将引发InvalidHeader异常

分布式测试


对于分布式测试,locust提供了几个CLI参数:-- master--slave ,以明确定义角色。 在这种情况下,带主机的机器将不会模拟负载,而只会收集统计数据并协调工作。 让我们尝试通过在不同的控制台中运行以下命令来以分布式模式运行测试服务器和多个会话:

 json-server --watch sample_server/db.json locust -f locust_files\locust_file.py --master --host=http://localhost:3000 locust -f locust_files\locust_file.py --slave --master-host=localhost locust -f locust_files\locust_file.py --slave --master-host=localhost 


通过在浏览器( localhost:8089 )中打开蝗虫,您会注意到在右上角,我们有将承载负载的计算机数量



在没有UI的情况下进行测试


编写并调试所有测试后,最好将它们包含在回归自动测试中,并定期检查结果。 使用以下命令,可以在没有UI的情况下运行蝗虫测试:

 locust -f locust_files\locust_file.py --host=http://localhost:3000 --no-web -c 10 -r 2 --run-time 1m --csv=test_result 

在哪里

  • --no-web-一个参数,允许您在没有UI的情况下运行测试
  • -c 10-最大用户数
  • -r 2-每秒用户增长
  • --run-time 1m-测试执行时间(1分钟)
  • --csv = test_result-测试完成后,将在当前文件夹中创建2个带有结果的csv文件,它们的名称以test_result开头

最终事实,观察和结论


可以将分布式测试与回归测试结合使用-为了确保启动所有负载节点,可以在主节点上添加参数--expect-slaves = 2 ,在这种情况下,仅在至少启动2个节点时才开始测试。

我遇到过几次情况-测试的资源仅在HTTPS上有效,而证书是由客户生成的,并且操作系统将其标记为可疑。 为了使测试成功进行,您可以向所有忽略安全检查的查询添加一个参数,例如:

 self.client.get("/posts", verify=False) 

由于我不能始终确定将在哪个环境中运行测试,因此我总是指出该观点。

这就是我要分享的全部。 对于我自己,我发现了一个简单便捷的工具,它具有强大的测试功能,并且在创建请求和处理服务器响应时具有可变性。 感谢您阅读到最后。

Source: https://habr.com/ru/post/zh-CN433304/


All Articles