python+requests+pytest接口自动化框架总结

一、 封装get和post方法

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import requests
import json


class RunMain(object):
    # 构造方法,暂时不用
    '''
    def __init__(self, method, url, data, headers):
        # self.res称为实例变量,实例化类后可以直接调用
        self.res = self.run_main(method, url, data, headers)
    '''
    # post方法
    def send_post(self, url, data, headers):
        res = requests.post(url=url, data=data, headers=headers)
        # 暂时不处理json格式为字典格式,否则后面读取token值报错
        # res = json.dumps(res, indent=2, sort_keys=True)
        return res

    # get方法
    def send_get(self, url, data, headers):
        res = requests.get(url=url, data=data, headers=headers)
        # res = json.dumps(res, indent=2, sort_keys=True)
        return res

    # 执行方法
    def run_main(self, method, url, data, headers):
        if method == "POST":
            res = self.send_post(url, data, headers)
        else:
            res = self.send_get(url, data, headers)
        # print(res)
        return res


if __name__ == "__main__":
    url = "http://www.XXX/inter/HTTP//auth"
    data = None
    heards = {"Content-Type": "application/json"}
    rm = RunMain()
    rm.run_main("POST", url, data, heards)

二、 结合ini配置文件获取参数并封装接口运行方法

1.  ini配置文件(接口信息)如下:

[Auth]
method = POST
url = http://XXX/inter/HTTP//auth
data = None
headers = {"Content-Type": "application/json"}


[Login]
method = POST
url = http://XXX/inter/HTTP//login
data = {"username": "XXX","password": "XXX"}
headers = None


[Logout]
method = POST
url = http://XXX/inter/HTTP//logout
data = None
headers = None

2. 获取ini配置文件方法如下:

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import configparser
import os

# 读取ini配置文件中数据
def get_info(name, param):
    # 读取配置文件
    config = configparser.ConfigParser()
    file_path = os.path.dirname(os.path.abspath('.')) + '/config/api_info.ini'
    config.read(file_path, encoding='UTF-8')
    return config.get(name, param)

3. 封装接口运行方法如下:

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
from tools.get_info import get_info
from tools.get_token import get_token
import os
from ruamel import yaml
from tools.run_main import RunMain


class RunOne(object):

    def __init__(self):
        self.run = RunMain()

    def get_method(self, name):
        method = get_info(name, param="method")
        return method

    def get_url(self, name):
        url = get_info(name, param="url")
        return url

    def get_data(self, name):
        data = get_info(name, param="data")
        return data

    def get_headers(self, name):
        headers = get_info(name, param="headers")
        return headers

    def run_one(self, name):
        method = self.get_method(name)
        url = self.get_url(name)
        data = eval(self.get_data(name))
        headers = eval(self.get_headers(name))

        if name == "Auth":
            response = self.run.run_main(method, url, data, headers)
            # 把token值写入配置文件中
            yamlpath = os.path.dirname(os.path.abspath('.')) + '/config/token.yaml'
            tokenValue = {
                'token': response.json()["token"]
            }
            with open(yamlpath, "w", encoding="utf-8") as f:
                yaml.dump(tokenValue, f, Dumper=yaml.RoundTripDumper)
        else:
            headers = {"token": get_token()}
            response = self.run.run_main(method, url, data, headers)

        print(response.json())
        return response.json()



if __name__ == "__main__":
    run = RunOne()
    run.run_one("Auth")
    run.run_one("Login")
    run.run_one("Logout")

三、用pytest管理用例

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import pytest
from common.run_one import RunOne
from tools.get_log import get_log
logging = get_log()


class TestEdu(object):
    @pytest.fixture(scope="class")
    def before(self):
        print()
        logging.info("------用例开始------")
        res = RunOne()
        return res

    @pytest.mark.run(order=1)
    def test_auth(self, before, name="Auth"):
        response = before.run_one(name)
        assert response['status'] == 200

    # 登录接口
    # @pytest.mark.skip("暂时不执行")
    @pytest.mark.run(order=2)
    def test_login(self, before, name="Login"):
        response = before.run_one(name)
        assert response['status'] == 200

    def test_logout(self, before, name="Logout"):
        response = before.run_one(name)
        assert response['status'] == 200


if __name__ == "__main__":
    pytest.main(['-s', 'test_all.py'])

运行结果:

四、 用插件pytest-html生成测试用例

1.安装pytest-html插件,用命令pip install pytest-html或者直接在pycharm中安装

2.应用方式:--html后面的值代表测试报告生成后放置的路径

pytest.main(['-s', 'test_all.py', '--html=../report/test.html'])

测试报告如下:

五、封装发送邮件方法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import smtplib


# 定义发邮件
def send_mail(file_path):

    f = open(file_path, 'rb')
    mail_body = f.read()
    f.close()

    smtpserver = 'smtp.qq.com'
    user = '[email protected]'
    password = "XXX"
    sender = '[email protected]'
    receives = ['[email protected]']
    # 构造邮件对象
    msg = MIMEMultipart('mixed')
    # 定义邮件的标题
    subject = '接口自动化测试报告'
    # HTML邮件正文,定义成字典
    msg['Subject'] = Header(subject, "utf-8")
    msg['From'] = sender
    msg['To'] = ','.join(receives)
    # 构造文字内容
    text_plain = MIMEText(mail_body, 'html', 'utf-8')
    msg.attach(text_plain)
    # 构造附件
    text_attr = MIMEText(mail_body, 'base64', 'utf-8')
    text_attr["Content-Type"] = 'application/octet-stream'
    text_attr['Content-Disposition'] = 'attachment; filename = "test.html"'
    msg.attach(text_attr)

    # 邮箱设置时勾选了SSL加密连接,进行防垃圾邮件,SSL协议端口号要使用465
    smtp = smtplib.SMTP_SSL(smtpserver, 465)
    # 向服务器标识用户身份
    smtp.helo(smtpserver)
    # 向服务器返回确认结果
    smtp.ehlo(smtpserver)
    # 登录邮箱的账号和授权密码
    smtp.login(user, password)

    print("start send email...")
    # 开始进行邮件的发送,msg表示已定义的字典
    smtp.sendmail(sender, receives, msg.as_string())
    smtp.quit()
    print("send email end")


if __name__ == "__main__":
    report = "C:\\Users\\Administrator\\PycharmProjects\\APITest\\report\\test.html"
    send_mail(report)

运行结果:

发布了26 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/changyixue/article/details/100162886