学习使用JMeter进行RESTful API测试的有效技术和最佳实践(2)
2013-12-19 16:52 来源:IBM 作者:Shalini Gilra 人气指数: 次
使用 JSON 模板文件实现有效负载分离
许多云 API 要求使用 JSON 有效负载作为输入。JSON 定义了一组结构化的元素,可以将它们嵌套在其他元素中。每一个元素定义一个或多个名称/值对。功能测试包括以指定格式反复提供数据。例如,在一个典型的 REST API 调用中,JSON 有效负载在 REST HTTP 请求的主体中传递,并且通常包含硬编码的数据。硬编码的数据通常会在多个测试中重复,并分散在整个脚本中。
这种方法的一个常见问题是,如果 JSON 结构(或数据)发现变化(也许是因为 API 参数的更改),那么您必须进入 JMeter 测试,找到 HTTP 请求的主体,并修改 JSON 结构(和数据),以满足新的要求。如果在使用此 JSON 结构的多个 JMeter 测试用例中有数千个 HTTP 请求,那么必须执行许多重复的编辑。
更好的方法是创建一个 JSON 结构模板,并定义数据目的地的替换字符串。JSON 模板不包含任何硬编码的数据值,而是定义在脚本运行时随实际数据一起加载的引用变量。然后,模板被读入 JMeter 脚本中的某个变量,并在 HTTP 请求主体中被替换。
清单 3 显示了定义一个 JSON 有效负载的传统方式:
清单 3. JMeter 测试计划中的静态 JSON 定义
{ "Customer":{ "CustomerType":"DIRECT", "CustomerNumber":"1234567890", "Organization":{ "OrgName":"IBM", "Phone":"999-999-9999", "AddressSet":[ { "AddressLine1":"Tech Park One", "AddressLine2":"", "AddressType":"MAILING", "City":"Pune", "Country":"India", "State":"Maharashtra", "StateCode":"MH", "PostalCode":"411006" } ], "Contact":{ "FamilyName":"Gilra", "GivenName":"Shalini", "EmailAddress":"shagilra@in.ibm.com", "NamePrefix":"Miss", "LanguagePreference":"EN_US", "WorkPhone":"999-9999" } } } }清单 4 显示了在模板中定义 JSON 的动态方式:
清单 4. 在外部 JSON 模板文件中的动态 JSON 定义
{ "Customer":{ "CustomerType":"${__eval(${STR_CUSTOMERTYPE})}", "CustomerNumber":"${__eval(${STR_CUSTOMERNUMBER})}", "Organization":{ "OrgName":"${__eval(${STR_ORGNAME})}", "Phone":"${__eval(${STR_PHONE})}", "AddressSet":[ { "AddressLine1":"${__eval(${STR_ADDRESSLINE1})}", "AddressLine2":"${__eval(${STR_ADDRESSLINE2})}", "AddressType":"${__eval(${STR_ADDRESSTYPE})}", "City":"${__eval(${STR_CITY})}", "Country":"${__eval(${STR_COUNTRY})}", "State":"${__eval(${STR_STATE})}", "StateCode":"${__eval(${STR_STATECODE})}", "PostalCode":"${__eval(${STR_POSTALCODE})}", } ], "Contact":{ "FamilyName":"${__eval(${STR_FAMILYNAME})}", "GivenName":"${__eval(${STR_GIVENNAME})}", "EmailAddress":"${__eval(${STR_EMAILADDRESS})}", "NamePrefix":"${__eval(${STR_NAMEPREFIX})}", "LanguagePreference":"${__eval(${STR_LANGUAGEPREFERENCE})}", "WorkPhone":"${__eval(${STR_WORKPHONE})}", } } } }清单 3 中的 JSON 实体只包含硬编码的数据。相反,清单 4 中的模板只包含引用变量的名称,所以,任何 JMeter 测试计划都可以使用模板。实际数据被单独存储在 CSV 数据文件中,我们将在 下一节 讨论它。
请注意,清单 4 中的 JSON 为每个已定义的替代变量调用了 JMeter __eval() 函数。增加的这一步骤使得在运行时执行 JMeter 脚本的时候可以对变量进行计算。
图 2 和图 3 显示了如何在 JMeter 测试脚本中指定 JSON 实体模板文件。图 2 显示了 HTTP Request 控制面板:
图 2. 在测试中使用一个模板文件的内容
在图 2 的示例中,CUSTOMER_JSON 变量表示整个JSON Customer 元素。该变量被封闭在 _eval() 函数中,显示为 HTTP 请求的主体(在 Parameters 选项卡上的 Send Parameters With the Request 标题下)。然后,在图 2 中,请求主体是 ${_eval(${CUSTOMER_JSON})}。
在 User Parameters 控制面板中定义 CUSTOMER_JSON 变量,如图 3 所示:
图 3. 在 JMeter 脚本中读取 JSON 模板文件
在图 3 中,CUSTOMER_JSON 变量被设置为 FileToString(),并使用指向 JSON 模板文件的路径作为参数。JSON 实体模板文件的所有内容都被读入 CUSTOMER_JSON 变量。因此,JSON 实体模板文件的内容是在运行时计算的,所定义的所有替代字符串都被翻译成为它们定义的数据。(下一节 将说明替代变量如何与实际数据相关联)。
因为 JMeter 的 JSON 实体模板文件对于 JMeter 测试脚本是外部文件,所以您可以将它们存储在一个单独的目录,比如 JMETER_HOME/tests/jsontemplates。当您访问 JMeter 测试计划中的某个 JSON 实体模板时,可指定相对于 JMeter BIN 目录的名称,例如:
../tests/jsontemplates/customer_template.json您也可以将模板存储在 JMETER_HOME 目录以外的地方,在这种情况下,您必须提供绝对路径。
为您推荐:
其他类似的新闻
其他相关的新闻