Python+Selenium笔记(十二):数据驱动测试

(一)   前言

通过使用数据驱动测试,实现对输入值和预期结果的参数化。(例如:输入数据和预期结果可以直接读取Excel文档的数据)

(二)   ddt

使用ddt执行数据驱动测试,ddt库可以将测试中的变量参数化。使用ddt的时候,在测试类上使用@ddt装饰符,在测试方法上使用@data装饰符。@data装饰符将参数当作测试数据,参数可以是单个值、列表、元组、字典。对于列表和元组,需要用@unpack装饰符把列表和元组解析成多个参数。

使用下面的命令安装ddt库

pip install ddt

(三)   通过Excel获取数据

读取Excel文件,需要用到xlrd库。

安装xlrd的库

pip install xlrd

如果要往Excel表格写数据,需要用到xlwt库

pip install xlwt

(四)   示例中用到的excel文件


邮箱


手机


登陆名称


昵称


密码


确认密码


预期结果


[email protected]


1


bky_110


盘古


test>100


test>100


手机号码有误


[email protected]


18898989878


b


盘古


test>100


test>100


不合要求,至少2个字符,最多30个字符

(五)   示例

 1 from selenium import webdriver
 2 from ddt import ddt,data,unpack
 3 import xlrd
 4 import unittest
 5 #读取excel文件的函数
 6 def get_data(file_name):
 7     rows = []
 8     #读取excel的数据
 9     book = xlrd.open_workbook(file_name)
