1. 安装pytest    pip insatll pytest
2.安装allure (需要确保安装了jdk环境)
  安装allure命令行:  访问allure官网,下载allure2.13.5的安装包,将其bin路径
添加进环境变量path中
  在cmd里面输入allure  version来进行版本的安装
 
 
 
 
 -  定义:将接口测试过程中常用的操作和验证封装成可复用的关键字 (或称为函数、方法),以提高测试代码的可维护性和可复用性
-  接口关键字封装方式
-  发送请求    2.提取数据
from urllib import response
import requests
import  jsonpath
import json
#关键字驱动
#发送请求 ,8种   post/get
class Apikey():
    def get(self,url,params=None,**kwargs):
        """
        :param url: 请求的URL
        :param params: 需要拼装在URL当中的参数
        :param kwargs: 其它参数,具体参考requests.post()
        :return: 响应数据
        """
        return requests.get(url=url,params=params,**kwargs)
   #发送post请求
    def post(self,url, data=None, json=None, **kwargs):
        """
        :param url: 请求的URL
        :param data: 请求参数
        :param json: json格式请求数据
        :param kwargs: 其他参数
        :return: 响应数据
        """
        return  requests.post(url=url,data=data,json=json,**kwargs)
#提取数据  数据源{msg:"登陆成功" }   jsonpath:$.msg
    def get_text(self,response,key):
        """
        :param response: 响应数据
        :param key: 关键字
        :return: 返回
        """
        value_list = jsonpath.jsonpath(response, key)
        return value_list[0]
#函数入口
if __name__ == '__main__':
 """
 1.实例化对象
 2.通过对应类调用对应方法
 3.提取数据
 """
ak=Apikey()
#准备好四要素
# 模拟登陆接口请求
data = {
    "accounts": "hami",
    "pwd": "123456",
    "type": "username"
}
params = {
    "application": "app",
    "application_client_type": "weixin",
}
res = ak.post(url="http://shop-xo.hctestedu.com/index.php?s=api/user/login",params=params, data=data)
print("响应数据:",res.json())
#提取数据
text=ak.get_text(res.json(), "$.msg")
print("提取数据:",text)
 
  
 
 
  
  
 
 
 
 
 
 
 
 
 
  
 
 
  
 
 
 -  当一个用例里面调用多个接口时,这样语法更加简洁,生成的报告有对应层级关系
@allure.title("测试用例标题")
def test_case_name():
    with allure.step("第一步:XXXXX接口"):
        # 具体的接口请求代码
    with allure.step("第二步:XXXXX接口"):
        # 具体的接口请求代码
"""
 
 
 
 
 -  一个方法中对应的变量是可以调用的
-  不同方法中的变量,可以设置对应的全局变量去进行调用(先定义后赋值)
   
 
 -  有时候某个变量全局都需要使用。利用pytest的测试夹具对应实现(固定命名 conftest.py)

 
    
 
 -  固定变量不会进行修改---常量命名需要大写,用一个文件去维护

 
 
 
 
 
 
  
 import logging
# 设置全局日志级别为DEBUG
logging.basicConfig(level=logging.DEBUG,format="%(asctime)s %(levelname)s %(filename)s (%(lineno)d) : %(message)s ")
logging.debug("debug信息")
logging.info("info信息")
logging.warning("warning信息")
logging.error("error信息")
logging.critical("critical信息")
 
  
 import logging
file = open("log.log", mode="a", encoding="utf-8")
# 设置全局日志级别为DEBUG
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(levelname)s %(filename)s 
(%(lineno)d) : %(message)s ",stream=file)
logging.debug("debug信息")
logging.info("info信息")
logging.warning("warning信息")
logging.error("error信息")
logging.critical("critical信息")
 
  
 -  pytest是日志开关  pytest.ini(不能改名字,不能在文件里面写中文)
   
 
 日志格式化:
%(asctime)s :字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(levelname)s : 打印日志级别名称
%(filename)s  : 打印当前执行程序名
%(lineno)d : 打印日志的当前行号
%(message)s : 打印日志信息
 
 -  需要每个测试用例都产生对应日志信息  :测试夹具--在conftest里面(当执行一个case会自动调用这个方法,把数据传过来给到call,yield生成器相当于返回对象,调用完成后会回到调用的方法这;而return会返回对象后不回到调用方法这)
