数据驱动
1、什么是数据驱动
答:使用测试数据驱动测试用例的执行,测试数据直接影响结果
2、特点
答:1、可以理解为数据驱动是一种模式或思想
2、将维护的焦当转到测试数据上,而非测试脚本
3、数据驱动必须结合参数化技术使用
数据驱动 = 数据储存文件 + 读取数据读取工具 + 参数化技术
3、数据储存文件类型
1、json、excel、txt、xml、csv、数据库
重点:json
txt:扩展
4、json是什么?
说明:一种轻量级数据交换格式,采用键值对形式,键与值之间使用冒号(:),键值对之间使用逗号(,)分隔;
5、值的取值范围
1、字符串、int、对象、列表、null
6、数据操作:
1、转换
·python字典与JSON之间的转换
方法:dumps()
1、导包json
2、调用dumps()方法
将python字典转为json字符串对象
方法:dumps()
1、导包json
2、调用loads()方法
将json字符串转为python字典对象
方法:loads()
执行代码:
# 读入json文件数据
# 导包
import json
# 使用文件流打开json文件
with open("./data/data.json","r",encoding="utf-8") as f:
# 读取json文件
data1 = json.load(f)
print(data1)
print(type(data1))
执行结果:
2、json读写
1、读:load()
操作:
1、导包 import json
2、获取文件流并调用load方法
with open(“../data/xxx.json”,”w”,encode = “utf-8”) as f:
json.load(f)
代码结构:
执行代码
data.json文件中内容:
{"name":"张三","age":19}
read_data.py文件中内容:
# 读入json文件数据
# 导包
import json
# 使用文件流打开json文件
with open("./data/data.json","r",encoding="utf-8") as f:
# 读取json文件
data1 = json.load(f)
print(data1)
print(type(data1))
执行结果:
2、写:dump()
执行代码:
"""
目标:写入json
方法:
json.dump(写什么数据(字典数据),往哪写(文件流))
"""
# 导包
import json
date = {"name":"张三","age":19}
# 使用文件流写入json,调用dump方法
with open('./data/data.json','w',encoding='utf-8') as f:
json.dump(date,f,ensure_ascii=False)
执行结果:
生成date.json文件
7、应用:
json数据文件编写
1、新建目录data
2、data目录new-->file-->xxx.json
3、每组单独建名:用例编号
如:
{“baidu_login_001”:{
“username”:15962634944,”
“password”:”123456”
}
“baidu_login_002”:{
“username”:15962634922”,
”password”:”123456”
}
}
读写工具类编写
步骤:
1、导包
2、打开文件获取文件流,并调用load()方法
应用:
def read_json():
filepath = “../data/”+filename
with open(filepath,”r”,encoding=“utf-8”) as f:
#切记必须返回参数
return json.load(f)
转换格式:
预期:[(),()]或[[],[]]
实际格式:{“”:{},””:{}}
思路:
1、新建空列表 —》添加读取出来的json数据
2、遍历获取json串value值 —〉利用value()方法一次获取所有的字典的值(值还是json)
3、使用arrs.append((data.get(“username”),data.get(“”)))
arrs = []
for i in read_txt():
arrs.append(tuple(date.strip().split(“,”)))
#结果为[(),()]形式
4、返回arrs
练习:计算机计算数据(目的:数据驱动)
结构:
1、base
#初始化
#查找元素
#点击方法
#获取输入框内容方法
2、page
#点击数字
#遍历传入的数字,目的是拆分点击几次数字按钮
for i in str(num)
#组合拆分后数字的定位信息
loc = By CSS_SELECTOR , “#simple{}”.format(i)
#执行单个按钮点击
self.base_click(loc)
#点击加号
#点击等号
#点击清屏
#获取结果
#组合计算业务方法
3、scripts
新建测试类 继承unittest.TestCase
#初始化函数
#获取PageCalc对象
#结束函数
#关闭driver
#测试方法
#清屏
#调用业务方法
#断言
4、数据驱动 TXT
读取:
with open(“../data/xxx.txt”,”r”,encoding=“uff-8”) as f:
f.readlines() #读取所有行
f.readline()#读取单行
f.read() #读取所有文件
转换格式:
#新建空列表
#遍历 单行数据
空列表追加数据(去除前后回车、分隔字符串)
#返回空列表
方法:
strip():去除字符串前后空格、回车
split():根据指定字符分割字符串,并且以列表形式返回
代码结构:
base包下base.py文件代码:
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
class Base():
# 初始化driver
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get("https://www.baidu.com")
# 查找元素方法
def base_find_element(self,loc,time=30,poll = 1):
return WebDriverWait(self.driver,timeout=time,poll_frequency=poll).until(lambda x: x.find_element(*loc))
# 点击方法
def base_click(self,loc):
self.base_find_element(loc).click()
# 输入文本框方法
def base_send_keys(self,loc,value):
el = self.base_find_element(loc)
# 清除元素输入框
el.clear()
el.send_keys(value)
# 获取文本方法
def base_error_text(self,loc):
return self.base_find_element(loc).text
# 截图方法
def base_screenshot_as_file(self):
self.driver.get_screenshot_as_file("../image/{}.png".format(time.strftime("%Y_%m_%d_%H_%M_%S")))
base包下read_json.py文件代码:
# 1、导包
import json
# 2、转化json格式为数组模式
def get_data():
filepath = "../data/" +"data.json"
with open(filepath,'r',encoding='utf-8') as f:
return json.load(f)
if __name__ =="__main__":
arr = []
for i in get_data().values():
arr.append(tuple(i.values()))
print(arr[0::])
data包下data.json文件:
{
"baidu_login01": {"username": "15962634944",
"password": "145632",
"stuta": "用户名或密码有误,请重新输入或找回密码"},
"baidu_login02": {"username": " ",
"password": "145632",
"stuta":"请您输入手机号/用户名/邮箱"}
}
page包下pageLogin.py文件代码:
import time
import page
from base.base import Base
class PageLogin(Base):
# 点击首页登陆按钮
def page_click(self):
self.base_click(page.login_link)
# 输入用户名
def page_username(self,username):
self.base_send_keys(page.login_username,username)
# 输入密码
def page_pwd(self,pwd):
self.base_send_keys(page.login_pwd,pwd)
# 点击登陆
def page_login_ok_btn(self):
self.base_click(page.login_btn_ok)
# 错误信息
def page_error_text(self):
return self.base_error_text(page.login_error_text)
# 封装登陆方法
def page_login_ways(self,value,pwd):
time.sleep(2)
self.page_username(value)
time.sleep(2)
self.page_pwd(pwd)
time.sleep(2)
self.page_login_ok_btn()
page包下__init__.py文件代码:
from selenium.webdriver.common.by import By
login_link = By.CSS_SELECTOR,"#s-top-loginbtn"
login_username = By.CSS_SELECTOR, "#TANGRAM__PSP_11__userName"
login_pwd = By.CSS_SELECTOR, "#TANGRAM__PSP_11__password"
login_btn_ok = By.CSS_SELECTOR, "#TANGRAM__PSP_11__submit"
login_error_text = By.CSS_SELECTOR, "#TANGRAM__PSP_11__error"
Scripe包下testLogin.py文件代码:
import unittest
from parameterized import parameterized
from base.read_data import get_data
from page.pageLogin import PageLogin
def get_date():
arr = []
for i in get_data().values():
arr.append(tuple(i.values()))
return arr[0::]
class TestLogin(unittest.TestCase):
login = None
@classmethod
def setUpClass(cls):
cls.login = PageLogin()
cls.login.page_click()
@classmethod
def tearDownClass(cls):
cls.login.driver.quit()
@parameterized.expand(get_date())
def testLogin(self,value,pwd,expand):
self.login.page_login_ways(value,pwd)
msg = self.login.page_error_text()
try:
self.assertEqual(msg, expand)
except AssertionError:
self.login.base_screenshot_as_file()
Scripe包下run.py文件代码:
import time
import unittest
from tool.HTMLTestRunner import HTMLTestRunner
suite = unittest.defaultTestLoader.discover("./")
# 报告生成目录及文件名称
dir_path = "../report/{}.html".format(time.strftime("%Y_%m_%d %H_%M_%S"))
# 获取文件流并调用run运行
with open(dir_path, "wb") as f:
HTMLTestRunner(stream=f, title="Tpshop商城自动化测试报告", description="操作系统:win7").run(suite)
作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:开心螺蛳粉】自提!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群:1150305204,里面有各种测试开发资料和技术可以一起交流哦。