文章目录
一、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: 登录帐号不存在