接口相关

接口自动化测试

2019-07-30  本文已影响0人  老张_Jason

自动化测试

1、什么的项目适合做自动化——(项目组讨论决定)

2、自动化分类

python/java+requests+unittest框架来实现

​ python/java+RF(RobotFramework)框架来实现——对于编程要求不高

python/java+selenium+unittest框架来实现

​ python/java+RFS(RobotFrameWork+Selenium)框架来实现——对于编程要求不高

python/java+appnium+unittest框架来实现**

​ python/java+RF(RobotFramework)框架来实现——对于编程要求不高

3、接口自动化与Web自动化的区别

​ 1、接口自动化是没有界面的,不需要对界面元素定位操作,不需要考虑界面延迟的问题,执行效率更高

​ 2、接口自动化用的是requests测试库,Web自动化用的selenium测试库

​ 3、接口自动化的覆盖率可以达到100%(绝大部分的接口都可以实现自动化)
Web自动化的覆盖率能达到80-90%算OK(可能会有某些功能是没办法实现自动化的)

4、怎么做接口自动化

4.1、流程

​ a. 确定业务范围,哪些业务功能的接口可以做自动化——接口自动化的覆盖率可以达到100%

​ b. 时间进度安排,人员分配

​ c. 确定自动化测试框架

​ d. 准备数据——准备接口用例数据

​ e. 编写接口自动化脚本

4.2、搭建接口自动化测试环境

​ 1、安装python3.x——配置python的环境变量

​ 2、安装PyCharm工具——python开发工具

​ 3、安装测试库

requests库—— 提供了丰富的用来发请求,对请求进行处理的API函数

xlrd,xlwt库**—— 提供了对Excel文件进行操作的API函数

pymysql库—— 提供了对Mysql数据库进行操作的API函数

paramsunittest库—— 实现参数化的库

json库—— 提供了对Json格式的数据进行操作的API函数(python自带的基础库)

re库—— 可以使用这个库中的API函数对HMTL数据进行操作

image.png

4.3、准备数据——准备接口用例数据

我们把接口用例数据放入在Excel表格中,因为每一个接口都包含:请求地址,请求方式,请求参数,以及响应数据;所以在Excel表格中按照以下方式来组织我们的接口用例数据,包含以下几个内容:

  • 用例名称,请求地址,请求方式,请求头,请求参数,预期结果(断言)

然后我们会封装一个函数去读取Excel数据,以参数的形式传递到脚本中,具体操作步骤如下:

4.4、编写自动化测试脚本

1、步骤
import requests
url = 'http://localhost/fw/index.php?ctl=user&act=dologin&fhash=hbUjHVrQIgHkwdMdNGnPrSiIkVBeWcrOvJpmsXgyNuMewKfKGy'
par = {   
         'email': 'jason',   
         'user_pwd': 'TWlKaGRrRFJrQXJZZlFXYkh5WlNQZ2tpZkFZQlVlUUhyRE5SdndSUGdKanFDTG1LYUYlMjV1NjVCOSUyNXU3RUY0emdwMTIzNDU2JTI1dThGNkYlMjV1NEVGNg==',    
        'auto_login': 0,   
        'ajax': 1
}
res = requests.post(url, data=par)
res = requests.get(url,params=par)
1、提取响应*body*内容**
    ​res.text                      —— 如果返回的是html格式的数据,使用res.text提取`
    ​res.json()                 —— 如果后台返回的是json格式的数据,则使用这个API函数来提取`
2、提取响应头***
    ​res.headers
3、提取状态码,响应信息***
    ​res.status_code
    ​res.reason
4、提取cookie值
    ​res.cookies()
2、传递请求头
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0',
    'Accept': 'application/xml',
}

res = requests.post(url,data=par,headers=header)    
3、传递cookie,token值
header = {
    'Cookie': 'PHPSESSID=3724b412550a557825da5528dd6198c6'                  
}
res = requests.post(url,data=par,***headers=heade***r,allow_redirects=False) 
import requests
#1. 登录,获取cookie值
def getCookie():
    url = 'http://localhost/fw/index.php?ctl=user&act=dologin&fhash=hbUjHVrQIgHkwdMdNGnPrSiIkVBeWcrOvJpmsXgyNuMewKfKGy'
    par = {
        'email': 'jason',
        'user_pwd': 'TWlKaGRrRFJrQXJZZlFXYkh5WlNQZ2tpZkFZQlVlUUhyRE5SdndSUGdKanFDTG1LYUYlMjV1NjVCOSUyNXU3RUY0emdwMTIzNDU2JTI1dThGNkYlMjV1NEVGNg==',
        'auto_login': 0,
        'ajax': 1
    }

    res = requests.post(url, data=par)
    return res.cookies

#2. 调用充值接口
#2.1 获取cookie值
cookie = getCookie()

#2.2 发充值请求
url = 'http://localhost/fw/member.php?ctl=uc_money&act=incharge_done'
par = {
    'check_ol_bl_pay':'on',
    'money':1000,
    'bank_id':0,
    'memo':234567890,
    'payment':5,
}

