自动化测试之数据驱动
数据驱动的思想:
在自动化测试过程中,把测试过程中使用到的数据单独的分离到文件中,这样统一来管理具体的测试数据。文件的形式其实有很多的,这里主要说明下json yaml csv excel mysql 文件在UI自动化测试中的应用。
下面主要是针对UI自动化测试的数据进行分离,原始代码为:
from selenium import webdriver
import unittest
import time as t
class BaiduTest(unittest.TestCase):
def setUp(self) -> None: #前提
self.driver=webdriver.Chrome()
self.driver.get('https://mail.sina.com.cn/')
self.driver.maximize_window()
self.driver.implicitly_wait(30)
def tearDown(self) -> None: #清理
self.driver.quit()
def test_sina_null(self):
'''sina邮箱验证:登录账户为空'''
self.driver.find_element_by_class_name('loginBtn').click()
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,'请输入邮箱名')
def test_sina_email_format(self):
'''sina邮箱验证:登录邮箱格式不正确'''
self.driver.find_element_by_id('freename').send_keys('qwert')
self.driver.find_element_by_class_name('loginBtn').click()
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,'您输入的邮箱名格式不正确')
def test_sina_username_error(self):
'''sina邮箱验证:登录账户不匹配'''
self.driver.find_element_by_id('freename').send_keys('asdf@sina.com')
self.driver.find_element_by_id('freepassword').send_keys('asdfg')
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,'登录名或密码错误')
if __name__ == '__main__':
unittest.main()
一、json文件
1、首先我们在当前工程下创建一个data文件夹,我们测试过程要用到的测试数据的文件都要放在这个文件夹下
2、然后我们在data这个文件夹下添加一个为sina.json的json文件

3、然后我们在这个json文件里写入测试数据,以key:value的形式 加双引号 写在大括号里
我们以sina登录模块测试为例:
{
"loginNull": {"username": "","password": "","result": "请输入邮箱名"},
"emailFormat": {"username": "sadert","password": "asrtr","result": "您输入的邮箱名格式不正确"},
"loginError": {"username": "sdrtdt@sina.com","password": "aserty","result": "登录名或密码错误"}
}
4、在当前工程下创建一个包utils,包内创建一个名为operatioJson的python文件

