【Python + yaml】之yaml文件数据驱动(包括DDT驱动)

写自动化测试代码中,数据驱动传递参数比较方便一些,也便于后期维护,下面介绍两种数据驱动:

 

下面是test.yaml文件:

复制代码
start_HRApp:
  ip: 127.0.0.1
  port: 4723
  implicitly_wait: 10
  caps:
    android:
      platformName: Android
      #模拟器
      platformVersion: 6.0
      deviceName: OPPO
      appPackage: com.csksc2b.invertory
      appActivity: com.csks.login.SplashAty
#      noReset: True
#      unicodeKeyboard: True
#      resetKeyboard: True
#      autoGrantPermissions: True
      automationName: uiautomator2
    ios:
复制代码

①用于一般文件的yaml数据驱动:【个人推荐这个】,它不仅可以用在测试用例,也可以用在其他py文件中

复制代码
from appium import webdriver
import yaml
import os

def des_caps():

    # 基础路径
    base_dir = os.path.dirname(os.path.dirname(__file__))
    # yaml路径
    yaml_path = base_dir + "/data/ddt_data_file.yaml"
    # 获取yaml的数据
    with open(yaml_path,'r',encoding='utf-8') as file:
        data = yaml.load(file)
    start = data['start_HRApp']
    Cap = start['caps']['android']

    driver = webdriver.Remote("http://"+ str(start['ip']) +":"+ str(start['port']) +"/wd/hub",Cap)
    driver.implicitly_wait(10)

    return driver
复制代码

========================================================= 

yaml文件

复制代码
case01:
  url: https://ascendas.17mine.cn/basic/pick/selectPage
  headers:
    Authorization: eyJhbGciOiJIUzI1NiJ9.eyJuZWVkRWRpdCI6LTEsImxvZ2luVGltZSI6MTU5MDYyOTYwMTU0NSwibG9naW5XYXkiOjEsInVzZXJOYW1lIjoi5byg55WFIiwidXNlcklkIjoiMTI1NDI5NDE4NzAzODM0NzI2NCIsImxvZ2luU291cmNlIjotMSwiYWNjb3VudCI6IjEzNjQyMDQwNjMxIiwiZXhwIjoxNTkwNjcyODAxfQ.qydhemA3sGfrBuHFWcTi8OdaOcm7hvIpgErtkQ2OVBo
  payload:
    pageNum: 1
    pageSize: 1
    user_id: 1254294187038347264
    userId: 1254294187038347264
    infos_id: 1207504682260500480
    infoId: 1207504682260500480
复制代码

或者自定义一个方法:

复制代码
    def yamlData(self):
        '''获取yaml数据'''
        self.path = os.path.dirname(os.path.abspath(__file__))
        # yaml路径
        self.yamlPath = self.path + "/data/case_data.yaml"
        # 获取yaml数据
        with open(self.yamlPath, 'r', encoding='utf-8') as file:
            data = yaml.load(file)
        return data
复制代码

然后再引用:

    def test_request01(self):
        case01 = self.yamlData()['case01']
        url = case01['url']
        payload = case01['payload']
        headers = case01['headers']

        r = requests.post(url,params=payload,headers=headers).json()
        self.assertEqual(r['data']['records'][0]['stockOutName'],"0506测试仓库")

 

②用于测试用例中的yaml数据驱动(DDT):

yaml文件:

case02:
  url: https://www.v2ex.com/api/nodes/show.json
  payload:
    name: python

 

复制代码
import unittest
import requests
import os
import yaml
from ddt import ddt, data, file_data, unpack


@ddt
class TestResquest(unittest.TestCase):
    @file_data('./data/case_data.yaml')
    @unpack
    def test_request02(self,**kwargs):
        url = kwargs['url']
        payload = kwargs['payload']
        r = requests.get(url,params=payload).json()
        self.assertEqual(r['id'],901)
复制代码

但是DDT有一点不好的是不灵活,如果有两个case的yaml,想获取url,他会把两个URL一块执行再一个用例中

