Web自动化测试,怎样参数化?

目录

1.读取 csv 文件

2.数据ddt参数化

2.1实施步骤

2.2代码举例(unittest框架)

3.PO 模式

3.1介绍

3.2非po模式和po模式对比

3.3Po分层及彼此关系

3.4代码举例(非PO模式)

3.5代码举例(PO模式)

3.5.1基础层BasePage

3.5.2PO层

3.5.3测试用例层

1.读取 csv 文件

#通常文件csv
1.找到文件
url_path = os.path.join(os.path.dirname(__file__), "..", "..", "data", file_name)
2.打开这个文件
with open(url_path, "r", encoding="utf8") as file_data
3.读取这个文件中的内容:csv库
file_value = csv.reader(file_data)
4.把读取到的内容转换成python中的列表 
list_file = list(file_value)[line]
5.把读取到的内容返回出去(按行返回,1行就表示1个用例) 
return list_file
#当文件是配置文件时,第四步需要把数据转化成字典
4.把读取到的内容变成字典
dict_file = dict(file_value)
5.返回这个字典信息,所有一起返回
return list_file

2.数据ddt参数化

2.1实施步骤

  1. 创建测试数据
  2. 封装读取数据的方法,保留测试脚本调用的接口/属性(需要传递给脚本什么参数)
  3. 编写自动化测试脚本
  4. 脚本中调用封装好的处理数据文件的模块并引入测试数据
  5. 执行测试脚本并分析测试结果

2.2代码举例(unittest框架)

import unittest
import ddt
from openpyxl import load_workbook
from selenium import webdriver

def Excelread():
    driver= load_workbook('sanmu.xlsx')
    sheet = driver['登录']
    rows = sheet.max_row
    usernamelist = []
    #取出表格中有用的数据信息
    for one in range(2, rows+1):
        #取出姓名
        name = sheet.cell(one, 2).value
        password = sheet.cell(one, 3).value
        usernamelist.append([name, password])
    driver.close()
    return usernamelist

@ddt.ddt
class Logincases(unittest.TestCase):
    a = 5
    b = 2
    @classmethod
    def setUpClass(cls) -> None:
    #数据可以是元祖,列表,字典
    value = Excelread()
    #装饰器@ddt.data是用来将value拆成['姓名数据', '密码数据']
    @ddt.data(*value)
    #unpack则是将['姓名数据', '密码数据']两个元素分别赋值传入给uname和passwd
    @ddt.unpack
    def test_login(self, uname, passwd):
        self.driver = webdriver.Chrome()
        self.driver.get('登录网站')
        self.driver.implicitly_wait(15)
        self.driver.find_element_by_name('userName').send_keys(uname)
        self.driver.find_element_by_name('userPass').send_keys(passwd)
        self.driver.find_element_by_css_selector('button[οnclick="login();"]').click()
    @classmethod
    def tearDownClass(cls) -> None:
        self.driver.quit()

if __name__ == '__main__':
    Logincases.main()

3.PO 模式

3.1介绍

    PO模式:Page Object,是一种页面对象设计模式,算是一种比较好的设计模式。在该设计模式中,功能类(PageObjects)所代表的是每个页面之间的逻辑关系。核心思想是分层,实现松耦合,脚本重用,脚本易维护。

3.2非po模式和po模式对比

非PO模式PO模式
面向过程的线性脚本POM把页面元素定位和业务操作流程分开。实现松耦合。
复用性差UI元素的改变不需要修改业务逻辑代码。只需要找到对应的PO页修改定位即可,数据代码分离
维护性差PO能使我们的测试代码提高代码的可读性,高复用性,可维护性。

3.3Po分层及彼此关系

  1. 基础层BasePage:封装一些最基础的selenium的原生的api方法,元素定位,框架跳转等。
  2. PO层:元素定位、获得元素对象,页面动作
  3. 测试用例层:业务逻辑,数据驱动
  4. 三者关系:PO层继承基础层,测试用例层调用PO层。

3.4代码举例(非PO模式)

import time
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By

class PracTesting( unittest.TestCase ):

    @classmethod
    def setUpClass(cls) -> None:
        # 打开浏览器
        cls.driver = webdriver.Chrome()
        # 加载百度首页
        cls.driver.get( 'http://www.baidu.com' )
        cls.driver.fullscreen_window()
    def test01(self):
        self.driver.implicitly_wait(5)
        # 在百度搜索栏中输入软件测试
        self.driver.find_element( By.ID, 'kw' ).send_keys( '软件测试' )
        # 点击百度一下按钮
        self.driver.find_element( By.ID, 'su' ).click()
    def test02(self):
        time.sleep(2)
        #返回搜索页面
        self.driver.back()
        time.sleep(2)
        # 在百度搜索栏中输入接口测试
        self.driver.find_element( By.ID, 'kw' ).send_keys( '接口测试' )
        # 点击百度一下按钮
        self.driver.find_element( By.ID, 'su' ).click()

    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.quit()


if __name__ == '__main__':
    unittest.main()

3.5代码举例(PO模式)

3.5.1基础层BasePage

from selenium import webdriver

class BasePage:
    #构造方法
    def __init__(self):
        # 打开浏览器
        self.driver = webdriver.Chrome() 
        # 加载百度首页
        self.driver.get('http://www.baidu.com')

    #封装定位元素
    def find_ele(self,*args):
        ele = self.driver.find_element(*args)
        return ele

3.5.2PO层

from selenium.webdriver.common.by import By
from base.base_page import BasePage

class BaiduPage(BasePage):
    #元素定位,
    baidu_text_loc = (By.ID, 'kw')
    baidu_submit_loc = (By.ID, 'su')
    #获得元素对象,
    def get_text_obj(self):
        ele = self.find_ele(*BaiduPage.baidu_text_loc)
        return ele
    def get_submit_obj(self):
        ele = self.find_ele(*BaiduPage.baidu_submit_loc)
        return ele
    #页面操作
    def search(self,search_string):
        self.get_text_obj().send_keys(search_string)
        self.get_submit_obj().click()

3.5.3测试用例层

from ddt import ddt, data
from po.baidu_page import BaiduPage

@ddt
class BaiduTest(unittest.TestCase):

    @data('软件测试','接口测试')
    def test01(self,seaString):
        BaiduPage().search(seaString)
        time.sleep(5)

if __name__ == '__main__':
    unittest.main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三木小君子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值