文件里面写入读取json文件的函数
import json
import os
def base_dir():
return os.path.dirname(os.path.dirname(__file__))
def readJson():
#load()对文件进行反序列化,本质上是读取文件里面的内容
return json.load(open(os.path.join(base_dir(),'data','sina.json')))
5.完善后的测试脚本为:
from selenium import webdriver
import unittest
import time as t
from 单元测试框架.utils.operationJson import readJson #调用readJson函数
class sinaTest(unittest.TestCase):
def setUp(self) -> None: #前提
self.driver=webdriver.Chrome()
self.driver.get('https://mail.sina.com.cn/')
self.driver.maximize_window()
self.driver.implicitly_wait(30)
def tearDown(self) -> None: #清理
self.driver.quit()
def test_sina_null(self):
'''sina邮箱验证:登录账户为空'''
self.driver.find_element_by_id('freename').send_keys(readJson()['loginNull']['username'])
self.driver.find_element_by_id('freepassword').send_keys(readJson()['loginNull']['password'])
self.driver.find_element_by_class_name('loginBtn').click()
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readJson()['loginNull']['result'])
def test_sina_email_format(self):
'''sina邮箱验证:登录邮箱格式不正确'''
self.driver.find_element_by_id('freename').send_keys(readJson()['emailFormat']['username'])
self.driver.find_element_by_id('freepassword').send_keys(readJson()['emailFormat']['password'])
self.driver.find_element_by_class_name('loginBtn').click()
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readJson()['emailFormat']['result'])
def test_sina_username_error(self):
'''sina邮箱验证:登录账户密码不匹配'''
self.driver.find_element_by_id('freename').send_keys(readJson()['loginError']['username'])
self.driver.find_element_by_id('freepassword').send_keys(readJson()['loginError']['password'])
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readJson()['loginError']['result'])
if __name__ == '__main__':
unittest.main()
二、yaml文件
安装操作yaml文件的库:pip3 install pyyaml
1.https://ruanyifeng.com/blog/2016/07/yaml.html
2.yaml基本语言规则
大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
3.下面我们演示把测试数据存储到YAML文件里面,分离出来的文件内容为:
loginNull:
username: ""
password: ""
result: "请输入邮箱名"
emailFormat:
username: "asdfgh"
password: "asdfg"
result: "您输入的邮箱名格式不正确"
loginError:
username: "asdfg@sina.com"
password: "asdfgqawsd"
result: "登录名或密码错误"
4.在包内写入读取yaml文件的函数
import yaml
import os
def base_dir():
return os.path.dirname(os.path.dirname(__file__))
def readYaml():
with open(os.path.join(base_dir(),'data','sina.yaml'),encoding='utf-8') as f:
return yaml.safe_load(f) #读取yaml文件以字典的数据类型
5.完善后的测试脚本为:
from selenium import webdriver
import unittest
import time as t
from 单元测试框架.utils.operationYaml import readYaml #调用我们写好的读取yaml文件的函数
class sinaTest(unittest.TestCase):
def setUp(self) -> None:
self.driver=webdriver.Chrome()
self.driver.get('https://mail.sina.com.cn/')
self.driver.maximize_window()
self.driver.implicitly_wait(30)
def tearDown(self) -> None:
self.driver.quit()
def test_sina_null(self):
'''sina邮箱验证:登录账户为空'''
self.driver.find_element_by_id('freename').send_keys(readYaml()['loginNull']['username'])
self.driver.find_element_by_id('freepassword').send_keys(readYaml()['loginNull']['password'])
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readYaml()['loginNull']['result'])
def test_sina_email_format(self):
'''sina邮箱验证:登录邮箱格式不正确'''
self.driver.find_element_by_id('freename').send_keys(readYaml()['emailFormat']['username'])
self.driver.find_element_by_id('freepassword').send_keys(readYaml()['emailFormat']['password'])
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readYaml()['emailFormat']['result'])
def test_sina_username_error(self):
'''sina邮箱验证:登录账户密码不匹配'''
self.driver.find_element_by_id('freename').send_keys(readYaml()['loginError']['username'])
self.driver.find_element_by_id('freepassword').send_keys(readYaml()['loginError']['password'])
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readYaml()['loginError']['result'])
if __name__ == '__main__':
unittest.main()
三、csv文件(表格另存为时,将文件类型保存为CSV)
在Python中读取csv⽂件⾥⾯的使⽤直接使⽤标准库csv就可以的,在csv的库⾥⾯,读取⽂件的⽅式主要分为两种的⽅式,字典或者是列表的⽅式来读取数据。
1.以字典的方式来读取
(1)将csv的文件放到data的文件夹下
(2)在untils的包下创建一个文件,文件内写入以字典的方式读取文件的函数
import csv
import os
def base_dir():
return os.path.dirname(os.path.dirname(__file__))
def readCsvDict():
'''以字典的形式读取数据'''
lists=[]
with open(os.path.join(base_dir(),'data','sina.csv'),encoding='utf-8-sig')as f:
reader=csv.DictReader(f)
for item in reader:
lists.append(dict(item))
return lists
(3)完善后的测试脚本为:
from selenium import webdriver
import unittest
import time as t
from 单元测试框架.utils.operationCsv import readCsvDict
class sinaTest(unittest.TestCase):
def setUp(self) -> None: #前提
self.driver=webdriver.Chrome()
self.driver.get('https://mail.sina.com.cn/')
self.driver.maximize_window()
self.driver.implicitly_wait(30)
def tearDown(self) -> None: #清理
self.driver.quit()
def test_sina_null(self):
'''sina邮箱验证:登录账户为空'''
self.driver.find_element_by_id('freename').send_keys(readCsvDict()[0]['username'])
self.driver.find_element_by_id('freepassword').send_keys(readCsvDict()[0]['password'])
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readCsvDict()[0]['result'])
def test_sina_email_format(self):
'''sina邮箱验证:登录邮箱格式不正确'''
self.driver.find_element_by_id('freename').send_keys(readCsvDict()[1]['username'])
self.driver.find_element_by_id('freepassword').send_keys(readCsvDict()[1]['password'])
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/sdiv/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readCsvDict()[1]['result'])
def test_sina_username_error(self):
'''sina邮箱验证:登录账户密码不匹配'''
self.driver.find_element_by_id('freename').send_keys(readCsvDict()[2]['username'])
self.driver.find_element_by_id('freepassword').send_keys(readCsvDict()[2]['password'])
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readCsvDict()[2]['result'])
if __name__ == '__main__':
unittest.main()
2.以列表的方式来读取
(1)在untils的包下创建一个文件,文件内写入以列表的方式读取文件的函数
import csv
import os
def base_dir():
return os.path.dirname(os.path.dirname(__file__))
def readCsvlist():
'''列表的形式读取数据'''
lists=[]
with open(os.path.join(base_dir(),'data','sina.csv'),encoding='utf-8-sig')as f:
reader=csv.reader(f)
#忽略第一行的内容
next(reader)
for item in reader:
lists.append(item)
return lists
(2)完善后的测试脚本如下:
from selenium import webdriver
import unittest
import time as t
from 单元测试框架.utils.operationCsv import readCsvlist
class sinaTest(unittest.TestCase):
def setUp(self) -> None: #前提
self.driver=webdriver.Chrome()
self.driver.get('https://mail.sina.com.cn/')
self.driver.maximize_window()
self.driver.implicitly_wait(30)
def tearDown(self) -> None: #清理
self.driver.quit()
def test_sina_null(self):
'''sina邮箱验证:登录账户为空'''
self.driver.find_element_by_id('freename').send_keys(readCsvlist()[0][0])
self.driver.find_element_by_id('freepassword').send_keys(readCsvlist()[0][1])
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readCsvlist()[0][2])
def test_sina_email_format(self):
'''sina邮箱验证:登录邮箱格式不正确'''
self.driver.find_element_by_id('freename').send_keys(readCsvlist()[1][0])
self.driver.find_element_by_id('freepassword').send_keys(readCsvlist()[1][1])
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readCsvlist()[1][2])
def test_sina_username_error(self):
'''sina邮箱验证:登录账户密码不匹配'''
self.driver.find_element_by_id('freename').send_keys(readCsvlist()[2][0])
self.driver.find_element_by_id('freepassword').send_keys(readCsvlist()[2][1])
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readCsvlist()[2][2])
if __name__ == '__main__':
unittest.main()
四、excel文件
安装操作excel文件的库:pip3 install xlrd
1、将写有测试数据的excel 文件放进data文件夹里
2.在utils的包内创建一个python文件,写入读取Excel文件的函数:
import os
import xlrd
def base_dir():
return os.path.dirname(os.path.dirname(__file__))
def readExcel():
lists=[]
sheet=xlrd.open_workbook(os.path.join(base_dir(),'data','sina.xls'))
book=sheet.sheet_by_index(0) #excel文件中的第一个表 索引为0
for item in range(1,book.nrows): #从第一行开始读取它的所有行
lists.append(book.row_values(item)) #读取行内的所有值 将这些值添加到列表里
return lists
3.完善后的测试脚本如下:
from selenium import webdriver
import unittest
import time as t
from 单元测试框架.utils.operationExcel import readExcel
class sinaTest(unittest.TestCase):
def setUp(self) -> None: #前提
self.driver=webdriver.Chrome()
self.driver.get('https://mail.sina.com.cn/')
self.driver.maximize_window()
self.driver.implicitly_wait(30)
def tearDown(self) -> None: #清理
self.driver.quit()
def test_sina_null(self):
'''sina邮箱验证:登录账户为空'''
self.driver.find_element_by_id('freename').send_keys(readExcel()[0][0])
self.driver.find_element_by_id('freepassword').send_keys(readExcel()[0][1])
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readExcel()[0][2])
def test_sina_email_format(self):
'''sina邮箱验证:登录邮箱格式不正确'''
self.driver.find_element_by_id('freename').send_keys(readExcel()[1][0])
self.driver.find_element_by_id('freepassword').send_keys(readExcel()[1][1])
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readExcel()[1][2])
def test_sina_username_error(self):
'''sina邮箱验证:登录账户密码不匹配'''
self.driver.find_element_by_id('freename').send_keys(readExcel()[2][0])
self.driver.find_element_by_id('freepassword').send_keys(readExcel()[2][1])
self.driver.find_element_by_class_name('loginBtn').click()
t.sleep(3)
divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
self.assertEqual(divText.text,readExcel()[2][2])
if __name__ == '__main__':
unittest.main()