pytest+requests+excel 接口自动化框架

一、项目框架如图:

1、common :这个包都是一些公共的方法,如:手机号加解密,get/post接口请求的方法封装,接口鉴权,发邮件,读写excel文件方法等等

2、result:存放每次运行的log和测试报告

3、testcase:这个包放test开头的测试用例

4、testFile:这个包放接口上传的图片(如注册需要上传头像),excel管理的接口参数

5、caselist.txt:需要运行的用例

6、config.ini :放一些配置信息,如发邮件的房间账户,接口需要使用的固定参数和版本,发送邮件的开关,以及动态的数据,如动态更改了就将最新的写在这个配置里面,其他地方需要用的就从配置文件里面取最新生成的。

7、readConfig.py :操作配置文件的一些方法,获取数据,修改数据等

8、runAll.py:运行所有用例

2、excel表里面的参数:

  后面这个code和msg是预期结果,用例里面会获取实际结果,然后跟这个预期结果比较判断接口是否成功。

3、接口的写法

接口是采用参数化实现的,传入不用的参数对比不同的结果

aes = aesCryter.AesCrypter()
authen= authentication.getAuthentication()
login_xls = commons.get_xls("userCase.xlsx", "login")
localReadConfig = readConfig.ReadConfig()
configHttp = ConfigHttp.ConfigHttp()
info = {}

@paramunittest.parametrized(*login_xls)
class Login(unittest.TestCase):
    def setParameters(self, case_name,url, method, token, par, code, msg):
        self.case_name = str(case_name)
        self.url = str(url)
        self.method = str(method)
        self.token = str(token)
        self.par = eval(str(par))
        self.code = str(code)
        self.msg = str(msg)
        self.return_json = None
        self.info = None

    def setUp(self):
        self.log = Log.MyLog.get_log()
        self.logger = self.log.get_logger()
        print(self.case_name+"测试开始前准备")

    def testLogin(self):
        get_url = authen.get_Url("userCase.xlsx", "login",0,1)
        ydtoken = authen.get_ydtoken(url = get_url)        #获取ydtoken
        new_url =localReadConfig.get_http(‘url‘)+get_url+"&ydtoken="+ydtoken  #拼接接口的请求链接
        configHttp.set_url(new_url)
        print("第一步:设置url  "+new_url)

        # get visitor token
        if self.token == ‘0‘:
            token_v = None
        elif self.token == ‘1‘:
            businessCommon.set_visitor_token_to_config()
            token_v = localReadConfig.get_headers(‘token_v‘)
            header = {"cookie": "SSO=%s" % str(token_v)}
            configHttp.set_headers(header)
        print("第二步:设置header(token等)")

        # set params
        data =self.par
        data[‘mobile‘] = aes.encrypt(str(data[‘mobile‘]))          #对手机号和密码继续加密
        data[‘password‘] = aes.encrypt(str(data[‘password‘]))
        data["token"] = str(token_v)
        configHttp.set_data(data)
        print("第三步:设置发送请求的参数")

        # test interface
        self.return_json = configHttp.post()
        print(self.return_json)
        print("第四步:发送请求方法")

        # check result
        self.checkResult()
        print("第五步:检查结果")

    def tearDown(self):
        """

        :return:
        """
        self.log.build_case_line(self.case_name, actualcode, actualmsg)
        print("测试结束,输出log完结\n\n")

    def checkResult(self):
        """
        check test result
        :return:
        """
        global actualcode,actualmsg
        actualcode = commons.get_value_from_return_json(self.return_json, ‘code‘)
        print(‘实际code:%s‘%actualcode)
        actualmsg = commons.get_value_from_return_json(self.return_json, ‘msg‘)
        print(‘实际msg:%s‘%actualmsg)
        self.assertEqual(actualcode, self.code)
        self.assertEqual(actualmsg, self.msg)

if __name__ == ‘__main__‘:
    unittest.main

4、接口关联,

接口和接口之间有这依赖关系,必须上一个接口请求完成,后面这个接口才能才能,所以在common公共包里面写了一个通用的方法,如果涉及到有依赖关系的,就调用这个接口,把需要先请求的接口先完成了,再请求要测试的接口

比如:接下来这个忘记密码接口,更改密码,必须先请求发送验证码接口,再请求验证已验证接口,最后才能请求更改密码接口

import unittest
import paramunittest
import readConfig as readConfig
from common import Log as Log
from common import commons
from common import configHttp as ConfigHttp
from common import businessCommon
from common import get_Authentication as authentication

authen= authentication.getAuthentication()
forgotcheck = commons.get_xls("userCase.xlsx", "forgotcheck")
localReadConfig = readConfig.ReadConfig()
configHttp = ConfigHttp.ConfigHttp()
info = {}

