selenium3 web自动化测试框架 五: 数据驱动简介及基础使用
1.数据驱动概述
相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离,这样的测试脚本设计模式称为数据驱动。简单的理解为数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。通过使用数据驱动测试的方法,可以在需要验证多组数据测试场景中,使用外部数据源实现对输入输出与期望值的参数化,避免在测试中使用硬编码的数据。这种方法对于测试步骤相同而使用不同的输入值和期望值的测试场景尤为重要
实施数据驱动测试步骤如下:
(1)编写测试脚本,脚本需要支持从程序对象、文件或数据库读入测试数据
(2)将测试脚本使用的测试数据存入程序对象、文件或数据库等外部介质中
(3)运行脚本过程中,循环调用存储在外部介质中的测试数据
(4)验证所有的测试结果是否符合预期结果
2.所需库的安装及介绍
a. 安装ddt库
ddt(Data Driver Test)的库可以将测试中的变量进行参数化,使用之前先进行在线安装。
为了创建数据驱动测试,需要在测试类上使用 @ddt 装饰符,在测试方法上使用 @data 装饰符。@data 装饰符可以把参数当做测试数据,参数可以是单个值,列表,元组,字典,对于列表和元组,需要使用 @unpack 装饰符把元组和列表解析成多个参数。
安装命令:
pip install ddt
b.安装xlrd库
为了支持对Excel 数据表的支持,需要安装 xlrd 库
xlrd 库提供了对工作簿,工作表以及单元格的读取方法,如果需要往表格中写入数据,需要安装xlwt 库,此外 openpyxl 库提供了对表格的读写操作 (注意openpyxl只能操作xlsx文件而不能操作xls文件)。
安装命令:
pip install xlrd
3. 一个简单的无关web自动化的操作示例
主要演示了ddt的基础的使用,主要关注格式的使用
import unittest import ddt ''' ''' @ddt.ddt class MyTestCase(unittest.TestCase): def setUp(self): pass def tearDown(self): pass @classmethod def setUpClass(cls): pass @classmethod def tearDownClass(cls): pass @ddt.data( [1,2], [3,4], [5,6] ) @ddt.unpack def test_add(self,a,b): print(a+b) if __name__ == '__main__': unittest.main()
一个带参数的web用例演示
# -*- coding: utf-8 -*- # @Time : 2019/11/21 0021 7:12 # @Author : DDD # @Site : # @File : second_demo.py # @Software: PyCharm import ddt import time import unittest from selenium import webdriver from business.register_business import RegisterBusiness @ddt.ddt class MyDdtCase(unittest.TestCase): @classmethod def setUpClass(cls): print("所有步骤前置操作(测试计划):测试计划之前只执行一次") @classmethod def tearDownClass(cls): print("所有步骤后置操作(测试计划):测试计划结束后只执行一次") def setUp(self): print("每条用例执行的前置步骤") self.driver = webdriver.Chrome() url = "http://www.5itest.cn/register" self.driver.get(url) self.driver.maximize_window() self.register_business = RegisterBusiness(self.driver) def tearDown(self): print("每条测试用例的后置步骤") self.driver.close() @ddt.data(["1@test", "name1", "123456"], ["2@test", "name2", "223456"]) @ddt.unpack def test_ddt_case(self,email,name,pwd): test_login = self.register_business.base_case(email,name,pwd) time.sleep(3) return self.assertTrue(test_login) if __name__ == '__main__': unittest.main()