soapui接口性能测试(一)---- 创建并运行一个性能测试

1. soapui使用性能测试

SoapUI中的LoadTest用于在您所需的持续时间内使用多线程(与“虚拟用户”相同)时重复运行现有的功能TestCase来断言您的目标服务。LoadTests在导航器中显示为此TestCase的子项;

(这里可以看到“Test and Buy TestCase”TestCase有四个LoadTests定义)。

您可以从TestCase右键菜单或TestCase工具栏中使用New LoadTest选项为您的TestCase创建任意数量的LoadTests 。在导航器中双击LoadTest窗口(新创建的LoadTest将自动打开)。

1.1。运行LoadTest

SoapUI允许您使用您的硬件可以负担的多个线程(“虚拟用户”)运行LoadTest,主要取决于内存,CPU,目标服务响应时间等。设置所需的值并启动LoadTest在LoadTest窗口的左上角使用“run”按钮。

TestCase在loadtest内部针对每个配置的线程进行克隆,并使用其自己的上下文,脚本,属性等启动。TestCase将访问TestCase及其TestSteps的唯一“复制”,它可以避免在TestStep和TestCase级别(但不是更高级别)的线程问题。

如果您的TestCase修改了Test Suite或项目属性,这将在公共共享的父对象上完成。

“Thread Startup Delay”在负载测试选项对话框中设置可用于每个线程的开始之间的延迟。

根据选择的限制和策略,LoadTest将按照配置运行,直到由于以下原因之一终止:

  • 已达到其配置限制
  • 使用LoadTest工具栏上的“ 取消”按钮取消了用户
  • 当该断言的允许错误的最大数量超过时,LoadTest被终止

如果限制是基于时间的,则LoadTest选项对话框中的“ Cancel Running选项允许您控制正在运行的线程在达到界限是否应该被允许完成或取消当前testcase。在同一个界面中,“Cancel Excessive”选项可控制当线程计数减少时(例如使用突发策略)时是否应取消过多的线程。

多个LoadTests可以并行执行,以测试更高级的场景,只需一次打开几个窗口并并行运行。一个示例场景可能是一个负载测试,包括一个simple策略的LoadTest生成基线流量,另一个LoadTest使用Burst策略,它在突发中创建高流量; 在每个突发之后,基准LoadTest可以断言系统根据需要处理和恢复。

1.2。统计收集

当LoadTest运行时,每次执行的TestCase完成时,使用收集的数据持续更新LoadTest统计信息(界面的列表),从而允许您在LoadTest执行时交互监控目标服务的性能。如果您的TestCase包含循环或长时间运行的TestSteps,则可能需要一些时间来更新统计信息(因为它们在TestCase完成时被收集),在这种情况下,请在LoadTest选项对话框中选择“TestStep Statistics”选项以获取更新TestStep级别的统计信息,而不是TestCase级别(这需要在内部进行更多的处理(影响性能),这就是为什么默认情况下被关闭)。

统计数据的收集和计算是异步执行的(即独立于实际的TestCase执行),因此它不会直接影响实际的LoadTest执行。此外,“ LoadTest选项”对话框中的“ Statistics Interval设置控制从基础统计模型更新统计信息表的频率,如果需要更多或更少频繁的更新,请更改此值。

快速提示: 几个策略还允许您在执行期间更改线程数,从而使您可以在LoadTest进度时交互地更改负载并监视结果。如果要在线程数量更改时重置计算的统计信息(因此avg和tps等数字不会与以前的结果相违背),请确保选中“LoadTest选项”对话框中的“ Reset Statistics”。

1.3。TPS / BPS计算

对于除TPS(每秒事务)和BPS(每秒字节数)之外的所有列,统计表中不同值可以通过两种不同的方式直接计算的(由LoadTest选项对话框的“Calculate TPS/BPS”设置);

  • 根据实际时间(默认):

    • TPS:CNT /秒通过,即运行10秒并处理100请求的TestCase将获得TPS为10
    • BPS:字节/传递的时间,即运行10秒并处理100000字节的TestCase将获得10000的BPS。
  • 基于平均执行时间:
    • TPS:(1000 / avg)* 线程数,例如avg = 100 ms,十个线程将给出TPS为100
    • BPS:(bytes / CNT)* TPS,即每个请求的平均字节数* TPS。

