pytest-一波分离及配置实践记录

今天尝试将测试数据放入yaml文件,url地址放入配置文件,虽然增加了一些文件,但让整体的逻辑结构更加清晰了,在这里记录一下这个实施过程以及值得注意的地方。

整体配置流程如图所示:


配置流程.png

文件结构如下:


目录结构

config

配置文件所在的文件夹,在config.yaml可以标明一些常规配置,这里配置了url地址,用于后续测试用例应用。

host:
  test: https://test.com/

conftest.py

配置一些fixture,这里配置了在会话开始之初读取上方的config.yaml

import pytest
import os
import yaml

@pytest.fixture(scope="session")
def url(request):
    config_path=os.path.join(request.config.rootdir,'config','config.yaml')
    with open(config_path) as f:
        data=yaml.safe_load(f)
    return data
注意点

request.config.rootdir可以直接返回项目的根目录,通过os.path.join则可以获得config.yaml的地址。

data

此文件夹下主要存储测试数据yaml文件。

- case: 测试用例一
  http:
    method: POST
    path: /user
    json:
      nickname: "11"
  expected:
    response:
      statuscode: 200
      name: "11"

pytest.ini

pytest主配置文件,可以规定pytest执行时候的一些默认行为,在这里主要是标明了当后续执行需要输出每个用例的ids,为保证中文正常输出,在pytest.ini文件中增加如下配置:

[pytest]
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True

utils

commlib.py文件所在文件夹,主要是用于读取存储在data下方yaml文件的测试数据。

import os
import yaml
def get_test_data(data_path):
    case=[]
    http=[]
    expected=[]
    with open(data_path,mode='r',encoding='utf-8') as f:
        data=yaml.safe_load(f)
        data=data['test']#剥离出test
        for td in data:
            case.append(td.get('case',''))#剥离出case
            http.append(td.get('http',{}))#剥离出http
            expected.append(td.get('expected', {}))#剥离出expected
    parameters=zip(case,http,expected)#将case、http、expected合并成一个tuple
    list_params=list(parameters)##zip变成一个list
    return case,list_params

tests

包括test_case.py,测试用例执行的文件。

import requests
import pytest
import os
from root.utils import commlib


path=os.path.abspath(os.path.pardir)
datapath=os.path.join(path,'data','test_case_data.yaml')
cases,list=commlib.get_test_data(datapath)


class Test_class():
    @pytest.mark.parametrize("case,http,expected",list,ids=cases)
    def test_one(self,url,case,http,expected):
        now_url=url["host"]["test"]+http["path"]
        json=http["json"]
        res=requests.post(url=now_url,json=json)
        response=res.json()
        assert res.status_code==expected["response"]["statuscode"]
        assert response["name"]==expected["response"]["name"]
注意点
  1. 文件引用。
    test_case.py文件中,需要引用在utils文件夹下方的commlib.py文件,如果不做任何特殊操作,直接引用,程序会报错,提示根目录root找不到。
    为了解决这个问题,需要在各个涉及到引用的文件夹中建立__init__.py文件,空文件即可。这个文件可以标明当前的文件夹是一个包,内部的各个模块即各个文件可以被引用。
  2. 获取上级目录的方法。
    os.path.pardir可以获取到上级目录,但是形式是..,为获取测试数据的yaml文件地址,需要获取到它的绝对路径:
os.path.abspah(os.path.pardir)

总结

yaml中写入测试数据,针对每一个测试用例,可以标明不同的paramsexpected等测试数据结构,而在测试用例文件中,只需要一个测试函数即可执行全部的测试用例,逻辑清晰且有效的降低了测试函数的编写工作量,同时将测试数据与测试用例操作相分离,如果后续有更改,也会更加方便。

自我记录,有错误欢迎指正~

你可能感兴趣的:(pytest-一波分离及配置实践记录)