11 web 自动化之 DDT 数据驱动详解

发布于:2025-05-16 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、DDT 数据驱动介绍

数据驱动: 现在主流的设计模式之一(以数据驱动测试)
结合 unittest 框架如何实现数据驱动? ddt 模块实现
数据驱动的意义: 通过不同的数据对同一脚本实现循环测试,最终实现数据与脚本的分离
ddt 模块模块的安装: pip install ddt
ddt 模块: 一个类装饰器 + 三个装饰器方法

  • ddt 类装饰器:装饰继承 unittest.TestCase 的类
  • data 装饰器方法 data()装饰器方法:把列表、元组、字典作为参数
  • unpack 装饰器方法:实现把复杂的数据实现分解成多个数据
  • file_data装饰器方法:可以直接接收数据文件(json 数据/基于 yaml 数据文件),实现循环测试

二、实战

用了三种方式去实现数据驱动:

方法名 数据参数类型 从哪读取数据 备注
test_login_fail1 元组 直接提供
test_login_fail2 列表 yaml 文件 yaml 数据读取参考 web 自动化之 yaml 数据/日志/截图
test_login_fail3 字典 yaml 文件
import os.path
import unittest
from TestPOM.pageobjects.login_page import LoginPage
from TestPOM.testdata import login_datas as ld
from selenium import webdriver
from ddt import ddt, data, unpack, file_data
from TestPOM.common.getdatas import Data
from TestPOM.common import dir_config as Dir
@ddt
class TestLogin(unittest.TestCase):
    @unittest.skip("skip")
    def test_login_success(self):
        # 实例化对象
        self.driver = webdriver.Edge()
        loginPage = LoginPage(self.driver)
        loginPage.login(username=ld.success[0], password=ld.success[1])
        loginPage.sleep(2)


    # 传入数据参数(列表/元组/字典)。实现数据驱动
    # data 表示测试数据是直接提供的。
    @unittest.skip("skip")
    @data(("hc_test","hctest123456","密码错误"),("hc_test1","hctest123","登录帐号不存在"))
    def test_login_fail1(self,login_data):
        # 实例化对象
        self.driver = webdriver.Edge()
        loginPage = LoginPage(driver=self.driver)
        loginPage.login(login_data[0], login_data[1])
        loginPage.sleep(2)
        # 断言:登录结果
        login_msg = loginPage.login_msg()
        print(login_msg)
        self.assertEqual(login_data[2], login_msg)

    @unittest.skip("skip")
    @data(*Data("fail").data[0])
    def test_login_fail2(self,login_data):
        # 实例化对象
        self.driver = webdriver.Edge()
        loginPage = LoginPage(driver=self.driver)
        loginPage.login(login_data[0], login_data[1])
        loginPage.sleep(2)
        # 断言:登录结果
        login_msg = loginPage.login_msg()
        print(login_msg)
        self.assertEqual(login_data[2], login_msg)

    file_name = os.path.join(Dir.testdata_dir,"login_fail.yaml")
    @file_data(file_name)
    # unpack 表示,对于每一组数据(dic、list 或者 tuple),那么就分拆成独立的参数。
    # 注意:如果传入的数据是字典,方法参数名必须和字典的key一样
    @unpack
    @unittest.skip
    def test_login_fail3(self,username,password,error_message):
        # 实例化对象
        self.driver = webdriver.Edge()
        loginPage = LoginPage(driver=self.driver)
        loginPage.login(username, password)
        loginPage.sleep(2)
        # 断言:登录结果
        login_msg = loginPage.login_msg()
        print(login_msg)
        self.assertEqual(error_message, login_msg)

    @data(("hc_test","hctest123","登录成功"),("hc_test","hctest123456","密码错误"),("hc_test1","hctest123","登录帐号不存在"))
    def test_login(self,login_data):
        # 实例化对象
        self.driver = webdriver.Edge()
        loginPage = LoginPage(driver=self.driver)
        loginPage.login(login_data[0], login_data[1])
        # 断言:登录结果
        login_msg = loginPage.login_msg()
        print(login_msg)
        self.assertEqual(login_data[2], login_msg)

test_datas.yaml 文件内容(test_login_fail2 方法用到):

login:
  url : "/user/logininfo.html"
  success:
    - hc_test
    - hctest123
  fail:
    -
      - hc_test
      - hctest123456
      - 密码错误
    -
      - hc_test1
      - hctest123
      - 登录帐号不存在

login_fail.yaml 文件内容(test_login_fail3 方法用到):

-
  username: hc_test
  password: hctest123456
  error_message: 密码错误
-
  username: hc_test1
  password: hctest123
  error_message: 登录帐号不存在

网站公告

今日签到

点亮在社区的每一天
去签到