为了更好地了解这两者之间的差异,我们来创建一个小例子; 一个具有两个groovy脚本的TestCase,第一个睡眠900ms,第二个为100ms。我们将用10个线程运行10秒,理论上应该导致100次执行我们的TestCase;

根据传递的时间计算TPS,两个测试步骤的值相同,因为它们在10秒钟内执行相同次数。它们的单独执行速度不会影响该值。

现在让我们改变TPS的计算方式是基于平均值(在LoadTest选项对话框中):

当我们现在运行测试时,我们得到以下内容:

这里,第一个测试步骤的假设TPS计算为11,因为使用10次平行运行,平均时间为909ms。第二个测试阶段得到100 TPS,再次用10个平行运行计算,平均运行99ms(如果这是持续的性能,我们理论上可以在每秒钟内“挤压”100个请求)。

这两个使用哪一个取决于你; 使用单步TestCases,您应该从两者获得大致相同的结果,但是当您的TestCases包含许多步骤时,两种方式都有其优缺点(如上所示)。

统计图

在执行期间,LoadTest工具栏有两种类型的图表可供选择:统计和统计历史。这些的主要目的是随着时间的推移可视化选定的统计数据,以便能够发现突发和意外的变化。显示统计数据是相对的(不是绝对的),因此图形对于分析精确数据不是很有用。两个图都有一个频率设置,用于控制图形更新的频率; 将其设置为“data”将以与统计表相同的间隔更新图形。或者,如果您想要其中一个固定频率选择。

统计图表显示了所选步骤或随着时间的推移,整个测试用例所有相关的统计数据,让你看到价值如何变化,当你增大一定比例的线程数:

正如你可以看到,绿色线(线程)在测试一半后跳转,这也导致平均预期跳跃和每秒事务的微小变化,尽管我们增加了我们没有获得的线程数,吞吐量相应增加(因为平均响应时间增加)。

统计数据历史图表显示让你对它们进行比较及查看所有步骤选定的统计值是否随着时间的推移变化。对于相同的测试,我们可以比较avg的变化:

以上图表包含TestCase中每个TestStep的一行,其显示与我们的Statistics表中的TestStep相同的颜色:

当线程数增加时,我们可以看到两个TestSteps的平均更改类似。

1.4。TestStep具体要记住的事情

LoadTests的多线程执行有一些TestStep特定的含义,您应该在设计和运行LoadTest时注意:

  • 运行TestCase:如果您的TestCase包含“Run TestCase”步骤,则不会为LoadTest中的每个线程克隆其目标TestCase; 所有线程将各自执行目标TestCase的相同实例。在选项对话框中的“run mode”选项可用于控制在这种情况下的行为; 将其设置为“Create isolated copy”(将执行此操作)或“Run primary TestCase(等待运行完成,线程安全)”,这将同步对目标TestCase的访问。“Create isolated copy“将提供更好的性能,但是对于每次执行,对目标TestCase的内部状态的任何更改都将丢失。
  • DataSource:可以在LoadTest中的线程之间共享DataSources,从而允许您在用于驱动测试的数据之间划分线程。这可以派上用场,但确实有一些你应该明白的配置问题,在这里阅读更多:数据驱动的LoadTests
  • DataSink:就像DataSource一样,DataSink也可以共享,导致所有的线程写入同一个DataSink。请记住,在LoadTest的整个运行期间,共享的DataSink将用于所有线程,这可能相当多的数据。
  • DataGen:DataGen属性可以设置为在线程之间共享,这对于用于生成唯一ID的DataGen Number属性很有用(如果该属性未设置为共享,每个线程将获得相同的数字序列)。
时间: 2024-10-10 07:09:08

soapui接口性能测试(一)---- 创建并运行一个性能测试的相关文章

