python+requests+unittest执行自动化接口测试

1、安装requests、xlrd、json、unittest库

<1>pip 命令安装:

pip install requests
pip install xlrd
pip install json
pip install unittest

<2> pycharm里安装

2、利用Page Object Model 设计理念创建六类Python Package(也可根据项目要求具体实施)

3、先在base包里创建一个Base_Page.py

<1>导入模块,并创建Base类,封装各类请求方法

import requests  #导入requests模块
class Base():   
    def method_post(self,url,params = None,data = None,headers = None,files = None):
        return requests.post(url = url,params = params,data = data,headers = headers,files = files)
    def method_get(self,url,params = None,data = None,headers = None,files = None):
        return requests.get(url = url,params = params,data = data,headers = headers,files = files)
    def method_put(self,url,params = None,data = None,headers = None,files = None):
        return requests.put(url = url,params = params,data = data,headers = headers,files = files)
    def method_delete(self,url,params = None,data = None,headers = None,files = None):
        return requests.delete(url = url,params = params,data = data,headers = headers,files = files)

因为每一个请求都会有params参数或是data参数,但是不可能两个都存在,所以这里用了None,依次类推

<2>适配于接口用例执行,读取Excel表时,将各类请求做判断,当符合哪一种时,就去执行哪一种

    def requests_type(self,method,url,params = None,data = None,headers = None,files = None):
        if method =='post' or method =='POST':
            return self.method_post(url = url,params = params,data = data,headers = headers,files = files)
        elif method =='get' or method =='GET':
            return self.method_get(url = url,params = params,data = data,headers = headers,files = files)
        elif method =='put' or method =='PUT':
            return requests.put(url = url,params = params,data = data,headers = headers,files = files)
        elif method =='delete' or method =='DELETE':
            return requests.delete(url = url,params = params,data = data,headers = headers,files = files)

<3> 将几种请求做简单调试,调试通了,那么我们就可以进行下一项


也可以对需要拿到cookie的接口进行封装方法保存:

    def Get_Login_cookie(self,data):
        res = self.method_post(url = "请求网址",data = data)
        return {"userId":str(res.json()['result']['userId']),"sessionId":res.json()['result']['sessionId']}

之后我们要将base页验证的这些代码做清除,否则的话永远都是调的这些接口

4、再common类下创建commons.py文件,并创建common类

<1> 封装日志方法

这里我添加了一个data包,用于存放xlrd表,以及html报告存放路径、log日志存放路径

log_path = r'D:\PycharmProjects\自动化接口\自动化接口测试\report\logs'
report_html = r'D:\PycharmProjects\自动化接口\自动化接口测试\report\html'
read_xlrd = r'D:\PycharmProjects\自动化接口\自动化接口测试\data'
class Common():
    #封装日志方法
    def get_logs(self,path = log_path):
        import logging,time
        logs = logging.getLogger()
        logs.setLevel(logging.DEBUG)
        path = path+'/' + time.strftime('%Y-%m-%d-%H-%M-%S') + '.log'
        write_file = logging.FileHandler(path,'a+',encoding='utf-8')
        write_file.setLevel(logging.DEBUG)
        set_logs = logging.Formatter('%(asctime)s - %(filename)s - %(funcName)s - %(levelname)s - %(message)s')
        write_file.setFormatter(set_logs)
        pycharm_text = logging.StreamHandler()
        pycharm_text.setFormatter(set_logs)
        logs.addHandler(write_file)
        logs.addHandler(pycharm_text)
        return logs

<2> 封装读取Excel表方法,把他转换成字典形式,方便json格式读取

# 读取Excel表方法,方便后续读取接口用例数据
    def ReadExcelTypeDict(self,file_name,path = read_xlrd):
        path = path+'/' + file_name
        import xlrd
        work_book = xlrd.open_workbook(path)  # 打开Excel表
        sheets = work_book.sheet_names()  # 获取所有的sheets页
        DatasList = []
        for sheet in sheets:
            sheets = work_book.sheet_by_name(sheet)
            nrows = sheets.nrows
            for i in range(0,nrows):
                values = sheets.row_values(i)
                DatasList.append(values)
        title_list = DatasList[0]
        content_list = DatasList[1:]
        new_list = []
        for content in content_list:
            dic = {}
            for i in range(len(content)):
                dic[title_list[i]] = content[i]
            new_list.append(dic)
        return new_list   #最终返回为字典形式 有键和值

