依赖第三方数据的接口如何进行测试--mock
标准答案 是mock
有mock平台,写入参,请求返回你要的结果
这个需要自己去搭建一个mock服务、模拟接口返回数据
mock是一个开源的框架,在github上可以下载到。
mock可以用在单元测试过程中,还有一个用途,当前端开发在开发页面的时候,需要服务端提供API接口,此时服务端还没开发完成,或者说没搭建测试环境,这时候前端开发会自己mock一个api服务端,自己给自己提供调用接口的返回数据。
在手工接口测试或者自动化接口测试过程中,上下游接口有数据依赖如何处理?
用一个全局变量来处理依赖的数据,比如登录后返回token,其他接口都需要这个token,那就用全局变量来传token参数
global
下个接口请求参数依赖上个接口的返回数据?
不同的接口封装成不同的函数或方法,需要的数据return出来,用一个中间变量a去接收。后面的接口传a就可以了。
测试数据放哪里?
测试的数据分很多种,千万不能说写在代码里,因为数据是不能写死在代码里的。
测试数据放到.py文件的开头,对于少量的,固定不变的数据是可以的。
测试数据存放总结:
① 对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机函数生成
② 对于一个接口有多组测试的参数,可以参数化,数据放yaml,text,json,execl等都可以
③ 对于反复使用的数据,如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后再清理
④ 对于邮箱配置的一些参数,可以用ini配置文件
⑤ 对于全部是独立的接口项目,可以用数据驱动方式,用execl/csv管理测试的接口数据
⑥ 对于账号密码,这种管全局的参数,可以用命令行参数,单独抽出来,卸载i配置里(如ini)
⑦ 对于少量的静态数据,比如一个接口的测试数据,也就2-3组,可以写到python脚本的开头,十年八年都不会变更的。
例子
class Scene_Demo_Scene1 extends Scene_Framework_SceneBase//场景类继承了框架类
{
//指定请求的uri信息
protected $strUrl = '/demo/submodule/scene1';
//指定请求的地址,统一在配置文件中定义,Conf_Demo_Server类的定义参见conf/demo/Server.php的实现介绍
protected $strHost = Conf_Demo_Server::HOST;
//设置请求方式及其他自定义请求参数
protected $arrOptData = array(
'httpMethod' => 'POST',
);
//场景默认请求参数设置,如果在case中设置了参数值,则以case中的为准,覆盖默认值
protected $sceneTemplateData = array(
'param1' => 'param1_default_value',
'param2' => 'param2_default_value',
'param3' => 'param3_default_value',
);
//scene维度默认的校验值,优先级最低,如果某个scene在不同case中assert值基本不变的话,用这个可以让case更简洁,case中的assert会覆盖掉scene中的
protected $sceneTemplateAssertData = array(
'response' => array(
//***编写默认公共校验项***
),
'db' => array(
//***编写默认公共校验项***
),
);
//设置返回结果需要过滤的参数
protected $skipData = array(
''
);
//默认不需要在这里设置isWrite,用于static校验模式时scene的校验点(response或DB,redis结果)发生变更时使用的后门,减少修改case和预期结果的成本。
//当scene维度的isWrite是true时,优先级最高;是false时无效。这样当scene结果有改动时,不论用到这个scene的case本身isWrite是开是关,都会写
//protected $isWrite = true;
}
<?php
/**
* Created by PhpStorm.
* User: guomengmeng_dxm
* Date: 2019/6/4
* Time: 23:26
*/
class Case_Demo_Scene1 extends Case_Framework_TestCase
{
public static function getCaseList()
{
return array(
//common(可选)中定义了case的基准信息,具体的case可以在common基础上修改实现,common下定义的内容不会作为一条case执行,需要单独指定一条case来跟common进行merge
'common' => array(
'info' => array(
'author' => 'guomengmeng_dxm',
'module' => 'demo/submodule/scene1',
'description' => '文本描述,详细描述这个case的测试点',
'priority' => '0',//可设置为0,1,2,3,对应P0,P1,P2,P3
'zcasepath'=>'',//zcase上的treeid
'caseid'=>'',//文本用例id
),
'stepList' => array(
'0' => array(
'sceneName' => 'Scene_Demo_Scene1',//使用的场景类名
'params' => array(//params为请求参数关键字
'param1' => 'param1_default_value',//设置参数的默认取值,如果跟scene中的$sceneTemplateData设置的内容一致,此处可以省略,如有差异,可在此处定义覆盖
'param2' => 'param2_default_value',
'param3' => 'param3_default_value',
),
'assert' => array(//assert为校验的关键字
'response' => array(//response为校验接口返回的关键字
'errno' => '0',//设置默认返回结果
'errmsg' => 'ok',
),
),
),
),
),
//使用common模板用例,直接生成一条case
'CASE001' => array(),
//下面为一个在common用例基础上修改的测试用例
'CASE002' => array( //THIS_IS_SCENE1_UNIQUE_CASE_NAME
'info' => array(
// 'author' => 'guomengmeng_dxm',
// 'module' => 'demo/submodule/scene1',
'description' => '文本描述,验证入参为XX的场景下,接口处理返回0的情况',
'priority' => '0',//可设置为0,1,2,3,对应P0,P1,P2,P3