最全Pycharm教程(9)——创建并运行一个基本的Python测试程序

最全Pycharm教程(1)——定制外观 最全Pycharm教程(2)——代码风格 最全Pycharm教程(3)——代码的调试.运行 最全Pycharm教程(4)——有关Python解释器的相关配置 最全Pycharm教程(5)——Python快捷键相关设置 最全Pycharm教程(6)——将Pycharm作为Vim编辑器使用 最全Pycharm教程(7)——虚拟机VM的配置 最全Pycharm教程(8)——Django工程的创建和管理 1.主题 这里我们着重介绍Pycharm如何帮助我们创建并

创建并运行一个简单的Java程序

通常开发一个java应用程序可分为三个步骤: 1.创建一个带有文件扩展名 *.java 的源文件 1).使用编辑器(如记事本,小编使用的是notepad++),输入以下6行文本: 1 //一个简单的application例子:打印一行文本 2 class Hello { 3 public static void main (String args[]){ 4 System.out.println("Hello Java,This is my first Java Application!&quo

使用PyCharm创建并运行一个Python项目

(1)首先,在欢迎界面点击“Create New Project”: (2)在“New Project“左侧面板点击”Pure Python“,右侧Location选择自己要创建项目的路径(一般情况,先建立一个文件夹,如HelloWord,然后选择该文件夹的路径),点击”Create“按钮: (3)项目创建成功: (4)创建Python文件:在项目工具窗口中选择项目根目录(即HelloWorld目录),右键依次点击New->Python File,在弹出的对话框中输入文件名称,如HelloWor

Python中subprocess 模块 创建并运行一个进程

python的subprocess模块,看到官方声明里说要尽力避免使用shell=True这个参数,于是测试了一下: from subprocess import call import shlex cmd = "cat test.txt; rm test.txt" call(cmd, shell=True) 运行之后: 1:打开并浏览了test.txt文件 2:删除了test.txt文件 from subprocess import call import shlex cmd = &

如何创建并运行java线程

原文链接  译者:章筱虎  校对:方腾飞 Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类. 可以用如下方式用java中创建一个线程: Tread thread = new Thread(); 执行该线程可以调用该线程的start()方法: thread.start(); 在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了. 编写线程运行时执行的代码有两种方式:一种是创建Thread子类的一个实例并重写run方法,第二种是创建

Java多线程-如何创建并运行线程

以下内容转自http://ifeve.com/creating-and-starting-java-threads/: Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类. 可以用如下方式用java中创建一个线程: Tread thread = new Thread(); 执行该线程可以调用该线程的start()方法: thread.start(); 在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了. 编写线程运行时执行的代码

【如何创建并运行java线程】

原文链接  译者:章筱虎  校对:方腾飞 在java学习中,Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类. 可以用如下方式用java中创建一个线程: Tread thread = new Thread(); 复制代码 执行该线程可以调用该线程的start()方法: thread.start(); 复制代码 在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了. 编写线程运行时执行的代码有两种方式:一种是创建Thread子类的

Java并发编程(二)-- 创建、运行线程

Java线程 Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类. Java可以用如下方式创建一个线程: Tread thread = new Thread(); 执行该线程可以调用该线程的start()方法: thread.start(); 在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了. 创建.执行线程的方式 无返回: 实现Runnable接口; 继承Thread类,重写run(); 有返回: 实现Callable接口,

Java并发(基础知识)—— 创建、运行以及停止一个线程

0.介绍 在计算机世界,当人们谈到并发时,它的意思是一系列的任务在计算机中同时执行.如果计算机有多个处理器或者多核处理器,那么这个同时性是真实发生的:如果计算机只有一个核心处理器那么就只是表面现象. 现代所有的操作系统都允许并发地执行任务.你可以在听音乐和浏览网页新闻的同时阅读邮件,我们说这种并发是进程级别的并发.而且在同一进程内,也会同时有多种任务,这些在同一进程内运行的并发任务称之为线程. 在这里我们要讨论的是线程级并发.Java提供了Thread类,使我们能够在一个Java进程中运行多个线