专业上海网站建设,网站核检单,二手书网站建设,做网站公司不给源码一、整体结构
框架组成#xff1a;pytestrequestsallure
设计模式#xff1a;
关键字驱动
项目结构#xff1a;
工具层#xff1a;api_keyword/
参数层#xff1a;params/
用例层#xff1a;case/
数据驱动#xff1a;data_driver/
数据层#xff1a;data/
逻…
一、整体结构
框架组成pytestrequestsallure
设计模式
关键字驱动
项目结构
工具层api_keyword/
参数层params/
用例层case/
数据驱动data_driver/
数据层data/
逻辑层logic/
二、具体步骤及代码
1、工具层
将get、post等常用行为进行二次封装。
代码api_key.py如下
import allure
import json
import jsonpath
import requests# 定义一个关键字类
class ApiKey:# 将get请求行为进行封装allure.step(发送get请求)def get(self, url, paramsNone, **kwargs):return requests.get(urlurl, paramsparams, **kwargs)# 将post请求行为进行封装allure.step(发送post请求)def post(self, url, dataNone, **kwargs):return requests.post(urlurl, datadata, **kwargs)# 由于接口之间可能相互关联因此下一个接口需要上一个接口的某个返回值此处采用jsonpath对上一个接口返回的值进行定位并取值allure.step(获取返回结果字典值)def get_text(self, data, key):# json数据转换为字典json_data json.loads(data)# jsonpath取值value jsonpath.jsonpath(json_data, $..{0}.format(key))return value[0]其中引用allure.step()装饰器进行步骤详细描述使测试报告更加详细。
使用jsonpath对接口的返回值进行取值。
2、数据层
数据采用yaml文件。
代码user.yaml如下
-user:username: adminpassword: 123456msg: successtitle: 输入正确账号、密码登录成功
-user:username: admin1password: 1234561msg: 用户名或密码错误title: 输入错误账号1、密码1登录失败
-user:username: admin2password: 1234562msg: 用户名或密码错误title: 输入错误账号2、密码2登录失败其中title是为了在用例进行时动态获取参数生成标题。
3、数据驱动层
对数据进行读写。
代码yaml.driver.py如下:
import yamldef load_yaml(path):file open(path, r, encodingutf-8)data yaml.load(file, Loaderyaml.FullLoader)return data4、参数层
参数层存放公共使用的参数在使用时对其进行调用。
代码allParams.py如下
规则全局变量使用大写字母表示
# 地址
URL http://39.98.138.157:# 端口
PORT 50005、逻辑层
用例一进行登录的接口请求此处登录请求在yaml文件里设置了三组不同的数据进行请求。
用例二进行个人查询的接口请求此处需要用到登录接口返回的token值。
用例三、进行添加商品到购物车的接口请求此处需要用到登录接口返回的token值以及个人查询接口返回的openid、userid值
用例四、进行下单的接口请求此处需要用到登录接口返回的token值以及个人查询接口返回的openid、userid、cartid值
注意由于多数接口需要用到登录接口返回的token值因此封装一个conftest.py定义项目级前置fixture在整个项目只执行一次可以在各个用例中进行调用其他共用参数也可以采取类似前置定义。同时由于此处定义的项目级fixture因此可以将初始化工具类ak ApiKey()也放入其中。
代码conftest.py如下
from random import randomimport allure
import pytestfrom pytest_demo_2.api_keyword.api_key import ApiKey
from pytest_demo_2.params.allParams import *def pytest_collection_modifyitems(items):测试用例收集完成时将收集到的item的name和nodeid的中文显示在控制台上for item in items:item.name item.name.encode(utf-8).decode(unicode_escape)item._nodeid item.nodeid.encode(utf-8).decode(unicode_escape)# 项目级fix整个项目只初始化一次
pytest.fixture(scopesession)
def token_fix():# 初始化工具类ak ApiKey()with allure.step(发送登录接口请求并获取token整个项目只生成一次):# 请求接口# url http://39.98.138.157:5000/api/loginurl URL PORT /api/login# 请求参数userInfo {username: admin,password: 123456}# post请求res ak.post(urlurl, jsonuserInfo)# 获取tokentoken ak.get_text(res.text, token)# 验证代码验证token只生成一次token_random random()return ak, token, res, token_random其中也包含了防止中文乱码加入了pytest_collection_modifyitems函数。
设置好conftest后就可以应用在逻辑层里面了。
代码shopingApi.py如下
import pytest
import allure
from pytest_demo_2.api_keyword.api_key import ApiKey
from pytest_demo_2.params.allParams import *class ApiCase():# 登录逻辑def params_login(self, userdata):# 动态获取参数生成标题allure.dynamic.title(userdata[title])# 初始化工具类ak ApiKey()# 请求接口url URL PORT /api/login# 请求参数userInfo {username: userdata[user][username],password: userdata[user][password]}res ak.post(urlurl, jsonuserInfo)with allure.step(接口返回信息校验及打印):print(/api/login登录接口请求响应信息)print(res.text)# 获取响应结果msg ak.get_text(res.text, msg)print(msg)# 断言assert msg userdata[msg]def params_getuserinfo(self, token_fix):# 从fix中获取预置的工具类和token,所有返回值都需要接收ak, token, res, token_random01 token_fixwith allure.step(发送个人查询接口请求):url URL PORT /api/getuserinfoheaders {token: token}res1 ak.get(urlurl, headersheaders)with allure.step(接口返回信息校验及打印):print(/api/getuserinfo个人用户查询接口请求响应信息)print(res1.text)# print(验证的random值测试用)# print(token_random01)name ak.get_text(res1.text, nikename)# 断言assert 风清扬 namereturn res1def params_addcart(self, token_fix):# 从fix中获取预置的工具类和token# 所有返回都要获取不然会报错ak, token, res, token_random01 token_fixwith allure.step(调用getuserinfo接口获取返回信息):res1 self.params_getuserinfo(token_fix)with allure.step(发送添加商品到购物车请求):# 添加商品到购物车,基于token、userid、openid、productidurl URL PORT /api/addcarthd {token: token}data {userid: ak.get_text(res1.text, userid),openid: ak.get_text(res1.text, openid),productid: 8888}# 发送请求res2 ak.post(urlurl, headershd, jsondata)with allure.step(接口返回信息校验及打印):print(/api/addcart添加商品到购物车请求响应信息)print(res2.text)# print(验证的random值测试用)# print(token_random01)result ak.get_text(res2.text, result)assert success resultreturn res2def params_createorder(self, token_fix):ak, token, res, token_random01 token_fixwith allure.step(调用addcart接口获取返回信息):res1 self.params_addcart(token_fix)with allure.step(发送下单请求):url URL PORT /api/createorder# 从项目级fix中获取tokenhd {token: token}# 从添加商品到购物车接口中获取userid,openid,cartiddata {userid: ak.get_text(res1.text, userid),openid: ak.get_text(res1.text, openid),productid: 8888,cartid: ak.get_text(res1.text, cartid)}res2 ak.post(urlurl, headershd, jsondata)with allure.step(接口返回信息校验及打印):print(/api/createorder下单请求响应信息)print(res2.text)# print(验证的random值测试用)# print(token_random01)result ak.get_text(res1.text, result)assert success result6、用例层
调用逻辑层进行用例管理和数据传输。
代码test_Tree.py如下
import allure
import pytest
from pytest_demo_2.data_driver import yaml_driver
from pytest_demo_2.logic.shopingApi import ApiCaseallure.epic(shopXo电商平台接口-接口测试)
class TestTree():# 初始化用例库actions1 ApiCase()allure.feature(01.登陆)allure.story(02.一般场景)pytest.mark.parametrize(userdata, yaml_driver.load_yaml(./data/user.yaml))def test_case01(self, userdata):self.actions1.params_login(userdata)allure.feature(02.个人查询)allure.story(01.典型场景)allure.title(个人查询)def test_case02(self, token_fix):self.actions1.params_getuserinfo(token_fix)allure.feature(03.添加商品到购物车)allure.story(01.典型场景)allure.title(添加商品到购物车)def test_case03(self, token_fix):self.actions1.params_addcart(token_fix)allure.feature(04.下单)allure.story(01.典型场景)allure.title(下单)def test_case04(self, token_fix):self.actions1.params_createorder(token_fix)7、运行
代码main_run.py如下
import os
import pytestdef run():pytest.main([-v, ./case/test_Tree.py,--alluredir, ./result, --clean-alluredir])os.system(allure serve result)# os.system(allure generate ./result/ -o ./report_allure/ --clean)if __name__ __main__:run()8、结果 最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走 这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你