po模式--接口自动化测试

对暴风平台的测试:以下是po模式接口自动化测试的基本结构

 

common 公共里面public.py页面

复制代码
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:张红

import os

# 基础路径
def base_dir():
    return os.path.dirname(os.path.dirname(__file__))
# print(base_dir())
'''这个主要是对动态参数的处理'''

# 读取文件里面的参数
def getID(filename):
    with open(file=os.path.join(base_dir(),'data',filename),mode='r')as f:
            return f.read()


# 将参数写入文件
def writeID(filename,countent):
    with open(file=os.path.join(base_dir(),'data',filename),mode='w')as f:
            f.write(countent)
复制代码

config:配置文件里面的yaml文件(用来分离端口和域的)

url:
  nameport: http://xx.xx.xxx.xx:xxxx

data里面的json文件,存放的是测试中用到的数据  data包里面也会存放上边写的动态参数的文件

复制代码
{
  "name": "无涯",
  "product_type": "WEB",
  "version": "1",
  "master": "1",
  "description": "1",
  "modifyname": "小明",
  "modifyproduct_type": "APP",
  "modifyversion": "1.0.1",
  "modifymaster": "",
  "modifydescription": "这个是测试",
  "login": {"username":"13xxxxxxxxx","password":"xxxxxx"}

}
复制代码

page:对象层页面

login.py页面

复制代码
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:张红
import requests
from common.public import writeID
from utils.operationJson import readJson
from common.public import getID
from utils.operationJson import readYaml


# 数据格式是json,如果要用data参数,就需要对请求参数进行序列化处理
def login():
    # dict1 = {"username":readJson()['username'],"password":readJson()['password']}
    r = requests.post(
        # url=readJson()['geturl']+'/login/auth/',
        url=readYaml()['url']['nameport'] + '/login/auth/',
        json=readJson()['login'],
        headers={'Content-Type': 'application/json;charset=UTF-8'}

    )
        # 产品登录成功后,会生成一个token,我们再访问其他页面的时候会带上这个token,为了方便,我们把它写入到一个文件中
        # 文件名是token,参数是从响应对象中获取的token值
    writeID(filename='token',countent=str(r.json()['token']))
    # print(r.json()['token'])
# login()
    # 由于多处都用到这个请求头 ,在这个把这个请求头单独写出来了,之后需要的时候只需要调用即可
def headers():
    return {'Authorization':'JWT {token}'.format(token=getID(filename='token'))}
复制代码

baofeng.py页面

复制代码
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:张红
import requests
from common.public import writeID
from common.public import getID
from utils.operationJson import readJson
import json
from page.login import headers
from utils.operationJson import readYaml




        # 定义一个增加产品的函数
def addProduct(name, product_type, version, master, description):
    r = requests.post(
        url=readYaml()['url']['nameport']+'/interface/product/',
        json={"name": name, "product_type": product_type, "version": version, "master": master,
                  "description": description},
        headers=headers()
    )
    writeID(filename='productID', countent=str(r.json()['id']))
    return r


    # 定义一个删除产品的函数
def delProduct():
    r = requests.delete(
        url=readYaml()['url']['nameport']+'/interface/product/{productID}/'.format(
            productID=getID(filename='productID')),
        headers=headers()
    )
    return r


    # 定义一个修改产品的函数
def modifyProduct(name,product_type,version,master,description):
    r=requests.put(
        url=readYaml()['url']['nameport']+'/interface/product/{productID}/'.format(productID=getID(filename='productID')),
        headers=headers(),
        json={"name":name,"product_type":product_type,"version":version,"master":master,"description":description}
    )
    return r


    # 定义一个查询产品的函数
def queryProduct(queryname):
    r=requests.get(
        url=readYaml()['url']['nameport']+'/interface/products?name=',
        headers=headers()
    )
    return r
复制代码

run:存放的是运行文件

复制代码
import time
# 时间
import unittest
# 加载测试模块
import os
# 处理路径
import HTMLTestRunner
# 生成测试报告必须要用的库
def getSuite():
    # start_dir=加载所有的测试模块来执行,pattern=通过正则的模式加载所有的模块
    '''获取所有执行的测试模块'''
    suite = unittest.TestLoader().discover(
        start_dir=os.path.dirname(os.path.dirname(__file__)),

        pattern='test_*.py'

    )
    return suite


# 获取当前时间
def getNowtime():
    return time.strftime("%y-%m-%d %H_%M_%S",time.localtime(time.time()))

