使用 soapUI 测试 REST 服务(二)
图 3. 创建一个 REST 服务有了 REST 服务,就可以建立 TestCase,主要有两种方式:
自动生成,步骤如下:
(1). 右键点击一个 REST 服务,例如本例中的"BookStoreService", 选择"Generate TestSuite"
(2). 在弹出的对话框中,保持默认设置, 选择"OK"
(3). 输入名称 , 例如"BookStoreService TestSuite", 选择"OK"即可。
手工创建,步骤如下:
(1). 在项目"BooksStoreTest"上点击右键,选择“New TestSuite”, 在对话框中输入"BookStoreService TestSuite"
(2). 在 BookStoreService TestSuite 上点击右键, 选择"New TestCase", 在对话框中输入"BookList TestCase"
(3). 然后在左边的导航栏中展开 BookList TestCase, 在“Test Steps”上点右键,选择 Add Step->Rest Test Request
(4). 在弹出的对话框中选择 GetBookListRequest_XML
一个完成的 TestCase 如 图 4所示,用户可以在其中加入 Assertion 对运行结果进行验证,这也是自动化测试所必须的。
图 4. REST TestCase
使用变量
soapUI 支持使用自定义变量(Property)在 Project 中存储和共享数据。Property 是一个命名的字符串可以被 Groovy Script,Property Transfer 或者 Property-Expansion 引用, 目前所有的变量均被处理为字符串。soapUI 允许在项目的各个层次中定义变量,常用的层次包括:Project,TestSuite,TestCase,Global 等。
1. 使用 Property 编辑器定义变量。
用户可以使用 soapUI 自带的 Property Editor 定义各个层次的变量。以 Project 变量为例,点击 BookStoreTest,在 Properties 面板中添加自定义变量,如下图所示:
图 5. 使用 Property 编辑器定义项目变量
2. 使用命令行指定变量。
修改 soapUI.bat 文件中的 Java 参数如下:
清单 x. 使用命令行指定变量
set JAVA_OPTS=%JAVA_OPTS% -Xms128m -Xmx256m -Dsoapui.properties=properties.txt
其中,properties.txt 为指定的全局变量文件名字,可以通过添加如下代码到全局变量文件来设置 project/testsuite/testcase 等层次的变量:
清单 x. 使用命令行指定变量
soapui.properties.<shortened-name-of-object>=pathtopropertiesfile
<shortened-name-of-object> 为相应对象的名字。
3. 使用变量
soapUI 使用如下语法引用项目中定义的变量:
清单 x. 使用命令行指定变量
${propertyName[#xpath-expression]}
其中,scope 可以为 #Project#,#TestSuite#,#TestCase# ,#Global#,#System#,#MockService#,#Env#,#。
验证结果
测试用例建好之后,需要向测试用例中添加 Assertions 以便验证结果的正确性。soapUI 支持 Response SLA, Script Assertion, Contains, XQuery Match, Schema Compliance, XPath Match 以及 Not Contains 等多种断言来对 response 进行判断来保证对 Web 服务高质量的测试。本文以 XPath Match 和 Script Assertion 为例来对在线书店服务返回的 XML 和 JSON 格式的 response 进行判断。
1. 使用 XPath Match 测试请求 GetBookListRequest_XML 返回的结果中,id 为 1234 的 book 的 price 为 29.0, response 参见 代码清单 2。
点击 TestCase 的添加 Assertions 按钮,如 图 4所示。 在弹出的 Select Assertion 窗口中选择 XPath Match 断言,点击 OK。配置 XPath 如下图所示:
图 6. 使用 XPATH 测试 XML 格式的书籍列表
在 XPath Expression 面板中书写用于匹配 Response 的 XPath 表达式,Expected Result 面板中填写期望的值。soapUI 将使用 XPath Expression 面板中填写的 XPath 表达式与 Service 调用结果匹配, 将匹配结果与期望值比较,如果相同则测试通过,否则失败。
2. 使用 Script Assertion 测试请求 GetBookListRequest_JSON 返回的结果,response 参见 代码清单 1。
Assertion 添加过程与 XPath Match 类似,在 Select Assertion 窗口中选择 Script Assertion,并在之后弹出的 Script Assertion 窗口中书写如下代码:
清单 5. 使用 Script Assertion 测试 JSON 格式的书籍列表
//assert the response header
assert messageExchange.responseHeaders["Content-Type"]=="application/json;charset=UTF-8";
assert messageExchange.responseHeaders["Cache-Control"] == "no-cache";
//assert the repsonse body
def booksRoot = net.sf.json.JSONSerializer.toJSON(messageExchange.responseContent);
def books = booksRoot.get("books");
//assert book detail
assert books.get("book").get("id") == "1234";
assert books.get("book").get("name") == "book1";
assert books.get("book").get("price") == 29;
3. 使用 Property 测试请求 GetBookRequest_JSON 返回的结果, response 参见 代码清单 3。
在 Script Assertion 窗口中写入如下代码:
清单 6. 使用 Property 测试 JSON 格式的书籍详情
//get property
def expectedID = context.expand('${#Project#book.id}');
def expectedName =context.expand('${#Project#book.name}');
//assert the response header
assert messageExchange.responseHeaders["Cache-Control"] == "no-cache";
//assert the response body
def bookRoot = net.sf.json.JSONSerializer.toJSON(messageExchange.responseContent);
assert bookRoot.get("id") == expectedID;
assert bookRoot.get("name") == expectedName;
assert bookRoot.get("price") == 29.0;
上述使用 Groovy Script 对 Service 调用结果进行验证,可用的 soapUI 对象包括 :messageExchange, context 以及 log。
messageExchange: 当前交互 request/response 的 MessageExchange,可以用来直接访问 message content, HTTP Headers,Attachment 等对象。
context: 运行当前 TestCase 的 TestRunContext 对象,具体使用方式请参见 soapUI API 文档。
log: 一个标准的 Log4j Logger 对象,可以用来输出日志。
依照上述步骤定义好 TestCase 并添加适当的断言之后,就可以对在线书店 REST 服务进行测试。双击 BookStoreSerive_TestSuite, 点击 Run 按钮来运行所有的 TestCase,结果如下图所示:
图 7. 运行测试用例
--------------------------------------------------------------------------------
回页首
性能测试
性能测试在 soapUI 中称为 Load Test, 针对一个 soapUI 的 TestCase, 可以建立一个或多个 LoadTest, 这些 LoadTest 会自动的 把 TestCase 中的所有步骤都添加到其中, 在运行的时候,soapUI 会自动的使用多个线程来运行这些 TestStep,同时也会监控 它们的运行时间, 例如最短时间,最长时间,平均时间等等。这样用户能够很直观的看到 REST 服务的响应时间,从而对性能进行调优。
建立 LoadTest 非常简单,只需要在“Load Tests”上点击右键, 选择"New LoadTest", 然后输入名称即可,下图是一个针对 GetBookList 的 性能测试, 可以看到有两个 TestStep : "GetBookList_xml" 和"GetBookList_json" , 100 个线程并发执行, 时间限制是 60 秒。 最后的结果是,最短时间 4 毫秒,最长时间 1204 毫秒,平均时间 20.54 毫秒。
图 8. 性能测试
性能测试还支持断言,用户可以对一个 TestStep 或 TestCase 设置运行时间要求,例如平均时间大于 2 秒就认为失败,点击 图 8 中中的 “LoadTest Assertions”就可以设置。 当然根据需要,用户也可以编写脚本来做一些准备工作,或者清除工作。 参见 图 8 中的"Setup Script"和“TearDown Script”。
与 BuildForge 集成
测试可以有效的保证代码的质量,但是仅仅手工的、在本机上运行的 REST 服务测试时远远不够的。实际上把测试作为软件构建的一部分,加入到持续集成中去是一个常见的敏捷开发实践,通过频繁的,自动化的测试, 可以更有效的发现缺陷,保证代码质量。
IBM Rational BuildForge 是一个管理软件构建和发布的平台 , 它提供了一个框架来自动化整个构建流程,不仅仅自动化单独的任务,可以集成多种用户现有的脚本和工具,最大限度的保护用户投资。作为一个框架,BuildForge 几乎可以调用操作系统上的任何脚本。本文重点不在介绍 BuildForge, 假定读者对 BuildForge 已经比较熟悉, 不熟悉的读者可以查看参考资料中的相关文章。
对于 soapUI 来说,最简单的一种集成方式就是提供命令行脚本让 BuildForge 调用。在上文中我们已经展示了通过 soapUI 的 GUI 运行 TestCase 的功能,那么 soapUI 可不可以通过命令行完成类似的功能呢? 答案是肯定的。
soapUI 提供了一个命令行工具 testrunner.bat 来运行一个项目中的 TestSuite, 可以在 <soap_ui_home>/bin 下找到它, 它的使用非常简单,只需要设置下面的几个常用参数即可:
-s 指定要运行的 TestSuite
-f 指定运行结果的输出目录
-j 生成 junit 风格的 report
-r 运行完成以后打印一个简单的 summary
下面这行命令就是运行 bookstore.xml 这个 soapUI 项目中的 BookstoreTestSuite, 把结果输出到 c:\temp\reports 中。
testrunner.bat -sBookstoreTestSuite -r -j C:\developerWorks\soapui\bookstore.xml -f c:\temp\reports
有了 testrunner,把 soapUI 的测试集成到 BuildForge 中就很简单了,只需要在 BuildForge 的项目中添加一个步骤,参见下图:
图 9. BuildForge 中使用 testrunner
--------------------------------------------------------------------------------
回页首
总结
从上文可以看出,soapUI 是一款强大的 Web 服务测试工具 , 它提供了便利的 GUI 界面帮助用户对 REST 服务进行快速的测试,使用简单,学习成本很低。 它也提供了可编程能力例如变量,Groovy 脚本等, 以便让用户应对一些复杂的情况。 总而言之,有效的实际项目中使用 soapUI,可以极大的减轻工作量,提供工作效率。当然作为开源的工具, soapUI 仍然在不断的发展完善过程中,本文所能介绍的也只是它的部分功能, 感兴趣的读者可以到 soapUI 网站上获取更多资料。
--------------------------------------------------------------------------------
回页首
下载
描述 名字 大小 下载方法
本文用到的在线书店应用程序 bookstore.zip 12KB HTTP
本文用到的 soapUI 项目 bookstore-soapui-project.zip 3KB HTTP
关于下载方法的信息
参考资料
参与论坛讨论。
REST 百科:介绍了 REST 的基本概念,主要目标,核心原则以及 REST 示例。
XPATH 入门:介绍了 XPATH 的概念、术语、位置路径、表达式以及函数库等 XPATH 相关知识。
Groovy 主页:为 Groovy 新手准备了大量的参考资料。
soapUI 站点:soapUI 的英文站点,包含 soapUI 的基本功能介绍以及大量参考资料。
利用 IBM Rational Build Forge 完善构建过程(developerWorks 中国,2008 年 1 月):介绍了如何利用 BuildForge 创建一个持续构建和集成的环境。 很不错的东东 学习了
页:
[1]