數據驅動的思想:
在自動化測試過程中,把測試過程中使用到的數據單獨的分離到文件中,這樣統一來管理具體的測試數據
常見的數據驅動文件類型:
安裝第三方庫:
- 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())