1.关联的定义为什么要关联在客户端和服务端的通信过程中,多次请求/响应之间的数据会相互依赖。比如前面的请求返回的一些响应数据,需要在后面的请求中使用。下面是一些典型的例子:比如第一次访问网站得到的sessionid,会在后续的请求中传递给网站。服务器生成一个token返回给用户,这个token必须包含在后续的请求中。根据条件查询一条记录,在查询结果集中选择这条记录进行操作(如删除)。...但是一些通信协议是无状态的并且没有上下文依赖性。多个请求/响应之间的数据不能直接传递;并且服务器每次返回的数据都不是静态的,传输的数据无法通过硬编码(hard-coded)存储来解决。比如以上三种情况都会产生动态变化的数据:sessionid的生命周期一般在浏览器关闭时结束,每次打开浏览器返回的sessionid都不一样。Token也有生命周期,一般是随机的,无状态的。如果查询条件被参数化或者服务器返回的查询结果集发生变化,可能会导致后续操作失败。在这些情况下,可以考虑将服务器返回的动态变化的数据保存到一个参数中,需要的时候再取出来。关联原理比如看电影,看电影的过程有以下几个步骤:买票、检票、看电影的每一步都可以看成是一个请求/响应。观众相当于客户端,影院相当于服务器。流程如下图所示:观众购买的电影票可以看作是服务器返回的响应数据,电影票只有通过检票才能进入观看电影。观众购票相当于一个请求,验票是下一个请求,需要在下一个请求中将上一个请求返回的响应数据(电影票)发送给服务器处理。假设这部电影很精彩,你想再看一遍,因为电影票只能使用一次,观众必须重新买票才能通过验票;如果你第一次使用购买的电影票,你肯定会被拒之门外。为了解决这个问题,可以考虑做如下假设:每次将购买的电影票放入随身携带的LV钱包中,用过的票先丢弃再放入,以防止错票入场时抽签;这时候从钱包里拿出票来验票,这样就万无一失了。将电影票放入钱包,相当于保存了服务器返回的数据,其中钱包是保存关联数据的参数。关联定义了将服务器返回的数据包中符合条件的数据保存到参数中的过程。如何保存服务器返回的数据,JMeter可以使用后处理器来处理关联数据,常用的方法有:正则表达式提取器。JSON提取器。如何确定哪些数据需要关联,关联数据的特征可以从关联数据的特征来识别。链接数据具有以下三个特点:服务器返回的需要链接的数据,必须是服务器返回的。客户端输入的数据不需要关联,比如输入的用户名和密码。此功能是强制性的。数据会再次发送给服务器,对上次请求响应的数据进行处理保存,目的是为了下次请求时使用,否则保存没有意义。这个特性是可选的,也就是说可以保存数据用于关联而无需再次发送。数据动态变化如果之前请求响应的数据没有动态变化,完全可以写在脚本里,不需要额外花力气去保存再取出来。正是因为每次返回的数据都是动态变化的,所以我们需要把这些动态变化的数据按照一定的规则找出并保存起来,然后再取出真正返回的数据。但此功能也是可选的。不动态变化可以保存关联,但意义不大。2、正则表达式介绍JMeter通过内嵌的ApacheJakartaORO软件对正则表达式进行解析和处理。Jakarta-ORO是一组用于处理文本的Java类。是目前功能最全、性能最好的正则表达式API之一。它提供与Perl5类型兼容的正则表达式。单行模式和多行模式元字符Extendedregularexpressions4.Regularexpressionextractor配置项适用于:与响应断言中的用法一致,不再赘述。需要检查的字段:BodyResponseBody,比如HTTP响应报文的实体body,不包括状态行和header。Body(unescaped)ResponseBody(转义字符转换),对HTTP响应报文的entitybody中的所有HTML转义字符进行转义。因为转义时没有引用上下文,处理时可能会出错,启用该选项会严重影响性能,所以不推荐使用。BodyasaDocument通过ApacheTika从各种类型的文档中提取文本。启用此选项会严重影响性能,因此请谨慎使用。ResponseHeaders一般用于HTTP请求和HTTP响应头。RequestHeaders一般用于HTTP请求,HTTP请求报文中的头部。URL通常用于HTTP请求。HTTP请求报文中的请求URL地址(不开启重定向功能);如果启用了重定向功能,则包括原始请求中的请求URL地址和重定向后的URL地址。比如前面访问新浪的例子,启用重定向后,包括:http://www.sina.com/、http://www.sina.com.cn/和https://www.sina.com。cn/三个网址地址。响应码一般用在HTTP协议中,指的是HTTP响应报文中的状态码,如200、301、404等。HTTP响应消息,如OK、MovedPermanently、NotFound等。创建变量的名称:用于存储结果的JMeter变量的名称。正则表达式:用于解析响应数据的正则表达式。在正则表达式中使用()来捕获响应字符串。Template($i$whereiiscapturinggroupnumber,startsat1):设置将捕获的字符串保存到存储结果的JMeter变量中的格式。在这一项中,可以用$1$表示捕获组1中的内容,$2$表示捕获组2中的内容,...,$n$表示捕获组n中的内容,$0$引用正则表达式匹配后的整个字符串。注意除了用$n$引用捕获组的内容外,还可以加上需要的字符,将匹配到的内容以一定的格式保存。MatchNo.(0forRandom):匹配序号。如何从匹配结果中选择匹配项。如果正则表达式每个捕获组有多个匹配项。那么1表示第一个匹配项,2表示第二个匹配项,...,以此类推;0表示从多个匹配项中随机选择一个;-i(i=1,2,3,...,N,-i为负整数)表示引用所有匹配项。DefaultValue:如果正则表达式不匹配内容,保存结果的JMeter变量会被设置为默认值,方便JMeter测试调试。如果没有提供默认值,则很难判断正则表达式是否匹配失败,或者RE元素是否未处理或使用了错误的变量。但是,如果您有多个设置相同变量的测试元素,您可能希望在表达式不匹配时保持变量不变。在这种情况下,调试完成后将默认值去掉。使用空默认值:如果复选框被选中并且默认值为空,JMeter会将保存结果的JMeter变量设置为空字符串。四、应用案例案例描述业务操作步骤:登录ECshop后台管理系统。设置查询条件(例如,按产品品牌)搜索产品。选择返回的查询结果集中的第一项进行删除。这里,每个步骤对应一个HTTP请求。在第二次请求中,每次返回的查询结果集都不一样(因为每次执行都会删除一个商品),所以传递给第三次请求的商品编号参数不能硬编码。需要从第二个请求对应的响应数据中提取。操作步骤下面是第二步的一些细节:在第二次请求返回的响应数据中观察:...23)\">8<\/span><\/td>\r\n\r\nhref=\"..\/goods.php?id=23\"target=\"_blank\"title=\"\u67e5\u770b\">src=\"images\/icon_view.gif\"width=\"16\"height=\"16\"border=\"0\"...发现返回的goods_id左边框是goods.php?id=,右边框是\",但是考虑到.和?而\是元字符,需要进行转义,所以正则表达式可以设置为:goods\.php\?id=(\d+)\\"在删除商品的请求中,替换hard-带有提取的产品ID的编码数据:
