在UI自动化测试中测试数据一般都是和代码相互分离的,这是为了之后更好地维护自动化的代码。当测试数据发生变化时,只需要在存放数据的模块中进行修改即可,而不需要进入代码中去寻找有数据的部分,从而减轻工作量。在测试中数据驱动有下面几种方式,具体实现和用法如下。
1. ddt
在ddt模块中,@data表示的是类型为元组的数据,@unpack是把元祖,列表,字典拆开传给测试案例。通常情况下,data中的数据按照一个参数传递给测试用例,如果data中含有: 元组,列表,字典等数据,默认是pack(包裹一起的),即一个列表作为一个变量传给函数里的变量。如果把列表的数据进行分解,必须加上@unpack。
例如
@data([a,b],[c,d])
无@unpack,那么[a,b]一个列表,作为一个参数传给测试用例
有@unpack,那么[a,b]被分解开,作为两个参数a,b 分别传给测试用例
import unittest
from ddt import ddt,data,unpack
@ddt
class MyTesting(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
@data([1,2,3])
def test_1(self,value):
print('test_1 value is ',value)
'''
打印的值是[1,2,3]
'''
@data([1,2,3])
@unpack
def test_2(self,a,b,c):
print('unpack test ',a,b,c)
'''
打印值为1,2,3
'''
if __name__ == '__main__':
unittest.main(verbosity=2)
实际情况使用如下
import unittest
from selenium import webdriver
from ddt import data, unpack, ddt
from time import sleep
"""
ddt来进行数据驱动
把@ddt的数据放在一个列表中取用
"""
def getData():
"""数据分离出来放在列表中"""
return [
['123', '', '请输入密码'], ['', '123', '请输入登录名']
]
@ddt
class SinaLogin(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get("https://www.sina.com.cn/")
self.driver.implicitly_wait(2)
def tearDown(self) -> None:
self.driver.quit()
# print("end")
# 在此处设置data的数据来源,使用getData()返回数据,前面加*是将数据类型转换为元组,因为@data只能接收元组数据
@data(*getData())
@unpack
def test_login(self, username, pwd, res):
"""登录的各种情况"""
sleep(2)
self.driver.find_element_by_xpath('//*[@id="SI_Top_Login"]/a').click()
self.driver.find_element_by_xpath('//*[@id="SI_Top_LoginLayer"]/div/div[2]/ul/li[2]/input').send_keys(username)
self.driver.find_element_by_xpath('//*[@id="SI_Top_LoginLayer"]/div/div[2]/ul/li[3]/input').send_keys(pwd)
self.driver.find_element_by_xpath('//*[@id="SI_Top_LoginLayer"]/div/div[2]/ul/li[6]/span/a').click()
sleep(1)
# 获取点击登录后的结果
r1 = self.driver.find_element_by_class_name('login_error_tips').text
print('输出结果为:', r1)
sleep(5)
self.assertEqual(r1, res)
if __name__ == '__main__':
unittest.main(verbosity=2)
注意:当使用了ddt后,ddt中若有多组数据,那么test函数就会运行多次,即使在代码中test函数只写了一遍。例如在上述例子中,ddt中有2组数据,在运行代码时,结果执行了2次test_login()函数
2.txt文件
sina.txt
123
请输入密码
123
请输入登录名
txtTest.py
import unittest
from time import sleep
from selenium import webdriver
"""
从txt文件中读取数据
"""
def getTxtData(index):
"""
读取txt文件
:param index: txt文件的行号,从0开始为第一行
:return: 列表,每一行的内容为列表中的一个元素
"""
with open('sina1.txt', 'r', encoding='utf-8') as f:
# 按行读取内容
d = f.readlines()
return d[index]
class SinaLogin(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Chrome()
self.driver.get('https://www.sina.com.cn/')
def tearDown(self) -> None:
self.driver.quit()
def login(self, uname, pwd)