接口报params province error_Python3+requests搭建接口自动化测试框架

01

接口自动化的意义(为什么做这个框架?)

d762188212d83fee87d6b3de46388b10.png 6325a3a9bf1499576ce4a5ae6bd1e60d.png

新版本上线时之前版本的功能需要进行回归测试,导致大量的重复性手工测试。

引入自动化测试可以使用自动化技术代替部分手工的回归性测试,解放更多人力做其它更有必要的事情。

但目前项目UI变动频繁,而接口一般不会做大变动所以先暂时做接口自动化。使用接口自动化可以做上线前接口功能的回归性测试,也可以定时巡检线上环境接口的运行情况,能及时发现线上环境接口问题并解决。

同时此框架可以帮助不会写代码的测试同事进行接口自动化的相关工作。

02

准备工作

7d23662f3f3cc6b5e96a02ebe974192f.png a927fbd6c217fed483172c48b9228542.png

开发语言:Python3

需要安装的模块:

Requests:python的一个HTTP客户端库,和urllib、urllib2类似。

1、安装方法

1.1 使用pip安装

pip install Requests

或 

python3 -m pip install Requests

1.2 下载源码后安装

git clone git://github.com/kennethreitz/requests.gitcd requestspython setup.py install

2、学习路径:

http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

xlsxwriter :是python用来构造xlsx文件的模块,可以完成xlsx文件的自动化构造,包括:合并单元格,制作excel图表等功能。

2.1 安装方法:

使用pip安装

pip install Requests

或 

python3 -m pip install Requests

2.2 学习路径:

http://maoyao.blog.51cto.com/8253780/1772102

03

框架流程及逻辑

4462a6a1e70d1bd8d697e9045b07a03c.png 6a26a0f29e54bf071b68c0b329fe28e1.png

框架理念:使用json文件编写测试用例,建一个脚本循环读取测试用例并执行,然后对比返回的接口和用例中的期望结果。

将测试结果写入到一个excel表格中生成测试报告,最后使用发送邮件功能将测试报告发送到指定邮箱。

其中对所有公共方法进行封装并放在common公共文件目录下。      

02d758b4819e1ca3d08615c2530b8b41.png

04

各模块实现

4bd1c7102a08b01ff234ccdd54d26825.png 25913d684b31dfd072c71f92c7f01635.png

801a2704eaa3fc49f4a3209a6e216ac1.png

----interface_test                             项目文件夹目录    ----common                                存放公共方法目录            ----__init__.py                    初始化文件            ----conf.py                          操作配置文件相关方法            ----excelaction.py                Excel文件相关操作方法            ----jsonaction.py                 Json文件相关操作方法            ----logger.py                       记录日志的相关方法            ----newfile.py                      获取最新文件的相关方法            ----sendmail.py                   发送报告到指定邮箱的相关方法            ----signture.py                    对数据进行签名的相关方法            ----userinfo.py                    获取用户信息的相关方法            ----config_test.conf             基本配置文件    ----logs                                       存放日志的目录    ----report                                    存放测试报告的目录    ----test_data                                存放测试用例数据的目录            ----login-1.json                    登录接口的测试用例数据            ----logout-2.json                  退出登录接口的测试用例数据    ----execute_test.py                       读取测试用例并执行测试用例    ----test.bat                                    运行测试项目的批处理文件

execute_test.py 主要程序