#发充值请求
res1 = requests.post(url,data=par,cookies=cookie,allow_redirects=False)            # 自动重定向的,可以取消自动重定向
print(res1.status_code)
print(res1.reason)
print(res1.headers)
import requests

#1. 发登录请求
url = 'http://localhost/fw/index.php?ctl=user&act=dologin&fhash=hbUjHVrQIgHkwdMdNGnPrSiIkVBeWcrOvJpmsXgyNuMewKfKGy'
par = {
    'email': 'jason',
    'user_pwd': 'TWlKaGRrRFJrQXJZZlFXYkh5WlNQZ2tpZkFZQlVlUUhyRE5SdndSUGdKanFDTG1LYUYlMjV1NjVCOSUyNXU3RUY0emdwMTIzNDU2JTI1dThGNkYlMjV1NEVGNg==',
    'auto_login': 0,
    'ajax': 1
}
#创建一个seesion对象,后期使用这个session对象来发请求
ses = requests.session()
#发登录请求,返回的cookie值会自动化保存到session对象中
response1 = ses.post(url,data=par)

#2. 发充值请求
url = 'http://localhost/fw/member.php?ctl=uc_money&act=incharge_done'
par = {
    'check_ol_bl_pay':'on',
    'money':1000,
    'bank_id':0,
    'memo':234567890,
    'payment':5,
}
response2 = ses.post(url,data=par,allow_redirects=False)
print(response2.headers)

4.5、工程管理维护与优化

1、数据驱动——实现接口用例数据与脚本的分离

​ 我们把接口用例数据放入在Excel表格中,因为每一个接口都包含:请求地址,请求方式,请求参数,以及响应数据;所以在Excel表格中按照以下方式来组织我们的接口用例数据,包含以下几个内容:

​ 用例名称,请求地址,请求方式,请求头,请求参数,预期结果(断言)

​ 然后我们会封装一个函数去读取Excel数据,以参数的形式传递到脚本中,具体操作步骤如下:

    pip install xlrd
#封装一个读取Excel表格数据的函数
#对Excel表格数据的读取需要用到一个库——xlrd库
import xlrd
def get_data(filename,sheetname):
    #1. 打开Excel文件
    workbook = xlrd.open_workbook(filename)
    
    #2. 打开Excel文件中的某张表
    sheet = workbook.sheet_by_name(sheetname)
    
    #3. 读取表中的内容
    list = []
    for i in range(1,sheet.nrows):
        data = sheet.row_values(i)
        list.append(data)
    
    return list

if __name__=='__main__':
    result = get_data('D:\\JMeter\\1947_Project\\cxy-project02\\data\\接口用例数据.xls','登录')
    print(result)

[图片上传失败...(image-faf8fa-1564476975736)]

工程问题:

1、没有安装xlrd

2、没有把xlrd导入工程

2、unittest框架
#1. 导包
import time
import unittest
import requests
from common.excelUtils import get_data
import paramunittest

#读取excel表格中的数据
list = get_data('D:\\JMeter\\1947_Project\\cxy-project02\\data\\接口用例数据.xls','登录')

#2. 定义一个类,去继承unittest.TestCase
@paramunittest.parametrized(*list)                  # 引用list中的所有数据
class FwLogin(unittest.TestCase):
    def setParameters(self,case_name,url,method,headers,params,assert_info):
        '''
        有多少条用例,这个函数就会执行多少次,每执行一条用例之前先会执行这个函数,把数据提取出来。
        :param case_name:
        :param url:
        :param method:
        :param headers:
        :param params:
        :param assert_info:
        :return:
        '''
        self.case_name = str(case_name)
        self.url = str(url)
        self.method = str(method)
        self.headers = str(headers)
        self.params = str(params)
        self.assert_info = str(assert_info)

    #1. 实现一个用例方法
    def test_login_case(self):
        time.sleep(5)
        #1. 组织参数
        self.headers= eval(self.headers)                # 将字符串转化为字典
        self.params = eval(self.params)

        #2. 发请求
        if self.method == 'POST':
            response = requests.post(self.url,data=self.params,headers=self.headers)
        else:
            response = requests.get(self.url,params=self.params,headers=self.headers)

        #3. 检查,断言
        self.check_result(response)

    def check_result(self,response):
        '''
        断言  检查结果的
        :param response:
        :return:
        '''
        self.assert_info = eval(self.assert_info)           #预期结果

        try:
            self.assertEqual(response.status_code,200,'响应状态码错误')
            self.assertEqual(response.reason,'OK','响应的响应码错误')
            self.assertDictEqual(response.json(),self.assert_info,'响应的正文内容不一致!')
            print('%s测试用例通过!' %self.case_name)
        except AssertionError as e:
            print('%s测试用例不通过!%s' %(self.case_name,e))

if __name__ == '__main__':
    unittest.main()
上一篇下一篇

猜你喜欢

热点阅读