# coding=utf-8
import json
import requests

class TestApi(object):
    """
    /*
        @param: @session ,@cookies
        the request can be divided into session request and cookie request according to user's own choice
        however,url and header is must ,other parameters are given by user to make it is None or not
    */
    """
    def get(self,url,param,header,cookie=None,session=None,**kwargs):
        if session:
                return session.request("GET",url,param,headers=header,**kwargs)
        elif cookie:
                return requests.get(url,params=param,headers=header,cookies=cookie,**kwargs)
    """
    /*
    @param: @session ,@cookies
        传入的是dict类型 python object 对象
        header is form data: application/x-www-urlencoded
            transfer data to data directly ,finally requests's submit will be like 'aa=dd&bb=ff' formation
        header is json :application/json
            due to the data can be 'str','dict'and tuple and so on  ,so when we choose data and
            data is given by dict,we must transfer it to json str,but when is json type str ,we must must
            transfer python object dict to json str with json.dumps(),
            finally the request submit data format is str like:
            'aa=dd&bb=ff',but when choose json the submit will become like {'a': 'cc' ,'b': 'dd'} ,
            data and json cant not be used in the requests at the same time
    */
    """
    def post_data(self,url,type,data,header,cookie=None,session=None,**kwargs):
            if cookie:
                if type is "data":
                    return requests.post(url,data=data,headers=header,cookies=cookie,**kwargs)
                elif type is "json":
                    return requests.post(url,data=json.dumps(data),headers=header,cookies=cookie,**kwargs)
            elif session:
                if type is "data":
                    return session.request("POST",url,data=data,headers=header,cookies=cookie,**kwargs)
                elif type is "json":
                    return session.request("POST",url,data=json.dumps(data),headers=header,cookies=cookie,**kwargs)
    """
    /*
    @:param:@json object
    json的value为传入的json对象
    请求header默认:ContentType: application/json
    */

    """
    def post_json(self,url,header,json,cookie=None,session=None,**kwargs):
        if cookie:
            return requests.post(url,headers=header,json=json,cookies=cookie,**kwargs)
        elif session:
            return session.request("POST",url,headers=header,json=json,**kwargs)

    """
    /*
    @:param: @url,@data,@**kwargs
    Tip: header you need to according to your api to be given in **kwargs position
    */
    """
    def put(self,url,data,cookie=None,session=None,**kwargs):
        if cookie:
            return requests.put(url,data,cookies=cookie,**kwargs)
        elif session:
            return session.request("PUT",url,data,**kwargs)
    """
    /*
    @:param: @url,@data,@**kwargs
    Tip: header you need to according to your api to given in **kwargs position
    */
    """
    def delete(self,url,data,cookie=None,session=None,**kwargs):
        if cookie:
            return requests.delete(url,data,cookies=cookie,**kwargs)
        elif session:
            return session.request("DELETE",url,data,**kwargs)

# coding=utf-8
from ruamel import yaml
from API.apitest import *
"""
    /*@param: python version 3.7
    第一步制造配置文件yaml或者json都可以保存请求报文接口参数的:
    写入方法很简单见:Jsread.py的Yml,Js类的write()方法
    */
"""
class Yml(object):
    def __init__(self, yml_path):
        self.yml_path = yml_path

    def read(self):
        with open(self.yml_path, 'r', encoding='utf-8')as f:
            data = yaml.load(f,Loader=yaml.Loader)
        return data

class EnvParameter(object):
    def __init__(self, con_path):
        defaults = {"url": None,
                    "header": None,
                    "data": None,
                    "method": None,
                    "param": None,
                    "type": None,
                    "json": None}
        self.cookies = None
        self.session = None
        self.con_path = con_path
        dict = Yml(self.con_path).read()
        defaults.update(dict)
        self.url = defaults["url"]
        self.header = defaults["header"]
        self.method = defaults["method"]
        self.data = defaults["data"]
        self.param = defaults["param"]
        self.json = defaults["json"]
        self.type = defaults["type"]

class TestSend(EnvParameter):
    def __init__(self,config_path,cookie1=None,session1=None):
        # EnvParameter.__init__(self,conpath=None ,url=None,method=None,header=None,type=None,data=None,param=None,json=None,cookies=None,session=None)
        EnvParameter.__init__(self,config_path)
        self.session=session1
        self.cookie1=cookie1
        # print(self.param,self.type) #测试下类继承效果
    def send(self):
        if self.method.upper()=="GET":
            rep=TestApi().get(self.url,self.param,self.header,cookie=self.cookie1,session=self.session)
            return rep
        elif self.method.upper()=="POST":
            rep=TestApi().post_data(self.url,self.type,self.data,self.header,cookie=self.cookie1,session=self.session1)
            return rep
        elif self.method.upper()=="PUT":
            rep=TestApi().put(self.url,self.data,cookie=self.cookie1,session=self.session1)
            return rep
        elif self.method.upper()=="DELETE":
            rep=TestApi().delete(self.url,self.data,cookie=self.cookie1,session=self.session1)
            return rep
# if __name__ == "__main__":
#     TestSend('./conf.yaml')