@paramunittest.parametrized(*forgotcheck)
class ForgotCheck(unittest.TestCase):
    def setParameters(self, case_name, url,method, token, par, code, msg):
        self.case_name = str(case_name)
        self.url = str(url)
        self.method = str(method)
        self.token = str(token)
        self.par = eval(str(par))
        self.code = str(code)
        self.msg = str(msg)
        self.return_json = None
        self.info = None

    def setUp(self):
        self.log = Log.MyLog.get_log()
        self.logger = self.log.get_logger()
        print(self.case_name+"测试开始前准备")

    def testforgotcheck(self):
        # set url
        get_url = authen.get_Url("userCase.xlsx", "forgotcheck", 0, 1)
        ydtoken = authen.get_ydtoken(url=get_url)  # 获取ydtoken
        new_url = localReadConfig.get_http(‘url‘) + get_url + "&ydtoken=" + ydtoken  # 拼接鉴权的请求链接
        configHttp.set_url(new_url)
        print("第一步:设置url  " + new_url)

        # get visitor token
        if self.token == ‘0‘:
            token_v = None
        elif self.token == ‘1‘:
            businessCommon.set_visitor_token_to_config()
            token_v = localReadConfig.get_headers(‘token_v‘)
            header = {"cookie": "SSO=%s" % str(token_v)}
            configHttp.set_headers(header)
        print("第二步:设置header(token等)")

        # set params
        data = self.par
        data["token"] = str(token_v)
        configHttp.set_data(data)
        print("第三步:设置发送请求的参数")

        # test interface
        self.return_json = configHttp.post()
        print("第四步:发送请求方法")

        # check result
        self.checkResult()
        print("第五步:检查结果")

    def tearDown(self):
        """

        :return:
        """
        self.log.build_case_line(self.case_name, actualcode, actualmsg)
        print("测试结束,输出log完结\n\n")

    def checkResult(self):
        """
        check test result
        :return:
        """
        global actualcode,actualmsg
        actualcode = commons.get_value_from_return_json(self.return_json, ‘code‘)
        print(‘实际code:%s‘%actualcode)
        actualmsg = commons.get_value_from_return_json(self.return_json, ‘msg‘)
        print(‘实际msg:%s‘%actualmsg)
        self.assertEqual(actualcode, self.code)
        self.assertEqual(actualmsg.strip(), self.msg)

5、控制接口是否需要运行 ,每次新增用例把用例名字写在这个 caselist.txt  ,不需要运行就注释即可。

#reqSer/test_001_getRequst
#reqSer/test_002_addRequst
#reqSer/test_003_userRadar
user/test_001_Login
#user/test_002_Sign_sms
#user/test_003_Forgotsms
#user/test_004_Forgotcheck
#user/test_005_forgotpass
#user/test_006_NoParameterization

6、运行所有用例 runAll.py

import os
import unittest
from common.Log import MyLog as Log
import readConfig as readConfig
from common import  HTMLTestRunner
from common.configEmail import MyEmail

localReadConfig = readConfig.ReadConfig()

class AllTest:
    def __init__(self):
        global log, logger, resultPath, on_off
        log = Log.get_log()
        logger = log.get_logger()
        resultPath = log.get_report_path()
        print(resultPath)
        on_off = localReadConfig.get_email("on_off")
        self.caseListFile = os.path.join(readConfig.proDir, "caselist.txt")
        self.caseFile = os.path.join(readConfig.proDir, "testCase")
        # self.caseFile = None
        self.caseList = []
        self.email = MyEmail.get_email()

    def set_case_list(self):
        """
        set case list
        :return:
        """
        fb = open(self.caseListFile)
        for value in fb.readlines():
            data = str(value)
            if data != ‘‘ and not data.startswith("#"):
                self.caseList.append(data.replace("\n", ""))
        fb.close()

    def set_case_suite(self):
        """
        set case suite
        :return:
        """
        self.set_case_list()
        test_suite = unittest.TestSuite()
        suite_module = []

        for case in self.caseList:
            case_name = case.split("/")[-1]
            print(case_name+".py")
            discover = unittest.defaultTestLoader.discover(self.caseFile, pattern=case_name + ‘.py‘, top_level_dir=None)
            suite_module.append(discover)

        if len(suite_module) > 0:

            for suite in suite_module:
                for test_name in suite:
                    test_suite.addTest(test_name)
        else:
            return None
        return test_suite

    def run(self):
        """
        run test
        :return:
        """
        try:
            suit = self.set_case_suite()
            if suit is not None:
                logger.info("********TEST START********")
                fps = open(resultPath, ‘wb‘)
                runner = HTMLTestRunner.HTMLTestRunner(stream=fps, title=‘Test Report‘, description=‘Test Description‘)
                runner.run(suit)
            else:
                logger.info("Have no case to test.")
        except Exception as ex:
            logger.error(str(ex))
        logger.info("*********TEST END*********")
        fps.close()
        # send test report by email
        if on_off == ‘on‘:
            self.email.send_email()
        elif on_off == ‘off‘:
            logger.info("Doesn‘t send report email to developer.")
        else:
            logger.info("Unknow state.")

