数据驱动的思想:
在自动化测试过程中,把测试过程中使用到的数据单独的分离到文件中,这样统一来管理具体的测试数据
常见的数据驱动文件类型:
安装第三方库:
- pip3 install pyyaml 操作雅玛文件库
- pip3 install xlrd 操作xlrd文件
json
以sina的登录作为演示,具体代码实现:
首先在Data文件夹下创建一个sina的json文件
{ "loginNull": {"username": "","password": "","result": "请输入邮箱名"}, "emailFormat": {"username": "sadert","password": "asrtr","result": "您输入的邮箱名格式不正确"}, "loginError": {"username": "sdrtdt@sina.com","password": "aserty","result": "登录名或密码错误"} }
在文件中以字典的形式写入需要的文件,注意一定要是双引号;
同级在创建一个utils的包,包下创建一个Python文件
这个文件里写入读取的函数
import json 导入库 import os def base_dir(): return os.path.dirname(os.path.dirname(__file__)) #获取路径 print(base_dir()) def readjson(): return json.load(open(os.path.join(base_dir(),'data','sina.json'),encoding='utf-8')) 路径拼接 print(readjson())
from selenium import webdriver import unittest import time as t from 单元测试.utils.operationJson import readjson 导入函数 class Testsina(unittest.TestCase): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get('https://mail.sina.com.cn/') self.driver.implicitly_wait(15) def tearDown(self): self.driver.quit() def test_sina_longin_Null(self,): '''验证邮箱密码为空的信息''' 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() 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()['loginNull']['result']) def test_sina_longin_Forma(self,): '''验证邮箱密码不正确的信息''' 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() 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()['emailFormat']['result']) def test_sina_longin_Error(self,): '''验证邮箱密码不匹配的信息''' 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(verbosity=2)
yaml:
实质上是一种通用的数据串行化格式。
基本语言规则
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
写入:
loginNull: username: "" password: "" result: "请输入邮箱名" emailFormat: username: "sadert" password: "asrtr" result: "您输入的邮箱名格式不正确" loginError: username: "sdrtdt@sina.com" password: "aserty" result: "登录名或密码错误"
读取
import yaml import os def base_dir(): return os.path.dirname(os.path.dirname(__file__)) print(base_dir()) def readyaml(): with open(os.path.join(base_dir(),'data','sina.yaml'),encoding='utf-8') as f: return yaml.safe_load(f) print(readyaml())
CSV
写入:
username,password,result
,,请输入邮箱名
sdfsdfsg,Asrety,您输入的邮箱名格式不正确
awesras@sina.com,sdfdrtsdzf,登录名或密码错误
在excel写入后转为CSV类型,切记不能直接更改后缀
CSV文件的读取分为两种一种是以字典的形式,一种是是列表的形式
import csv
import os
def base_dir():
return os.path.dirname(os.path.dirname(__file__))
def readCsvDict():
'''读取文件为字典形式'''
list1 = []
with open(os.path.join(base_dir(),'data','sina.csv'),encoding='utf-8-sig') as f:
reade=csv.DictReader(f)
for item in reade:
list1.append(dict(item))
return list1
print(readCsvDict()[0]['result'])
def readCsvList():
'''读取文件为字典形式'''
list1 = []
with open(os.path.join(base_dir(), 'data', 'sina.csv'), encoding='utf-8-sig') as f:
reade=csv.reader(f)
next(reade) 忽略第一行
for item in reade:
list1.append(item)
return list1
print(readCsvList()[0][1])
Excel:
读取:
import os import xlrd def base_dir(): return os.path.dirname(os.path.dirname(__file__)) def readExcel(): list1=[] sheet=xlrd.open_workbook(os.path.join(base_dir(), 'data', 'sina.xls',)) book=sheet.sheet_by_index(0) for item in range(1,book.nrows): 从第一行开始读取所有的行数 list1.append(book.row_values(item)) 获取里面的值 return list1 print(readExcel())