10     #通过索引访问第一个sheet页
11     sheet = book.sheet_by_index(0)
12     #迭代读取excel第一个sheet页的数据,sheet.nrows指excel的行数
13     for r_idx in range(1, sheet.nrows):
14         #row_values读取第r_idx行的数据(0代表读取第1列及后面所有列的数据)
15         #读取数据的时候,我们一般说的第一行、第一列,索引都是0
16         #所以r_idx=1的时候,读取的其实是excel第二行的数据
17         rows.append(list(sheet.row_values(r_idx,0)))
18         #先将手机号删除并赋值给pthone,然后转换为字符串并添加回原来的位置
19         pthone = rows[r_idx - 1].pop(1)
20         rows[r_idx - 1].insert(1, str(int(pthone)))
21     return rows
22 @ddt
23 class RegisterNewUserDDT(unittest.TestCase):
24     @classmethod
25     def setUpClass(cls):
26         cls.driver = webdriver.Chrome()
27         cls.driver.implicitly_wait(20)
28         cls.driver.maximize_window()
29         cls.driver.get(‘https://www.cnblogs.com/‘)
30         login_area = cls.driver.find_element_by_css_selector(‘#login_area‘)
31         register = login_area.find_element_by_link_text(‘注册‘)
32         register.click()
33     #读取excel文件的数据作为参数
34     @data(*get_data(‘data/reTest.xlsx‘))
35     @unpack
36     def test_register_new_user(self,email,phone,login_name,nickname,password,confirm_password,expected_result):
37         driver = self.driver
38         self.assertTrue(‘用户注册 - 博客园‘ == driver.title)
39         # 定位注册页面各个字段
40         user_email = driver.find_element_by_id(‘Email‘)
41         user_phone_country = driver.find_element_by_id(‘CountryCode‘)
42         user_phone = driver.find_element_by_id(‘PhoneNum‘)
43         user_login_name = driver.find_element_by_id(‘LoginName‘)
44         user_nickname = driver.find_element_by_id(‘DisplayName‘)
45         user_password = driver.find_element_by_id(‘Password‘)
46         user_confirm_password = driver.find_element_by_id(‘ConfirmPassword‘)
47         #清除各字段的值(如果有)
48         user_email.clear()
49         user_phone.clear()
50         user_login_name.clear()
51         user_nickname.clear()
52         user_password.clear()
53         user_confirm_password.clear()
54         #输入邮箱、手机号等信息
55         user_email.send_keys(email)
56         user_phone.send_keys(phone)
57         user_login_name.send_keys(login_name)
58         user_nickname.send_keys(nickname)
59         user_password.send_keys(password)
60         user_confirm_password.send_keys(confirm_password)
61         #判断提示是否正确(这边应该有办法可以获取当前是第几次执行,下面的写法太死板了)
62         if phone == ‘1‘:
63             phone_error = driver.find_element_by_id(‘PhoneNum-error‘)
64             self.assertTrue(phone_error.text == expected_result)
65         elif login_name == ‘b‘:
66             loginName_error = driver.find_element_by_id(‘LoginName-error‘)
67             self.assertTrue(loginName_error.text == expected_result)
68
69     @classmethod
70     def tearDownClass(cls):
71         cls.driver.quit()

原文地址:https://www.cnblogs.com/simple-free/p/8485820.html

时间: 2024-08-28 02:26:07

Python+Selenium笔记(十二):数据驱动测试的相关文章

Python+Selenium笔记(二):配置谷歌+IE环境

#有的时候可能要访问外国的网站下载资料或工具,这时可能出现各种问题,例如谷歌人机验证显示不了.网站打不开等,建议使用一个FQ软件 下载免费版的就行了,土豪请随意.下载后直接安装就行了 http://www.softpedia.com/get/Internet/Servers/Proxy-Servers/Lantern.shtml (一)  设置IE (1)   http://docs.seleniumhq.org/download/  下载IEDriverServer.(建议下载32位的,64位

python学习笔记(十二) - 常用内建模块

一.collections 1. namedtuple namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素. from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) p = Point(1, 2) print p.x print p.y 2.deque deque是为了实现高效插入和高效删除操作的双向列表

python 学习笔记十二之 html基础(进阶篇)

HTML 超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中的各个部分.网页文件本身 是一种文本文件,通过在文本文件中添加标记符, 可以告诉浏览器如何显示其中的内容(如:文字如何处理,画面如何安排,图片如何显示等).浏览器按顺序阅读 网页文件,然后根据标记符解释和显示其标记的内容,对书写出错的标记将不指出其错误, 且不停止其解释执行过程,编制者只能通过显示效果来分析出错原因和出 错部位.但需要注意的是,对于不同的浏览器,对同一标记符可能会有

python学习笔记十二:类的定义

demo #!/usr/bin/python class Person: name = 'jim' age = 25 def say(self): print 'My name is ' + self.name + ', and age is ' + str(self.age) p = Person() p.say() print p.name

python学习笔记(十二)-网络编程

本文结束使用 Requests 发送网络请求.requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到.可以说,Requests 完全满足如今网络的需求. 安装方式一般采用$ pip install requests. 一开始要导入 Requests 模块: import requests 发送get请求 url = 'http://api.xxx.com/api/user/stu_info?stu_name=小黑马' req = requests.

python 学习笔记十二 CSS基础(进阶篇)

1.CSS 简介 CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内容与表现分离的问题 外部样式表可以极大提高工作效率 外部样式表通常存储在 CSS 文件中 多个样式定义可层叠为一 css存在方式: 元素内联 页面嵌入 外部引入 语法:style = 'key1:value1;key2:value2;' 1.元素内联(在标签中使用css) <!--在标签使用--> &

python学习笔记十——异常处理

1.try: command except 错误类型,记录错误信息变量: command finally: command try...finally的用处是无论是否发生异常都要确保资源释放代码的执行.一般来说,如果没有发生错误,执行过try语句块之后执行finally语句块,完成整个流程.如果try语句块发生了异常,抛出了这个异常,此时就马上进入finally语句块进行资源释放处理.如下从几个细节讨论finally的特性. 1).try中的return: 当在try语句块中含有return语句

《Hibernate学习笔记十二》学生、课程、分数关系的设计与实现

<Hibernate学习笔记十二>学生.课程.分数关系的设计与实现 这个马士兵老师的Hibernate视频学习的一个题目,这里面要用到多对多.多对一的关联关系以及联合主键,因此觉得挺好的,自己写篇博文来记录下. 先考虑数据库表 1.学生表:为简单起见,只考虑了学生id和学生姓名,其中id为主键 2.课程表:为简单起见,只考虑了课程id和课程名称,其中id为主键 3.分数表 分数表有两种解决方案 3.1 第一种为:使用联合主键:student_id 和 course_id 3.2 第二种:不使用

简明Python教程笔记(二)----用户交互raw_input()

raw_input() python内建函数 将所有输入看做字符串,返回字符串类型 input()对待纯数字输入时具有自己的特性,它返回所输入的数字的类型( int, float ) input() 本质上还是使用 raw_input() 来实现的,只是调用完 raw_input() 之后再调用 eval() 函数 例子: #!/usr/bin/env pythonthis_year = 2014name = raw_input('please input your name:')age1 =

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];