# -*- coding: utf-8 -*-#!/usr/bin/env pythonimport osimport jsonimport requestsimport common.conf as confimport common.excelaction as excelactionfrom common.sendemail import sendreportfrom common.signture import signimport common.userinfo as userinfoimport common.logger as loggerimport sysimport time#data_path = os.path.dirname(__file__) + '\\test_data\\' # 测试用例数据文件所在目录data_path = conf.testdata_pathtest_reports = [] # 添加一个数组用来存储测试结果for file in os.listdir(data_path): # 循环读取目录下的文件    child = os.path.join('%s%s'%(data_path,file)) # 将文件名和路径拼接好    logger.info("当前打开的文件:"+child)    fl = open(child) # 打开文件    try:        cases = json.load(fl)        for key in cases: # 循环读取文件中的测试用例(case)            start_time = time.clock()            case = cases[key]            url = conf.get_conf('module',case['module']) + case['url']            data = case['data']            data['Platform'] = conf.get_conf('params','Platform')            data['Terminal'] = conf.get_conf('params','Terminal')            data['UserIP'] = conf.get_conf('params','UserIP')            data['Version'] = conf.get_conf('params','Version')            if "UserToken" in data and data['UserToken'] == '':                data['UserToken'] = userinfo.get_token()            hope_result = case['assert']            method = case['method']            test_report = {                "case_id":case['id'],                "t_name":case['name'],                "method":method,                "url":url,                "params":data,                "hope_result":hope_result,                "actual_result":[],                "test_result":""            }            try:                if method == 'post':                    addsign_data = sign(data,conf.get_conf('sign','api_key'))                    r = requests.post(url,data=json.dumps(addsign_data),headers=conf.header)                    response = r.json()                    s = True                    for k in hope_result:                        ar = str(k) + ":" + str(response[k])                        test_report["actual_result"].append(ar)                        if type(hope_result[k]) == type(''):                            if hope_result[k] in response[k]:                                s = s&True                            else:                                s = s&False                        else:                            if hope_result[k] == response[k]:                                s = s&True                            else:                                s = s&False                    if s:                        test_report["test_result"] = "PASS"                    else:                        test_report["test_result"] = "Fail"                elif method == 'get':                    addsign_data = sign(data,conf.get_conf('sign','api_key'))                    r = requests.get(url,params=addsign_data,headers=conf.header)                    response = r.json()                    s = True                    for k in hope_result:                        ar = str(k) + ":" + str(response[k])                        test_report["actual_result"].append(ar)                        if type(hope_result[k]) == type(''):                            if hope_result[k] in response[k]:                                s = s&True                            else:                                s = s&False                        else:                            if hope_result[k] == response[k]:                                s = s&True                            else:                                s = s&False                    if s:                        test_report["test_result"] = "PASS"                    else:                        test_report["test_result"] = "Fail"                else:                    print(u'暂不支持该请求方式')                test_reports.append(test_report)                end_time = time.clock()                str_time = '当前执行的用例:' + key + '_'*4 + '用例执行所用时间:' + str(end_time-                                                                                                    start_time) + 's'                logger.info(str_time)            except:                error_msg = sys.exc_info()                logger.error(error_msg)                continue    except:        error_msg = sys.exc_info()        logger.error(error_msg)        continueexcelaction.creat_report(test_reports) #生成测试报告sendreport() #发送测试报告

05

具体使用

d762188212d83fee87d6b3de46388b10.png 6325a3a9bf1499576ce4a5ae6bd1e60d.png

1、在配置文件做对应项目的基础配置

[email] -- 邮箱相关配置

sender = ***@163.com -- 发件邮箱

receiver = ***@163.com -- 收件邮箱

smtpserver = smtp.163.com -- 发件邮箱服务器

username = ***@163.com -- 发件邮箱账户名

password = **** -- 发件邮箱密码(用于第三方登录的秘密)

[module] -- 模块相关接口域名配置

passport = http://passport.XXX.com/ -- 对应模块接口域名

[sign] -- 签名相关的配置

api_key = XXX-XXX -- 生成签名的key(填写项目对应的key)

[params] -- 接口参数配置(配置公共参数)

Platform = 1 -- 根据对应项目配置对应的公共参数和对应值

2、在test_data文件夹内用json文件写测试用例和对应参数 

"case1":{    "name":"登录接口_测试正常登录",        -- 接口名称(或者接口简介)    "module":"passport",                -- 接口所属模块    "url":"/api/Passport/Login",            -- 接口地址(完整地址由模块对应域名+该地址拼接)      "method":"post",                    -- 接口请求方式      "id":"1-001",                        -- 用例ID    "data":{                            -- 接口请求参数(请求时由该参数加公共参数)        "UserName":"XXX",                -- 接口请求参数(根据具体接口补充,如果接口需要token则需要加token关键字(值为空就行),接口请求时会自动根据参数生成Sign,如果想自己定义则需要加Sign关键字(值填写自己定义的))        },    "assert":{                            -- 该条测试用例的断言条件        "Status":200,                    -- 具体的断言条件,需要返回状态为200        "Message":"登录成功"            -- 具体的断言条件        }    }

3、配置好基础配置和编写完测试用例后,运行项目中的test.bat文件。运行完成后会在report文件夹内生成测试报告文件,在logs文件夹内会生成测试运行过程中的记录日志和报错日志(如果有)。

   - end -  

4ee01bebc0725886afce6b727e3065ed.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值