为什么要转换格式呢?
这里就涉及到了怎么设计一个自动化接口用例



用例的参数值要用json格式写入,不要有空格
预期结果的出参也要用json格式写入
不要有' '值都要用" "包起来

<3>封装一个生成HTML报告方法

# 封装一个HTML报告方法
    def GetHtmlResult(self,suite,title,path = report_html):
        import HTMLTestReportCN,time
        path = path + '/' + time.strftime('%Y-%m-%d-%H-%M-%S') + '.html'
        with open(path,'wb+') as f:
            run = HTMLTestReportCN.HTMLTestRunner(stream=f,description='用户相关接口测试报告',tester='小白',title = title)
            run.run(suite)

其余还有需要补充的可以继续添加,我这里三个基本够用

5、在case包下创test用例,并调用我们在base页封装好的请求api以及common中的读取Excel数据表联合使用

<1>创建test_login.py

<2> 导入unittest、common类下的commons类、ddt数据驱动、Base下的base_page页

import unittest
import ddt
import 自动化接口测试.common.commons as common
from 自动化接口测试.base.Base_Page import Base

<3> 搭建unittest框架内部,并填充方法

import unittest
import ddt
import 自动化接口测试.common.commons as common
from 自动化接口测试.base.Base_Page import Base
r = common.Common().ReadExcelTypeDict('cezxhi .xlsx')  # 拿到具体的Excel表数据
@ddt.ddt  #导入ddt模块
class TestLogin(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:  # setupclass类方法  全部用例开始前执行一次
        cls.logs = common.Common().get_logs() # 导入日志方法
        cls.logs.debug('开始写入接口自动化测试用例')
    @classmethod
    def tearDownClass(cls) -> None:
        cls.logs.debug('自动化接口用例结束')

    def setUp(self) -> None:
        self.logs.debug('开始本条接口用例')

    def tearDown(self) -> None:
        self.logs.debug('结束本条用例')

    @ddt.data(*r) #  引入ddt模块,读取拿到的数据
    def test_logins(self,pars):  # 用例方法名开头必须已test  pars参数为接收的表数据值
        import json  #导入json模块
        dic = json.loads(pars['body参数值'])  # 将Excel数据中的参数值转变为json格式
        url = pars['接口地址']  # 拿到请求url
        yuqi = pars['预期结果']  # 拿到预期结果
        fs = pars['请求方式'] # 拿到请求方式
        result = Base().requests_type(method = fs,url = url,data = dic)  # 填充base页的请求api
        self.assertEqual(result.text,yuqi)  # 进行断言 看用例是否通过

<4> 执行用例后生成测试报告:

if __name__ == '__main__':
    load = unittest.TestLoader().loadTestsFromTestCase(TestLogin)  #使用loader加载方式 来找寻所有已test开头的用例
    suite = unittest.TestSuite([load,])

    common.Common().GetHtmlResult(suite,'登录测试用例')  

如果对软件测试、接口测试、自动化测试、面试经验交流。感兴趣可以加软件测试交流:1085991341,还会有同行一起技术交流。

<5> copy当前要执行的脚本路径,添加到运行方式为python里





最后我们run一下



控制台是这样的

为什么会有400呢?因为有一些接口是异常的,比如url错误的,少传入参数、空参,所以会出错,常理之中

<6> 看下生成的测试报告

在pycharm中是这样的



然后我们copy下他的路径到浏览器中查看




根据我追踪的信息,第一条失败是因为sessionId是可以变的,每一次的值都是不一样,在这里也希望大家能够找到BUG,并妥善处理好每一个问题。

以上内容希望对你有帮助,有被帮助到的朋友欢迎点赞,评论。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342