复制代码
case01:
  url: https://ascendas.17mine.cn/basic/assemble/selectPage
  headers:
    Authorization: eyJhbGciOiJIUzI1NiJ9.eyJuZWVkRWRpdCI6LTEsImxvZ2luVGltZSI6MTU5MTE0NDk2NTExOSwibG9naW5XYXkiOjEsInVzZXJOYW1lIjoi5byg55WFIiwidXNlcklkIjoiMTI1NDI5NDE4NzAzODM0NzI2NCIsImxvZ2luU291cmNlIjotMSwiYWNjb3VudCI6IjEzNjQyMDQwNjMxIiwiZXhwIjoxNTkxMTg4MTY1fQ.OiSBpkRJMZsABAlKhfo4P2cmZuqk6V63vDACZBY5Xs8
  payload:
    pageNum: 1
    pageSize: 1
#    user_id: 1254294187038347264
#    userId: 1254294187038347264
#    infos_id: 1207504682260500480
    infoId: 1207504682260500480


case02:
  url: https://www.v2ex.com/api/nodes/show.json
  payload:
    name: python
复制代码

 

 

 如果想测试重复的用例可以适用这个。但是变化较多的字段的用例不适用。

如下测试重复的用例:

复制代码
用例1:
  data1:
    - keys: "yaml01"
    - keys: "yaml02"
  data2:
    - keys: "yaml03"
    - keys: "yaml04"
用例2:
  data1:
    - keys: "yaml05"
    - keys: "yaml06"
  data2:
    - keys: "yaml07"
    - keys: "yaml08"
用例3:
  data1:
    - keys: "yaml09"
    - keys: "yaml10"
  data2:
    - keys: "yaml11"
    - keys: "yaml12"
复制代码

代码:

复制代码
import unittest
import requests
import os
import yaml
from ddt import ddt, data, file_data, unpack


@ddt
class TestResquest(unittest.TestCase):
    @file_data("../data/ddt_data_file.yaml")
    @unpack
    def test_baiduSearch03(self,**kwargs):
        keys = kwargs['data1'][1]['keys']
        print("第三组测试用例:",keys)
        self.baidu_search(keys)
        self.assertEqual(self.driver.title, keys + "_百度搜索", msg="标题不正确!")
复制代码

一个用例可以执行三遍

 

 

 

优缺点:

①一般的yaml方法,可以适用于任何文件,只是写法有点繁琐,适用于多种用例,较灵活

②DDT的yaml方法,只能用于测试用例文件中,写法简单,适用于一种重复性用例,不灵活。

 

拓展:

YAML、YML在线编辑(校验)器

把yaml文件转换成json

 

posted @   Owen_ET  阅读(2532)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 模様 (TV size ver.) Ivy to Fraudulent Game
  3. 3 河口恭吾
  4. 4 愛してる 高鈴
  5. 5 一生所爱 卢冠廷,莫文蔚
  6. 6 世间美好与你环环相扣 柏松
  7. 7 理想三旬 陈鸿宇
  8. 8 不浪漫罪名 王杰
  9. 9 樱花树下 张敬轩
  10. 10 因为你在 达闻西乐队,福禄寿FloruitShow
  11. 11 悬溺 葛东琪
模様 (TV size ver.) - Ivy to Fraudulent Game
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 寺口 宣明

作曲 : 寺口 宣明

流れに逆らって

何かにぶつかって

色は変わっているけど

鳞の傷は

光を受けて

模様みたいに綺麗だった

言葉を持ってしまった

僕らの体は

鮮やかじゃないけど

重ねた傷も

あの痛みさえも

僕にとっての模様だった

最近ではこの街も少し分かってきた

カバンだとか優しさまでもが邪魔になるよ

もう少し早く歩くために捨てたのに

忘れ物したような顔して立ち止まるのはなぜ

流れに飲まれて

たどり着く先で

何が見えるのだろう

届かぬ光と

もがきもせずに

身を委ねて

沈んでゆく

言葉を持ってしまった

僕らの心は

雑草にまみれて

でもその中でやっと見つけた

夜更けに咲く小さい花

いつも角を曲がるたびに

後ろ振り向くたびに

見えなくなるもの

会えなくなる人

それでも選んだ場所へと

痛みの中で歩いてきた

流れに逆らって

何かにぶつかって

色は変わっているけど

鳞の傷は

光を受けて

模様みたいに綺麗だった

言葉を持ってしまった

僕らの体は

鮮やかじゃないけど

重ねた傷も

あの痛みさえも

僕にとっての模様になる

一つだけの模様になる

点击右上角即可分享
微信分享提示