Bootstrap

pytest+python+requests+allure接口自动化

文件层级:

接口层,用例层,公共层,报告层,conftest.py

注意:1.需要被调用的类方法,使用@classmethod,这样调用时,无需实例化;

            2.保持登录,使用requests.session;

方式一:

conftest.py:1.登录:fixture(scope=session)写登录方法;2.参数关联:定义空字典,使用fixture(scope=function),闭包方式写提取参数,读取参数;

接口层:类、类属性(url,method);

用例层:导入接口层的类,测试用例方法中调用 方法中传登录方法名,接口地址(类.url);

 方式二:

项目根目录添加到系统路径下,代码放在run.py 或者conftest.py;

base_requests.py:封装执行方法;如,#base/base_requests.py

接口层:继承base_requests; 1.写测试用例(如,登录方法);如,#api_object/api_login.py

用例层:导入接口类,执行;如,#test_case/test_userinfo.py

公共层:读等;如,#common/Read.py

域名:接口层创建工具包,新增读.py,调用公共方法的读,并返回域名;如,#api_object/utils/read_domain.py

confest.py:1.自动调用执行方法;如,#conftest.py

    # 获取项目根目录的绝对路径
    r_dir = os.path.dirname(os.path.realpath(__file__))
    #将项目根目录加入系统路径
    sys.path.insert(0,r_dir)
    #下面可以导入根目录下的模块或包,而不会出现导入错误
    # pytest.main(['-vs'])
    # 运行测试并生成Allure报告的命令行参数
#base/base_requests.py
import requests
class BaseCaseExecute:
    method=""
    url = ""
    @classmethod
    def execute(self,**kwargs):
        rs = requests.session()
        response=rs.request(self.method,self.url,**kwargs)
        return response
#api_object/api_login.py
from base.base_requests import BaseCaseExecute
from api_object.utils.read_domain import Read_domain


class Test_api_login(BaseCaseExecute):
    method="post"
    url = Read_domain.read_domain("login") + "/signin" # 读取域名+填写接口地址
#test_case/test_userinfo.py
from api_object.userinfo import userinfo
import allure

class Test_userinfo:
    @allure.title("博客园列表1")  #用例的标题写在每条用例的上一行
    def test_userinfo(self):
        result=userinfo.execute()
        print(result.text)
        assert "星空" in result.text
#common/Read.py
import yaml
from configparser import ConfigParser
class Read:
    @classmethod
    def Read_yaml(self,file_path): #读取yaml文件
        with open(file_path,"r") as f:
            data=yaml.safe_load(f)
        return data

    @classmethod
    def Read_ini(cls,file_path,title,name):#读取ini文件
        config=ConfigParser() #初始化解析器
        config.read(file_path)
        print("读取的ini文件路径:{}".format(file_path))
        value=config.get(title,name) #读取配置文件中的值,如域名
        return value
#api_object/utils/read_domain.py
from common.Read import Read

class Read_domain:
    @classmethod
    def read_domain(cls,name):
        value=Read.Read_ini("config/config.ini", "host", name)
        return value #返回对应域名
#conftest.py
import pytest
#导入读
from common.Read import Read
from api_object.api_login import Test_api_login
headers=Read.Read_yaml("config/config.yaml").get("request_headers")

@pytest.fixture(autouse=True,scope="session") #自动执行,测试用例中无需调用
def login():
    rs=Test_api_login.execute()
    rs.headers.update(headers)
;