# 执行获取的测试模块,并获取测试报告
def main():
    filename=os.path.join(os.path.dirname(os.path.dirname(__file__)),'report',getNowtime()+"report.html")
    # print(filename)
    # 把测试报告写入文件中,b是以二进制的方式写入
    fp=open(filename,"wb")
    # HTMLTestRunner实例化的过程,stream是流式写入,title是测试报告的标题,description是对测试报告的描述
    runner=HTMLTestRunner.HTMLTestRunner(
        stream=fp,
        title="接口自动化测试报告",
        description="基于python语言的接口自动化测试实战"
    )
    runner.run(getSuite())

if __name__=="__main__":
    main()
复制代码

test测试层:

test_login.py

复制代码
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:张红
import unittest
import requests
import time as t
from page.login import login
from page.login import headers
from utils.operationJson import readJson
from utils.operationJson import readYaml


class LoginTest(unittest.TestCase):


    def setUp(self) -> None:
        t.sleep(2)

    # 这个pass是后续没有任何操作
    def tearDown(self) -> None:
        pass

    # 测试首页
    def test_fengbao_index(self):
        r = requests.get(
            url=readYaml()['url']['nameport']+'/interface/index',
            headers=headers()
        )
        self.assertEqual(r.json()['count']['api'],0)
        self.assertEqual(r.status_code, 200)


if __name__ == '__main__':
    unittest.main(verbosity=2)
复制代码

test_baofeng.py

复制代码
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:张红

import time as t
import json
from utils.operationJson import readJson
from test.test_login import LoginTest
from page.baofeng import *


class Fengbao(LoginTest):


    # 测试添加产品
    def test_addProduct(self):
        r = addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description'])
        delProduct()
        self.assertEqual(r.status_code, 201)

    # 测试删除产品
    def test_delProduct(self):
        addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description'])
        r=delProduct()
        self.assertEqual(r.status_code, 204)


    # 测试修改产品名称
    def test_modifyProduct_name(self):
        addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description'])
        r=modifyProduct(name=readJson()['modifyname'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description'])
        delProduct()
        self.assertEqual(r.json()['name'],'小明')
        self.assertEqual(r.status_code,200)


    # 修改产品类型
    def test_modifyProduct_product_type(self):
        addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description'])
        r=modifyProduct(name=readJson()['name'], product_type=readJson()['modifyproduct_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description'])
        delProduct()
        self.assertEqual(r.json()['product_type'],'APP')
        self.assertEqual(r.status_code,200)


    # 修改产品版本
    def test_modifyProduct_version(self):
        addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description'])
        r = modifyProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['modifyversion'], master=readJson()['master'], description=readJson()['description'])
        delProduct()
        self.assertEqual(r.json()['version'], '1.0.1')
        self.assertEqual(r.status_code, 200)


    #修改产品作者
    def test_modifyProduct_master(self):
        addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description'])
        r = modifyProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['modifymaster'], description=readJson()['description'])
        delProduct()
        self.assertEqual(r.json()['master'], '')
        self.assertEqual(r.status_code, 200)


    # 修改产品描述
    def test_modifyProduct_description(self):
        addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description'])
        r = modifyProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['modifydescription'])
        delProduct()
        self.assertEqual(r.json()['description'], '这个是测试')
        self.assertEqual(r.status_code, 200)


    # 模糊查询
    def test_queryProduct_vague(self):
        addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description'])
        r=queryProduct(queryname='')
        delProduct()
        self.assertEqual(r.status_code,200)


    # 搜索查询
    def test_queryProduct_query(self):
        addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description'])
        r = queryProduct(queryname='')
        delProduct()
        self.assertEqual(r.status_code,200)

    # 精确查询
    def test_queryProduct_accurate(self):
        addProduct(name=readJson()['name'], product_type=readJson()['product_type'], version=readJson()['version'], master=readJson()['master'], description=readJson()['description'])
        r = queryProduct(queryname='无涯')
        delProduct()
        self.assertEqual(r.status_code,200)



if __name__ == '__main__':
    unittest.main(verbosity=2)
复制代码

utils:里面写工具类  operationJson.py 页面

复制代码
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# author:张红
import os.path

from common.public import base_dir
import json
import yaml


def readJson():
         return json.load(open(file=os.path.join(base_dir(),'data','fengbao.json'),encoding='utf-8'))

# print(readJson())

def readYaml():
        with open(file=os.path.join(base_dir(),'config','url.yaml'),encoding="utf-8")as f:
            return yaml.safe_load(f)
# print(readYaml())
复制代码

 

posted @   净植  阅读(677)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示