if __name__ == ‘__main__‘:
    obj = AllTest()
    obj.run()

6、生成的报告:

7、发送邮件,邮件附件是report和log,所以压缩了一下。

原文地址:https://www.cnblogs.com/guo2733/p/10552255.html

时间: 2024-10-07 06:08:38

pytest+requests+excel 接口自动化框架的相关文章

Java + Excel 接口自动化

最近项目比较悠闲,想找点事干,写了个 Excel 接口测试的 "框架" 以前用 python 写过一个,这次用 java, 应该说框架都不算,反正就是写了,能帮我解决问题就行. 当然咯,也许会问干嘛那么麻烦直接用 feed4testng, 或者 testng 就行了,没事找事干还专门写个这玩意... 呵呵,就闲的蛋疼! 文笔有限不知道怎么写,直接上代码: 欢迎各位指定,或提出好的意见,总觉得还有很多不好的地方. 结构就这破样了, E 文也不好, 随便捣鼓,开心就好. 哈哈 ExcelU

python3+request接口自动化框架

首次书写博客,记录下写的自动化接口框架,框架比较简单,哈哈哈,算是记录下历程把!~~~ 一.本次框架由python3.6 书写 1.准备代码环境,下载python3.6    下载地址:https://www.python.org/downloads 2.下载pycharm 软件. 二.开始创建python接口自动化框架: 1.这是我创建的框架中的各个文件夹,分别有config  配置文件夹.fengzhuang   将接口用get post  两种传输方式进行封装并自动来区分执行. 2.log

接口自动化框架好文

接口自动化框架好文 2017-04-13 API 自动化测试框架分享 接口测试的一些感悟 HTTP API自动化测试从手工到平台的演变

python接口自动化框架

基于 python 的接口测试框架 接口测试 · jphtmt · 于 5 月前发布 · 最后由 jphtmt 于 4 月前回复 · 3553 次阅读 项目背景 公司内部的软件采用B/S架构,管理实验室数据,实现数据的存储和分析统计.大部分是数据的增删改查,由于还在开发阶段,所以UI界面的变化非常快,之前尝试过用python+selenium进行UI自动化测试,后来发现今天刚写好的脚本第二天前端就改了页面,又得重新去定位元素什么的,消耗大量的精力与时间维护自动化脚本.针对此种情况,对接口测试较为

python写接口自动化框架

代码如下: 1 #!/usr/bin/env python 2 # -*- coding: utf_8 -*- 3 # 获取测试用例文件excel 4 5 import xlrd 6 import json 7 8 9 class CreateExcel: 10 def __init__(self): 11 pass 12 13 @classmethod 14 def open_excel(cls): 15 path = "testcase.xls" 16 workbook = xlr

Python+requests+exce接口自动化测试框架

一.接口自动化测试框架 二.工程目录 三.Excel测试用例设计 四.基础数据base 封装post/get:runmethod.py #!/usr/bin/env python3 # -*-coding:utf-8-*- # __author__: hunter import requests import json class RunMain: def send_get(self, url, data): res = requests.get(url=url, params=data).js

(转)Java + Excel 接口自动化

最近项目比较悠闲,想找点事干,写了个 Excel 接口测试的 "框架" 以前用 python 写过一个,这次用 java, 应该说框架都不算,反正就是写了,能帮我解决问题就行. 当然咯,也许会问干嘛那么麻烦直接用 feed4testng, 或者 testng 就行了,没事找事干还专门写个这玩意... 呵呵,就闲的蛋疼! 文笔有限不知道怎么写,直接上代码: 欢迎各位指定,或提出好的意见,总觉得还有很多不好的地方. 结构就这破样了, E 文也不好, 随便捣鼓,开心就好. 哈哈 ExcelU

接口自动化框架(java)--3.get,delete请求,Excel管理多种请求类型

这套框架的报告是自己封装的 每种请求类型放入不同的sheet中,就可以避免新建太多的excel去做数据驱动. XSSFSheet类提供了一个读取sheet的方法,getSheetAt(int),通过下标去访问想要的sheet 1.Excel,添加两个sheet页改名成get , delete,代表这两种类型的接口 2. 在用例的dataProvider中将这两个sheet作两个方法分别读取.再传入对应的test中 1 package com.qa.tests; 2 3 import com.al

python学习笔记(接口自动化框架)

之前是利用python自带的unittest测试框架 这次自己设计一个 之后再一点点往里面加功能 (ps:当然这个框架真的是很简单..很简单...很简单...) excel文件格式: 1 #!/usr/bin/env python 2 # -*- coding: utf_8 -*- 3 4 import xlrd 5 import json 6 7 8 class CreateExcel: 9 def __init__(self): 10 pass 11 12 @classmethod 13 d