web自动化笔记十五:数据驱动

数据驱动
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,里面有各种测试开发资料和技术可以一起交流哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值