zoukankan      html  css  js  c++  java
  • 关于登录模块与我的商铺关联的接口测试自动化

    新建一个config包,下面新建一个config.py文件

    #-*- coding: utf-8 -*-
    #@File     : configs.py
    #@Time     : 2020/10/1 8:22
    #@Author   :xintian
    #@Email    :1442987166@qq.com
    #@Software :PyCharm
    HOST='http://121.41.14.39:8082'  #ip配置

    新建一个lib包,下面新建一个apilib包,再新建一个login_j.py文件

    import hashlib
    import requests
    import json
    from configs.config import HOST
    def get_md5(psw):
        md5= hashlib.md5()   #实例化对象
        md5.update(psw.encode('utf-8'))   #进行加密操作
        return md5.hexdigest()       #拿到加密字符串,返回的是十六进制
    #实现token登录
    class Login():
        def login(self,inData,getToken=True):  #实例方法---可以直接接收json字符串
            url=f"{HOST}/account/sLogin"    #路径
            inData=json.loads(inData)   #json转化为字典
            inData["password"]=get_md5(inData["password"])
            payload = inData
            resp=requests.post(url,params=payload)
            if getToken:  #获取token模式
                return resp.json()['data']['token']
            else:  #获取响应数据--返回值--字典格式
                return resp.json()
    if __name__ == '__main__':
        # 这里必须符合json格式,所以必须键和值双引号
        print(Login().login('''{"username":"sq0129","password":"18792733468wj"}'''))
        #print(Login.login('''{"username":"sq0129","password":"18792733468wj"}''',getToken=False))
        #注意事项:inData='''{"username":"sq0001","password":"123456"}'''  必须是json格式,不然不能使用
        #json.loads(inData)会报错

    在上面的apilib包下面,再新建一个myShop.py文件

    #-*- coding: utf-8 -*-
    #@File     : myShop.py
    #@Time     : 2020/10/5 9:40
    #@Author   : xianyu
    #@Email    : 1442987166@qq.com
    #@Software : PyCharm
    from configs.config import HOST
    from lib.apilib.login_j import Login
    import requests
    import pprint
    class MyShop():
        """模块类,我的商店"""
        def __init__(self,inToken):
            self.header={'Authorization':inToken}  #请求头
    
        def shop_list(self,inData):
            #列出商铺
            payload=inData
            url=f'{HOST}/shopping/myShop'
            resp=requests.get(url,headers=self.header,params=payload)
            return resp.json()
    if __name__ == '__main__':
        #1.登录成功
        token=Login().login('''{"username":"sq0129","password":"18792733468wj"}''',getToken=True)
        #2.列出商铺
        res=MyShop(token).shop_list({'page':1,'limit':20})
        pprint.pprint(res)

    再新建一个tools包,下面新建一个getExcelData.py文件

    #-*- coding: utf-8 -*-
    #@File     : getExcelData.py
    #@Time     : 2020/10/1 10:01
    #@Author   : xianyu
    #@Email    : 1442987166@qq.com
    #@Software : PyCharm
    import xlrd
    import json
    from xlutils.copy import copy
    #打开表(读取表),根据行数获取数据
    def get_excelData(sheetName,startRow,endRow):
        resList=[]
        #路径
        excelDir='../data/外卖系统接口测试用例.xls'
        #formatting_info=True保持样式
        workBook = xlrd.open_workbook(excelDir,formatting_info=True)
        # worksheet = workBook.sheet_names()  #获取所有的sheet页名称
        #使用sheet名称获取指定的sheet页
        workSheet = workBook.sheet_by_name(sheetName) #不要用编号获取,为了以后便于维护,建议用sheet页名字
        for one in range(startRow-1,endRow):
            #读取单元格
            reqBodyData=workSheet.cell(one,9).value #请求body
            reqpData = workSheet.cell(one,11).value #相应数据
            resList.append((reqBodyData,reqpData)) #封装一个列表
        return resList
    
    #可以自动识别用例数,根据用例名称获取数据
    def get_excelData2(sheetName,caseName):
        '''
        :param sheetName: 表名
        :param caseName: 某一个接口的用例名称
        :return:
        '''
        resList = []
        #1-excel表路径
        excelDir = '../data/外卖系统接口测试用例.xls'
        #2- 打开excel对象--formatting_info=True  保持样式
        workBook = xlrd.open_workbook(excelDir,formatting_info=True)
        #3- 获取某一个指定的表
        workSheet = workBook.sheet_by_name(sheetName)
        #4- 读取一列数据
        # print(workSheet.col_values(0))
        idx=0 #开始的下标
        for one in workSheet.col_values(0):
            if caseName in one:
                reqBodyData = workSheet.cell(idx,9).value  #请求body
                respData =  workSheet.cell(idx,11).value   #响应数据
                resList.append((json.loads(reqBodyData),json.loads(respData)))   #封装一个列表里嵌套元组
            idx += 1
        return resList
    
    #写入表
    def set_excelData():
        resList=[]
        #路径
        excelDir='../data/外卖系统接口测试用例.xls'
        #cell_overwrite_ok参数为True,则同一个单元格可以覆盖,默认为False
        workBook = xlrd.open_workbook(excelDir,formatting_info=True)
        workBookNew = copy(workBook)              #复制一个新excel文件对象 注意这个是wb copy用来专门copy、excel的
        workSheetNew = workBookNew.get_sheet(0)   #取复制出来的新excel文件对象的第一个子表#copy出来的不能用name
        return workBookNew,workSheetNew           #复制出来的excel对象,复制出来excel对象的第一个子表
    
    if __name__ == '__main__':
        get_excelData2('登录模块','Login')
        for one in get_excelData2('登录模块','Login'):
            print(one)
    
    #注意
    #excel用例里面的false要符合json格式,并不是python格式
    #用例里面全部写字典,因为不管表单还是json都可以用

    最后再testCase包下面,新建一个test_myShop.py文件

    #-*- coding: utf-8 -*-
    #@File     : test_myShop.py
    #@Time     : 2020/10/5 10:00
    #@Author   : xianyu
    #@Email    : 1442987166@qq.com
    #@Software : PyCharm
    from lib.apilib.login_j import Login
    from lib.apilib.myShop import MyShop
    from tools.getExcelData import get_excelData2
    import pytest
    
    class TestMyShop():
        """测试我的商铺,逻辑关系类"""
    
        def setup_class(self):
            """类初始化"""
            self.token=Login().login('''{"username":"sq0129","password":"18792733468wj"}''',getToken=True)
        @pytest.mark.parametrize('inData,respData',get_excelData2('我的商铺','listshopping'))
        def test_shop_list(self,inData,respData):
            res=MyShop(self.token).shop_list(inData)
            print('实际响应结果===========》',res)
            if res.get('code') !=None:
                assert res['code'] == respData['code']
            else:
                assert res['error'] == respData['error']
    
    if __name__ == '__main__':
        pytest.main(['test_myShop.py','-s'])
    
    '''
    pytest输出信息 
    .  表示用例成功
    F  表示用例失败
    E  表示语法错误
    '''
  • 相关阅读:
    Linux 学习 step by step (2)
    公共建筑能耗监测平台的GPRS通讯服务器的开发方法分享
    幸福框架:可扩展的、动态的、万能的 编号生成器
    C++ Data Member内存布局
    .NET程序集强命名删除与再签名技术 源代码剖析
    hdu 2191(多重背包)
    五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时
    终于懂了:Delphi消息的Result域出现的原因——要代替回调函数的返回值!(MakeObjectInstance不会帮助处理(接收)消息回调函数的返回值)
    Firemonkey实现Mac OS程序中内嵌浏览器的功能(自己动手翻译,调用苹果提供的webkit框架)
    感悟:市场经济看得就是主观能动性,有则富贵可及,无则无限趋于零
  • 原文地址:https://www.cnblogs.com/king2/p/13770399.html
Copyright © 2011-2022 走看看