数据驱动
- 数据驱动测试时自动化测试中的主流设计模式之一,属于中级自动化测试工程师必备知识,必须深入掌握数据驱动测试的工作原理和实现方法
概述:
- 所谓数据驱动,时指相同的测试脚本使用不同的测试数据来执行,测试数据与测试行为完全分离,这样的测试脚本设计模式称为数据驱动。例如,测试网站的登录功能,自动化测试工程师想验证不同的用户名和密码在网站登录时对系统影响结果,就可以使用数据驱动模式来进行自动化模式
实现数据驱动测试步骤如下:
- 编写测试脚本,脚本需要支持从程序对象、文件或数据库读入测试数据
- 将测试脚本使用的测试数据存入程序对象、文件或数据库等外部介质中
- 运行脚本过程中,循环调用存储在外部介质中的测试数据
- 验证所有的测试结果是否符合预期结果
使用 unittest 结合 ddt 进行数据驱动
使用 unittest 单元测试框架进行数据驱动的话需要引入 ddt 模块
import ddt
测试用例逻辑:
-
打开百度首页
-
在搜索狂中输入一个关键词
-
单击搜索按钮
-
验证搜索结果页面是否包含预期关键字符串
unittest 结合 dtt 代码示例
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import unittest
import ddt
import time
@ddt.ddt
class TestDemo(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Chrome()
self.driver.get('https://www.baidu.com/')
self.driver.maximize_window()
self.driver.implicitly_wait(30)
@ddt.data(
["大话西游之月光宝盒", "周星驰"],
["飞驰人生", "沈腾"],
["夏洛特烦恼", "马丽"]
)
@ddt.unpack # 先不加unpack试试效果
def test_search(self, keyword, expected):
try:
self.driver.find_element_by_id('kw').send_keys(keyword)
self.driver.find_element_by_id('su').click()
time.sleep(3)
self.assertTrue(expected in self.driver.page_source)
except NoSuchElementException as e:
print("查找的页面元素不存在,Error:{}".format(e))
except AssertionError as e:
print("断言错误,搜索:{},期望:{}".format(keyword, expected))
except Exception as e:
print(e)
def tearDown(self) -> None:
time.sleep(3)
self.driver.quit()
if __name__ == '__main__':
unittest.main()
要点:
- 必须引入 ddt 模块
- 需要声明使用 @ddt.ddt
- 在测试方法前使用 @ddt.data()添加所需要的数据(可迭代对象),多组数据间以逗号“,”隔开,以此判断执行的次数
- 如果每组测试数据存在多个测试数据,需要将每组数据存于列表中
- 每组数据中的数据与测试方法中定义的形参个数及顺序一一对应
- 使用 unpack 进行解包操作
使用json数据文件进行数据驱动
data.json文件
[
"邓肯||蒂姆",
"詹姆斯||勒布朗",
"杜兰特||凯文",
"乔丹||迈克尔",
"库里||史蒂芬"
]
sample.py文件
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import HTMLTestRunner
import unittest
import ddt
import logging
import time
import os
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(filename)s - %(levelname)s - %(message)s",
datefmt='%a, %Y - %m - %d %H: %M: %S',
)
@ddt.ddt
class TestDemo(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
logging.info("测试开始啦")
def setUp(self) -> None:
self.driver = webdriver.Chrome()
self.driver.get('https://www.baidu.com/')
self.driver.maximize_window