pytest-如何做到测试数据与脚本相分离

2021-08-11  本文已影响0人  Rainbow想喝奶茶

我以为今天的工作时间要结束了,看了眼时间,就竟然距离下班还有一个多小时,没有其它的工作内容,索性在码一篇,我在下午看这个部分的教程时候几度感觉昏睡过去而且头疼,但最后实在是没事情做,照着样例一行一行写下来,发现也没有那么难懂了,这个行业不知道是不是只有我,没有什么技术背景也不爱研究,然后还在测试行业努力的生长着。
这篇可以说是结合别人的案例在按照自己所测试的接口来完成的,因为我在写完上一篇然后实践过后,不知道接下来该怎么做了。所以搜索了一下发现“测试数据与脚本相分离”这一个概念。但其实,写完之后感觉反而麻烦,对于现有工作而言增加工作量,但如果之后是一个体系化的系统,可能会有帮助吧。我不确定,但是反正都是学习...当没有什么具体目标的时候,就开始干现在看到的吧,毕竟,不然就是啥也不干了...废话结束。

测试数据与脚本相分离,三个步骤:

存储测试数据到yaml中

我看到有介绍说yaml是为了方便人类读写,我第一次写,败在了空格上。


空格的重要性

如图,如果在键值对中,冒号后不加空格,就不会有特殊颜色标识,在读取时也会报错。
更多yaml的知识有待后续继续补充。
总之,yaml中对应的一份测试数据主要包括三个部分:

读取yaml中的测试数据

这个部分的函数也可以直接写到测试用例执行文件中,不过也是说为了之后更改不互相影响,就也分离开写一个文件。
首先需要下载yaml

pip3 install pyyaml

读取yaml需要用到yaml.load方法,可以把权键值变成类字典。然后就是在这个类字典中一层层剥离,拿到case、http以及expected中包含的键值。
中间用到了zip函数,将对应的元素打包成元组,具体的剥离步骤,就靠print解决了。

import os
import yaml
path=os.path.dirname(__file__)#获取到除了当前文件以外的路径
data_path=os.path.join(path,'test_data.yaml')#获取到yaml路径
def get_test_data(data_path):
    case=[]
    http=[]
    expected=[]
    with open(data_path) as f:
        data=yaml.load(f.read(),Loader=yaml.SafeLoader)#把权键值变成类字典
        print("data:",data)#包括tests在内的字典
        test=data['tests']#剥离出tests
        print("tests:",test)
        for td in test:
            case.append(td.get('case',''))#剥离出case
            http.append(td.get('http',{}))#剥离出http
            expected.append(td.get('expected', {}))#剥离出expected
    print("case:",case)
    print("http:",http)
    print("expected:",expected)
    parameters=zip(case,http,expected)#将case、http、expected合并成一个tuple
    list_params=list(parameters)##zip变成一个list
    print(list_params)#是一个list
    print(list_params[0])#是一个tuple
    print(list_params[0][0])#case部分
    print(list_params[0][1])#http部分
    print(list_params[0][2]) #expected部分
    return list_params

get_test_data(data_path)#验证获取数据

执行测试数据

利用之前获取到的数据,进行各项值的传递。

import requests
import os
import commlib
path=os.path.dirname(__file__)
data_path=os.path.join(path,'test_data.yaml')
url='https://xxx'
class Test_rps:

    def test_statistics(self):
        list_params=commlib.get_test_data(data_path)
        now_url=url+list_params[0][1]["path"]
        params=list_params[0][1]["params"]
        response=requests.get(now_url,params=params)
        res=list_params[0][2]["response"]["statuscode"]
        assert response.status_code==res

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

上一篇 下一篇

猜你喜欢

热点阅读