数据驱动——自动化测试

本文探讨了在UI自动化测试中如何实现数据驱动,包括使用ddt模块、txt文件、csv文件、Excel文件、XML文件和MySQL数据库等方式。通过实例展示了如何从不同数据源读取数据,并应用于测试用例,简化测试维护工作。
摘要由CSDN通过智能技术生成

在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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值