数据驱动自动化测试全解析:配置、参数化与脚本编写指南

数据驱动自动化测试全解析:配置、参数化与脚本编写指南

数据驱动测试是自动化测试的核心方法,它将测试数据与测试逻辑分离,大幅提升测试效率。以下是我为你整理的详细教程,涵盖主流数据格式、参数调用方法和脚本编写技巧,并分析各自的优缺点。

一、数据文件配置方案对比

1. CSV (逗号分隔值)

username,password,expected_result
testuser1,pass123,success
testuser2,wrongpass,failure

优点:简单轻量,支持批量导入导出,几乎所有编程语言都支持解析。

缺点:不支持复杂数据结构,缺乏类型支持,难以表示层级关系。

适用场景:简单表格数据,适合批量数据处理。

2. JSON (JavaScript对象表示法)

[
  {
    "username": "testuser1",
    "password": "pass123",
    "expected_result": "success",
    "profile": {
      "age": 30,
      "email": "user1@example.com"
    }
  }
]

优点:轻量易读,支持复杂嵌套结构,广泛用于API测试。

缺点:不支持注释,复杂结构可读性下降。

适用场景:Web API数据交换,配置文件,中等复杂度数据。

3. YAML (YAML Ain't Markup Language)

- username: testuser1
  password: pass123
  expected_result: success
  profile:
    age: 30
    email: user1@example.com

优点:语法简洁,支持层级结构,可读性强,支持注释。

缺点:解析性能一般,不同语言解析库兼容性有差异。

适用场景:配置文件,测试用例描述,需要人工编辑的数据。

4. XML (可扩展标记语言)

<?xml version="1.0" encoding="UTF-8"?>
<testdata>
    <users>
        <user id="1">
            <username>testuser1</username>
            <password>pass123</password>
        </user>
    </users>
</testdata>

优点:结构严谨,支持命名空间和XSD模式验证,适合复杂层级数据。

缺点:冗长,解析复杂,不适合快速迭代场景。

适用场景:企业级应用,配置文件,需要严格验证的数据。

5. Excel (.xlsx)

testuser1

pass123

success

testuser2

wrongpass

failure

优点:可视化编辑,支持公式和格式,适合非技术人员维护数据。

缺点:版本控制困难,解析复杂,不适合大量数据。

适用场景:测试用例管理,需要业务人员参与的数据维护。

二、参数调用方法实现

1. Python unittest + CSV参数化

import unittest
import csv

class TestLogin(unittest.TestCase):
    
    def get_test_data(self):
        data = []
        with open('test_data.csv', 'r') as file:
            reader = csv.DictReader(file)
            for row in reader:
                data.append(row)
        return data
    
    def test_login(self):
        for item in self.get_test_data():
            result = perform_login(item['username'], item['password'])
            self.assertEqual(result, item['expected_result'])

2. Pytest + YAML参数化

import pytest
import yaml

def get_yaml_data(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        return yaml.safe_load(f)

test_data = get_yaml_data('test_data.yaml')

@pytest.mark.parametrize("test_case", test_data)
def test_login(test_case):
    result = perform_login(test_case['username'], test_case['password'])
    assert result == test_case['expected_result']

3. Selenium + Excel参数化

import openpyxl
from selenium import webdriver

def get_excel_data(file_path):
    workbook = openpyxl.load_workbook(file_path)
    sheet = workbook.active
    data = []
    for row in range(2, sheet.max_row + 1):
        username = sheet.cell(row, 1).value
        password = sheet.cell(row, 2).value
        data.append((username, password))
    return data

def test_selenium_login():
    driver = webdriver.Chrome()
    test_data = get_excel_data("test_data.xlsx")
    
    for username, password in test_data:
        driver.get("https://example.com/login")
        driver.find_element_by_id("username").send_keys(username)
        driver.find_element_by_id("password").send_keys(password)
        # 执行登录验证

4. XML数据解析与参数化

import xml.etree.ElementTree as ET

def parse_xml_data(file_path):
    tree = ET.parse(file_path)
    root = tree.getroot()
    data = []
    
    for user in root.findall('users/user'):
        data.append({
            'username': user.find('username').text,
            'password': user.find('password').text
        })
    
    return data

三、测试脚本编写最佳实践

1. 分层设计模式

test_case/         # 测试用例层
  test_login.py
  test_register.py
page_object/       # 页面对象层
  login_page.py
  home_page.py
data/              # 数据层
  test_data.csv
  config.yaml
utils/             # 工具层
  logger.py
  data_reader.py

2. 动态数据生成

import random
import string

def generate_random_email():
    letters = string.ascii_lowercase
    username = ''.join(random.choice(letters) for i in range(8))
    domain = random.choice(['gmail.com', 'yahoo.com', 'hotmail.com'])
    return f"{username}@{domain}"

四、亮点技术解析

1. 数据库数据驱动

import pymysql

def get_db_test_data():
    conn = pymysql.connect(
        host='localhost',
        user='testuser',
        password='testpass',
        database='testdb'
    )
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    cursor.execute("SELECT * FROM test_users")
    data = cursor.fetchall()
    conn.close()
    return data

2. 参数化测试报告

import pytest

@pytest.mark.parametrize("username, password", [
    ("admin", "admin123"),
    ("user", "user123")
])
def test_login(username, password, html_report):
    result = perform_login(username, password)
    html_report.append(f"Tested user: {username}")
    assert result == "success"

五、难点与解决方案

大数据量性能优化

分批加载数据、使用生成器惰性加载、并行执行测试用例

数据依赖管理

数据准备阶段创建依赖数据、使用数据库事务回滚、状态机模式管理数据状态

复杂数据结构处理

使用XML/XSD进行严格验证、采用JSONPath/XPath提取复杂层级数据

非技术人员参与

提供Excel模板、开发数据导入导出工具、建立数据校验机制

版本控制问题

优先使用文本格式(CSV/JSON/YAML)、针对Excel提供转换工具、使用轻量级数据库

六、格式选择决策树

  1. 数据结构简单且无需人工编辑 → CSV
  2. 需要支持复杂结构和API测试 → JSON
  3. 需要可读性和人工维护 → YAML
  4. 需要严格验证和企业级集成 → XML
  5. 需要业务人员直接参与 → Excel

通过以上方法,便可以构建一个完整的数据驱动测试体系。关键是根据项目需求选择合适的数据格式、参数化方法和测试框架,同时注意处理好性能、依赖和清理等难点问题。

测试开发知识汇总 文章被收录于专栏

一些面试当中总结的知识点和测试框架技术选型以及AI赋能测试的内容

全部评论
后端和自动化差不多,都是if else
点赞 回复 分享
发布于 06-24 18:14 广东
太强了
点赞 回复 分享
发布于 06-24 16:36 山东
狠狠学 每个字都要背诵
点赞 回复 分享
发布于 06-24 14:55 北京

相关推荐

我和大多数人一样都是双非,但是凭借努力、坚持和热爱最终春招上岸了🐷厂,作为25届当时找工作确实也是非常折磨,感谢牛客平台给予了很多帮助,故我也想做些分享来让学弟学妹们得到些宝贵的经验值。EXP↑↑↑前期的努力和积累都是不断的打怪升级,找工作就像是副本最后的大Boss。🍀幸运不会眷顾那些没有准备的穿着新兵套装的刚出新手村没经验的菜鸟玩家。首先声明,我不是什么大佬,只是想用自己的经历和那些正在努力但比较迷茫的大学生或者应届生分享下自己的经验。很多东西都是机会过去了才明白,所以还是比较有意义的,希望大家少走弯路。我先来说说我自己的经历,大学学Java比较多,硕士基本上用Python,两段实习一段是在研二的上学期,一段是在研三下学期,都是Java开发。🙉好了废话不多说,直接进入正题:1.本科一定要多积累竞赛经验和实验室项目经验。竞赛+实验室经验好比是开挂刷级,让你尽快成长为满级大佬。尽可能去参加ACM、数学建模国赛等高含金量竞赛,这种是真正对你找工作有巨大帮助的,刚刚经历完高考的大学生一定会想着放松,但是一份好工作值得你提早做规划和打算,多看看一些大佬的路径就知道,他们从大一就开始卷了。就像我一直看的鱼皮大佬,他很早就自学Java去腾讯实习了,也拿到了转正机会。英雄哥也是杭电的ACM队长,竞赛大佬。大二我也意识到这一点,我厚着脸皮加入一个创新实验室做了一个tensorflow深度学习+树莓派的项目,现在看来真的好简单,但是当时做的真的很折磨,因为是比较新的技术。这也是我第一个项目,这教会了我必须要有持续学习新技术的能力。💪2.一定要自学积累足够丰富的项目经验。好的项目经验好比一身金灿灿的神装,一般来说写在一页简历上,两个高质量的项目就够了,把项目理解透彻这是最重要的。我当时写的是一个基于微服务架构和推荐系统的新闻推送平台,还有一个电商系统。(等实习就知道这些项目都写的太基础太垃圾了),简历要突出重点,不要洋洋洒洒写了一大堆,在专业的hr或者技术大佬面前全都是废话,甚至会觉得你连这种最基础的都写这么多,水平也就这样了。多结合一些当前热点,比如集成ai。现在的项目是更新换代非常快的,老项目或者太大众的项目会让你简历通过的概率大大降低。😌3.重中之重,实习!!实习!!实习!!实习好比斩断恶龙的锋利宝剑,没有比实习更好的去实践你的所学知识和实战能力的了,尽可能早的开始实习,大三大四or研二研三尽可能早的开始刷副本。先从大厂投起,实在不行再从中小厂干到大厂。很多人会忽略大三暑假和研二暑假暑期实习的重要性,这是校招生进入大厂的最佳时机!🌟🌟🌟一般三四月份就开始了,这相当于是多了一次提前进行秋招面试的机会。(比如华子,技术岗无春招,显得机会特别宝贵)临近毕业的那份实习也非常重要,认真对待有很大几率转正。(我也获得了实习转正的offer)你是否能拿到正式工作的offer很大程度上取决于你有没有对口的专业和垂直的实习经历。🌟🌟🌟ps:提前看好所在院校是否是各大厂的目标院校,着重准备,个性化针对岗位优化简历,提升简历命中几率。(如一份开发简历可以灵活转换成测试简历)4.找准自身定位,明确自己的目标。学历+项目+竞赛+实习能否匹配的上这个offer多看看一些别人分享的自身情况和最后得到的offer,好好判断一下自身能力是否足够可能拿到那份属于自己的offer。如果结果不好,及时调整目标,及时止损。对于我来说进入大厂,获得一个好的职业初始的发展机会比岗位本身更加重要。我一开始是明确java开发,然而我的学历和综合能力还不够我进入如今就业环境的大厂的开发岗,那么我就给自己定下了目标,大厂的测试开发和中小厂的java开发岗。设定高但是可达到的目标也是非常必要的。接着去看对应公司的所有面经和笔试面试方向内容,了解下考察的重点在哪。🤔去年秋招的时候我还投了各大银行的省分行信息科技岗,亲身经历的体验是六大行的学历门槛基本上都是985本或者211硕以上(省分),城商行(杭银、宁银等)重点本硕有机会。我进了几个终面,碰到的对手都很强,最终也只是被调剂到客户经理,所以说普通学校同学还是不要把重心放在这里,确实希望很小。(环境不好,银行信科比较稳定又吃香,大佬都想求稳,我认识两个工行浙江省分的都是北航本硕的水平)🌝5.坚持与心态调整永远不要放弃,秋招从8月到1月,春招从2月到6月都是有机会的,永远要珍惜机会,珍惜每一次笔试和面试,做好总结。👑👑👑一开始需要使用海投战术,一般这样做会让你先有几个差一些没达到预期的offer,可以不接,但是这是你底气的最好来源。我也是在春招中后期慢慢收到了一些offer,从不满意的到差点意思的,又从差点意思的到满意的,最后很幸运的从满意的到超预期的~🙃所以永远不要放弃进步,当努力从量变达到质变之后,该来的好消息总会来的~!🌸最后,㊗️大家好运~!
大方的迪恩求实习:学习到了
不卡学历的大厂有哪些?
点赞 评论 收藏
分享
头像
07-26 23:59
门头沟学院 Java
已经来到七月底了,26届秋招似乎逐步开始了,25届现在如何了?25届的鼠鼠我已经入职了,和大家分享一下,底层本科真实的处境&nbsp;...&nbsp;...&nbsp;没有方法论&nbsp;..&nbsp;..当我第一次了解到秋招这个词的时候已经是大四了,啥也没学就结束了三年,这三年跟刚破壳的小呆瓜一样,没有记忆,啥也没学,也不知道学了啥,眨眼就过去了,直到升大四的那个暑假&nbsp;...&nbsp;...&nbsp;迎来人生转折点..&nbsp;..那是我无意间下载了牛客,夹缝间偷看到了世界的另一面,了解到了最真实的就业情况,各种信息如潮水般抨击着我,焦虑和不安的情绪指数增长,把我从摆烂的梦床猛然拽出,并甩了我几个大B兜,告诉我再不学就真的完蛋了...&nbsp;...在6.27那天也发布了第一条动态,现在回头看,当时的我真的很呆瓜也是那会确定了,要走上&nbsp;Java&nbsp;这条路了,某马也是直接启动...&nbsp;...当时暑假留在学校,两月快速的把基础看一遍,然后选择了某谷的某公寓项目,没有做外卖。当时敲完公寓后,回想所有所学,好像啥也没学会的感觉,完全没法应对面试,可当时很迫切的想去找实习,但最后没去成,因为导员不给去,那会还是个十分天真听话懂事的乖学生,直接跟导员说想请假实习,但导员不出所料的拒绝了。当时已经是大四了,每天都有两三节课,而且不停的上实验课,很ex有很多同学为了考研翘课去图书馆,然后就各种安排点名和签到,我真..&nbsp;..我好想逃~~却逃不掉~~后续是,反正也没法去实习了,就又继续沉淀了,上手学习某点评了。在这期间认识了一位十分重要的人,top9硕的师兄,虽然不是一个学校的,但我叫他师兄。机缘巧合下加了vx,然后有一搭没一搭的聊了聊天,后来拉我一起背八股,我是零基础学习,师兄是复习了,但师兄没有嫌弃我,还一直鼓励我,每天开腾讯会议,带我讲解小林coding的八股文。我也算是步入正轨,明白学习路线了...&nbsp;...学了四个月左右,虽然有三天打鱼两天晒网的摆烂时刻,但也是硬着头皮,投起了简历,起初都是投一些知名公司的官网,牛客啥的,也有一些海笔,但是根本不会,一点算法不会,于是转投ssob小公司,其实没有花多少时间就约到了面试,并入职了,算是比较幸运,问的八股很基础,没怎么问项目,当时的简历就俩---某公寓+某点评,哈哈哈入职后3.5k一个月,工作时间985,全栈是肯定了,技术栈微服务+React。我觉得我实习太失败了,啥也没学会,没人带,没文档,没架构图,也没有自主学习,一直靠&nbsp;AI&nbsp;写前端,后端crud没含金量,如果能重来,早知道摸鱼背背八股或者刷刷力扣了...&nbsp;...&nbsp;而不是焦头烂额的改前端bug,真的花里胡哨的,项目很答辩...&nbsp;...干两月跑路了,回到学校弄毕设和论文,已经被论文折腾的没有了力气熬过答辩,又回到了找工作的阶段,一直想找个南京8k的薪资百人公司...&nbsp;...结果现实又打脸了,别说8k了,连面试的机会都少的可怜,然后也是妥协了,6-7k也行了。后面是约到了个7k的新能源几百人的公司,过了面试,但后来被鸽了...&nbsp;...当时心态十分爆炸,因为后面一直约不到面试,找不到工作,打算回家了的。但是我还有驾照没考完,没错我当时还报了南京的驾校,但是没有考完,毕业后学校不能留人了,我必须离校,家在广东,驾照却要被卡在南京...&nbsp;...有工作留在南京的话还好,离校后没有工作的话...&nbsp;...真不知道咋办了,那会感觉自己十分的失败,也不想继续问家里人要钱租个房子啥的...&nbsp;...幸运的是,后来有同学也因某些原因不想回家,我们三人一起租了个一千多的整租,在南京郊区的养老小区里,人均摊几百块,算是给我暂时喘了口气,然后首要任务是赶紧把驾照考完,到时候不用被驾照卡住,所幸一周速通拿下驾驶证了在考驾照期间其实是有面试通过的公司,但一个是上海7k试用期不交社保,一个是杭州7k驻场且社保交到其他省份,而且要驻场一年多...&nbsp;...都不是很想去,而且因为要考驾照,就拒了。如果没有驾考的话,我估计就去了的...&nbsp;...驾考救了我一命房子就住一个月,眼看着就剩最后一周,大不了就回家,当时心态没有那么糟糕,还每天都被八股看项目,但是算法没刷。后面峰回路转有几个10k+的初创约了面试,只可惜面试准备的还是太差劲了,基本全军覆没了。但!有一家小公司给了我一个机会,决定让我试试看,虽然压低了薪资,不过也比预期的高了,算算到手应该7k吧,社保和税扣的蛮多的,租房也挺贵的。公司是医疗行业的,目前做的是AI应用开发,做个类似智能客服的业务,也是Java转python了,以后或许还会有Java的项目要做,可能还会重回Java大部队吧有种背井离乡的感觉了此刻,我也算是渡过了校招阶段,进入新的副本,开启新的征途了,这一路走来最大的困难或许就是心态了,焦虑真的很折磨人,保持一个良好的心态真的很不简单如果你和我bg差不多,还醒悟的晚,并且行动力很差,那你很大概率毕业就和我一样了,没有什么秋招春招可言,只有小公司的校招了。为什么是大概率呢?因为确实有厉害的人逆天改命了,三本、专升本同样进了大厂中厂,所以我不想一棒子打死所有人,我甚至觉得,如果你下载了牛客,你已经成功了50%了,并且运气也是实力的一部分呢实力不够运气来凑嘛,希望正在焦虑的你看到这,会有一点缓解吧我觉得校招是学历大于技术的了,好的bg就是有更多的机会,bg不好就要付出更多的努力,才能有一丝丝机会但学历已经没法改变了的话,只能走好眼前路了,现实即是如此了,重要的是先走起来真没想到,如此消极且悲观主义的我,也会说出鼓励的话语...&nbsp;...有点羞耻...&nbsp;...
校招阶段,学历VS技术哪...
点赞 评论 收藏
分享
评论
5
10
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务