(一)测试背景概述
到新公司入职后接受一个项目的测试任务,项目结构大致是:
即产品1和产品2为待测试对象,抽象出来可以归结为【http json协议接口测试】与【http web功能测试】。
其中【http web功能测试】针对未曾接触的一种数据库,还包含了大量数据库和SQL级别的专有操作测试内容,此处不予讨论。
测试对象无论是由C/C++还是Java还是JS/Html实现,对于协议测试和功能测试(白盒测试和单元测试另当别论),都不需要深入了解该语言,熟悉任一种高级语言(最好还有一种脚本语言)+自动化思维意识 +快速学习能力,完全能实施测试自动化策略。
网上查了一下:
JSON(JavascriptObjectNotation)是一种轻量级的数据交换语言,以文字为基础,且易于让人阅读。常应用于http通信和数据传输,应用如Apache开源搜索引擎ElasticSearch等。
JSON建构有两种结构:
1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组(associative array)。
2.值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
* Linux C/C++单元测试和覆盖率统计参见:http://blog.csdn.net/w565911788/article/details/7617099
即使对上面一无所知,先来分析一下【http json协议接口】的特点。
(二)测试需求分析
1. Web页面(即产品2)HTTP请求数据包(post/put)格式如:
POST 'http://home/cm_api' -d
'{"task":"login",
"token":"ae873897a0a9a2afb9bb12a49c4237744a82ea77049df67c9b58d7acc5c0c7527926f07dd201b6aa",
"id":"admin","password":“123456",
"clientver":"8.4"} '
POST 'http://home/cm_api' -d
'{"task":"startinfo",
"token":"ae873897a0a9a2af11077f40cf303d7406ec4d40b90b3a041b8a4edfd63d0fbe7926f07dd201b6aa"}'
2. Web Service(即产品1)响应数据包格式,除以下其余未知:
(1)格式错误,不响应;(http json协议层判定)
(2) token(每个用户每次登录时取得,唯一)错误或者连接、数据库等其他问题,响应 status: failure
(3)token正确,其他正确,响应 status: success
如:
{ "__EXEC_TIME" : "1 ms", "note" : "none",
"status" : "success",
"task" : "authenticate",
“token” : “ae873897a0a9a2afdb676eefe4e864e2b0e3abb07cd73cf0944e77d6c792b1aa7926f07dd201b6aa”}
--登录成功,响应 status: success,并取得token值
{ "note" : "Request is rejected due to invalid token. Please reconnect.",
"status" : "failure",
“task” : “startinfo”}
--token错误,响应 status: failure
3. 接口会扩展,增加或改变(数百个)。
4. 几乎所有接口有严格执行顺序(如顺序执行:login-> optimized->stopdb->logout),login成功获取该用户本次动态token,后面每个接口请求包使用此token。动态token,即测试数据和结果都不是固定的,故Fitnesse等一些接口测试工具难以实现。
5. 用例中可含自定义的任意参数变量,如针对Linux:$DBNAME=/home/DBNAME,$DBNAME_DATABASES =/home/DBNAME /databases ,…;Windows:$DBNAME=C:\DBNAME, $DBNAME_DATABASES =C:\DBNAME \databases ,…
6. 成本1(=不熟悉à找测试工具à学习测试工具à执行测试) >成本2(=自己花部分时间写个测试程序或工具[灵活可控:生成自定义测试用例和判定结果、报告])
7. 最后解决方案确定:自己花部分时间写个测试程序或工具[灵活可控:生成自定义测试用例和判定结果、报告]
(三)设计和技术细节准备
1. 测试用例和测试结果生成,我希望按以下数据格式生成文件,固定分隔符分割(便于excel打开),token错误响应 status: failure则Pass,token正确响应status: success则Pass,Fail的记录status手工核查(扩展:每条接口用例设定一个字段表示期望值,检查收到期望值则Pass,收不到则Fail)。
Case-ID:CMS-145
Interface Name:updateattribute
Preconditions:correct token: ae873897a0a9a2afd540113d7e03001469caacde0c9322491cd95e57cef94f427926f07dd201b6aa
Step:curl -POST 'http://home/cm_api' -d '{"task":"updateattribute","token":"ae873897a0a9a2afd540113d7e03001469caacde0c9322491cd95e57cef94f427926f07dd201b6aa","dbname":"demodb","classname":"athlete"}'
Result:{ "__EXEC_TIME" : "11 ms", "note" : "Failed to connect to database server, 'demodb', on the following host(s): localhost:localhost", "status" : "failure", "task" : "updateattribute"}
P/F:F
Remark:status: "failure"
2. 测试输入数据(开发维护):
数据包文件列表(根据接口名字命名,增加一个接口相应增加一个)
接口顺序文件json_list(接口名的执行顺序列表,根据此文件中接口顺序执行)
3. 动态token获取:
longin 响应保存tokenà读取jsonlist保存列表à根据jsonlist顺序读取对应接口名数据包文件,并替换token字段值à请求和响应à检查响应结果的状态和其他内容(断言)
4. 两种方式实现(C#):
― 方式一:封装开源Ssh库登录一台Linux调用Curl命令,记录整个过程并分析处理,生成测试用例和测试结果文件,人工查看和整理。(涉及平台环节更多,更锻炼。)
― 方式二:利用.Net丰富的Web类库和其他库文件实现。
(更简单,技术积累熟练程度,时间分钟级到小时级即可完成。)
(四)开发实施和自测
1. SSH方式远程登录Linux
2. 执行流程举例
3. 保存正确的token值
4. 几个读写文件流
5. 顺序读取、拼接、发送、接收、判断处理、记录
6. 配置参数项:json请求地址、cci请求地址、自定义参数变量(变长)、用例路径、是否循环(长时间稳定性测试)
(五)结果演示
1. 执行效果(可配置循环长时间测试)
2. 输入输出生成结果
3. 【新版本检测-->新版本部署-->执行测试工具】
【整理查看测试结果-->校验Fail问题-->提交bug】
― 其中,“新版本检测à新版本部署à执行测试工具”流程可以通过一些测试框架(如staf/stax,或其他,或自己灵活开发定制等)实现全自动(包括版本通知和测试结果通知),可实现手工时间集中到“整理查看测试结果à校验Fail问题à提交bug”流程。
附:通用自动化测试工具效果
1. 主体框架实现特定功能,高级语言完成,并开放大量实用API,且不断增加和完善
2. 嵌套或封装一种或多种脚本语言解析器,能够动态执行测试用例脚本,对Windows窗体、Web、代码、接口、协议或性能等若干方面进行测试(扩展:录制功能)
3. 流程完善,能够准确高效的解放人力和深入测试,手工尽可能少的参与或专注于测试用例脚本工作
4. 可扩展性强,能够远程操控多个多种平台(分布集群,通过网络通信、协议通信等),能够并行调度执行,可配置可存储,资源共享方便
5. 自动化框架工作:检测新的版本à下载、编译、批量部署à调用指定测试脚本执行测试à邮件或消息通知QA测试结果报告路径和发现的bug。
6. 手工工作:编写修改测试脚本并上传、收邮件校验bug、喝咖啡。