import unittest
import  requests
from API.testyaml import *
class Interface(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        global session
        s = requests.session()
        requests.get(url="http://www.baidu.com")
        session =s
        print("---------------开始测试所有接口--------------")
    @classmethod
    def tearDownClass(cls):
        """清除cookie"""
        session.cookies.clear()  #也可以这样写 session.cookies=None
        print("---------------加载所有接口结束销毁cookie--------------")

    def test_001(self):
        response=TestSend('./conf.yaml',session1=session).send()
        print(response.status_code)

if __name__ =="__main__":
    unittest.main()
详情也可以见我的csdn地址
---------------------
作者:流浪的python
来源:CSDN
原文:https://blog.csdn.net/chen498858336/article/details/86619178
版权声明:本文为博主原创文章,转载请附上博文链接!

python接口自动化读取json,yaml配置文件+封装requests+unittest+HTMLRunner实现全自动化的更多相关文章

  1. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-读取json封装成类(13)

    把读取json数据的函数封装成类 # -*- coding: utf-8 -*- # @Time : 2020/2/12 16:44 # @File : do_json_13.py # @Author ...

  2. python接口测试之读取配置文件

    1.python使用自带的configparser模块用来读取配置文件,配置文件可以为.conf或.ini结尾 在使用前需要先安装该模块,使用pip安装即可 2.新建一个名为a.conf的配置文件 a ...

  3. python写的读取json配置文件

    配置文件默认为conf.json 使用函数set完成追回配置项. 使用load或取配置项. 代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- ' ...

  4. Python Configparser模块读取、写入配置文件

    写代码中需要用到读取配置,最近在写python,记录一下. 如下,假设有这样的配置. [db] db_host=127.0.0.1 db_port=3306 db_user=root db_pass= ...

  5. QuantLib 金融计算——自己动手封装 Python 接口(1)

    目录 QuantLib 金融计算--自己动手封装 Python 接口(1) 概述 QuantLib 如何封装 Python 接口? 自己封装 Python 接口 封装 Array 和 Matrix 类 ...

  6. QuantLib 金融计算——自己动手封装 Python 接口(2)

    目录 QuantLib 金融计算--自己动手封装 Python 接口(2) 概述 如何封装一项复杂功能? 寻找最小功能集合的策略 实践 估计期限结构参数 修改官方接口文件 下一步的计划 QuantLi ...

  7. 当向后台插入或读取JSON数据遇见回车时

    今天在项目中发现.当插入或读取JSON数据时遇见回车符.返回JSON数据格式时会报错(firebug里体现为乱码),百度了一下发现JSON不支持字符串里存在回车! 解决的方法: 在向接口插入带json ...

  8. python - 接口自动化测试 - ReadConfig - 读取配置文件封装

    # -*- coding:utf-8 -*- ''' @project: ApiAutoTest @author: Jimmy @file: read_config.py @ide: PyCharm ...

  9. 接口自动化 基于python实现的http+json协议接口自动化测试框架源码(实用改进版)

    基于python实现的http+json协议接口自动化测试框架(实用改进版)   by:授客 QQ:1033553122 欢迎加入软件性能测试交流QQ群:7156436     目录 1.      ...

随机推荐

  1. python Django 路由之正则表达式

    一.路由系统,URL 1. url(r'^index',views.index) #默认的                  url(r'^home',views.Home.as_view()) # ...

  2. 关于java赋值运算的一个小例子

    直接贴代码,这个也是做题目中遇见的,觉得很好奇,查了一波,然后自己编写代码看了一下,果真如此,哈哈哈...... public class 关于Boolean的赋值运算 { public static ...

  3. JavaScript初学

    今天学习了js的基础知识,自我归纳如下: 第一部分:js变量的声明和引入 js声明1-直接声明js代码块,使用<script></script>  2-引入外部声明,即创建一个 ...

  4. gulp快速将css中的px替换成rem

    1.Gulp安装配置 1.全局安装gulp 1.1 安装 命令提示符执行cnpm install gulp -g; 1.2 查看是否正确安装:命令提示符执行gulp -v,出现版本号即为正确安装. 2 ...

  5. MySQL数据库(13)----忘记root用户密码解决方案【转载】

    1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录 ...

  6. Android链接蓝牙电子称

    蓝牙一直是我内心屏蔽的一个模块哈哈哈哈!然而今天我不得不正视它了,我百度了看了好多因为需要设备匹配所以设备不在没办法测试,几天之后设备到了.因为没有接触过,看到返回的打印出来的菱形方块就以为是错了.于 ...

  7. php 空格无法替换,utf-8空格惹的祸

    一次坑爹的小bug.读取一段文字(编码utf-8),想替换掉空格,str_replace(" "..).preg_replace("/\s/"..)都不起作用. ...

  8. JDK1.7环境

    官方下载页面: http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-52126 ...

  9. C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    如何:对 Windows 窗体控件进行线程安全调用 访问 Windows 窗体控件本质上不是线程安全的. 如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态. 还可能会出现 ...

  10. Python中的基础数据类型

    Python中基础数据类型 1.数字 整型a=12或者a=int(2),本质上各种数据类型都可看成是类,声明一个变量时候则是在实例化一个类. 整型具备的功能: class int(object): & ...