基于pytest来演示一个PO测试模式案例

news2024/11/15 12:53:40

首先要说的是,这是一个很简易的案例,目的在于体会这样一种结构。

 第一部分:基本操作

案例描述:启动浏览器--打开好123--点击logo--跳转到百度--输入搜索词汇--点击按钮开始搜索。

模式描述:这个模式把元素的提取、元素的操作、场景都写在了一个文件内。

1.目录结构

实际上,report目录我暂时没用到,以后再说。

2.各文件源码

1)elementpage.py

# 本类用来描述案例中用到的全部元素,每个方法对应一个元素
class Element(object):
    def __init__(self, driver):
        self.driver = driver

    def find_logo(self):
        ele = self.driver.find_element_by_id('search_logolink')  # 用来获取好123首页上的百度logo
        return ele

    def find_textarea(self):
        ele = self.driver.find_element_by_id('kw')  # 用来获取百度首页上的输入框
        return ele

    def find_searchbutton(self):
        ele = self.driver.find_element_by_id('su')  # 用来获取百度首页输入框旁边的"百度一下"按钮
        return ele


# 本类用来描述一些基本的元素操作,每个方法代表一种操作
class Operation(object):
    def __init__(self, driver):
        self.element = Element(driver)

    def jump_to_baidu(self):
        self.element.find_logo().click()  # 点击百度logo的动作

    def input_and_click(self, aimstring):
        self.element.driver.switch_to.window(self.element.driver.window_handles[1])  # 切换标签页,因为百度首页会以新的标签呈现
        self.element.find_textarea().send_keys(aimstring)  # 向输入框传入搜索词汇
        self.element.find_searchbutton().click()  # 点击百度一下按钮开始搜索


# 本类用来描述一个场景,它由前面的若干种操作组成
class SearchScenario(object):
    def __init__(self, driver):
        self.operation = Operation(driver)

    # 本方法就是一个具体的场景
    def search(self, aimstring):
        self.operation.jump_to_baidu()  # 从好123跳转到百度
        self.operation.input_and_click(aimstring)  # 从输入到搜索

 2)test_001_search.py

import time
from selenium import webdriver
import pytest
from pageobject import elementpage

data = [('AA'), ('BB'), ('CC')]
@pytest.mark.parametrize('aimstring', data)
class TestSearch():
    def setup(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get('https://www.hao123.com')
        time.sleep(5)

    def teardown(self):
        time.sleep(5)
        self.driver.quit()

    def test_001_search(self, aimstring):
        time.sleep(5)
        elementpage.SearchScenario(self.driver).search(aimstring)


if __name__ == '__main__':
    pytest.main(['-s'])

3.运行结果:

/usr/local/bin/python3.10 /Applications/PyCharm CE.app/Contents/plugins/python-ce/helpers/pycharm/_jb_pytest_runner.py --path /Users/gyf/mypython/PO2/Baidu_Search2/testcases/test_001_search.py 
Testing started at 09:03 ...
Launching pytest with arguments /Users/gyf/mypython/PO2/Baidu_Search2/testcases/test_001_search.py --no-header --no-summary -q in /Users/gyf/mypython/PO2/Baidu_Search2/testcases

============================= test session starts ==============================
collecting ... collected 3 items

test_001_search.py::TestSearch::test_001_search[AA] 
test_001_search.py::TestSearch::test_001_search[BB] 
test_001_search.py::TestSearch::test_001_search[CC] 

========================= 3 passed in 67.02s (0:01:07) =========================

进程已结束,退出代码0

4.个人体会

我感觉这种模式比之前写过的那种元素提取、操作描述、场景描述分散在不同地方的结构更加易于理解。

第二部分:数据分离

数据分离的含义:就是把测试数据从代码中分离出去,这样不用在去修改代码了,更加易于以后的维护。

首先增加一个data目录,用于存放测试数据。增加一个common目录用于存放从文件中解析出测试数据的脚本parse_csv_file.py。

目录结构如下图:

 parse_csv_file.py源码如下

import csv


def parse_csv_file(file_path):
    csvlist = []
    with open(file_path, 'r', encoding='utf-8') as f:
        data = csv.reader(f)
        for i in data:
            csvlist.append(tuple(i))  # 由于我们的测试案例基于pytest来写,因此需要将读出来的列表转换为元组后在加入的大列表中
        del csvlist[0]  # 一般第一行都是各个数据列的名字,并非测试数据,因此我们需要把它从列表中删除
        print(csvlist)
        return csvlist

#测试下看看输出的格式是否满足我们所需
if __name__=="__main__":
    parse_csv_file("../data/testdata.csv")

testdata.csv内容如下:

 另外,还需要修改测试用例文件,使它获取到测试数据。

将test_001_search.py里原本的

data = [('AA'), ('BB'), ('CC')]屏蔽掉,加入如下一行 

data = parse_csv_file.parse_csv_file("../data/testdata.csv")

即可。

现在重新运行测试用例,结果如下

/usr/local/bin/python3.10 /Applications/PyCharm CE.app/Contents/plugins/python-ce/helpers/pycharm/_jb_pytest_runner.py --path /Users/gyf/mypython/PO2/Baidu_Search2/testcases/test_001_search.py 
Testing started at 10:31 ...
Launching pytest with arguments /Users/gyf/mypython/PO2/Baidu_Search2/testcases/test_001_search.py --no-header --no-summary -q in /Users/gyf/mypython/PO2/Baidu_Search2/testcases

============================= test session starts ==============================
collecting ... collected 3 items

test_001_search.py::TestSearch::test_001_search[aimstring0] 
test_001_search.py::TestSearch::test_001_search[aimstring1] 
test_001_search.py::TestSearch::test_001_search[aimstring2] 

========================= 3 passed in 65.93s (0:01:05) =========================

进程已结束,退出代码0
PASSED       [ 33%]PASSED       [ 66%]PASSED       [100%]

个人体会:

数据分离,就是让测试数据离开源代码,使之存放在代码之外。这样我们将不可避免的使用到文件读取或者其他读取方式。另外,将读取到的数据整合成适合pytest读取的格式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java实现(WEB)影院管理系统(TMS)【100010015】

电影院系统需求规格说明 1. 引言 1.1 目的 本文档描述了影院管理系统的功能需求和非功能需求。开发小组的软件系统实现与验证工作都以此文档为依据。1.2 范围 影院管理系统是为了xx影院开发的业务系统,开发的目标是帮助该影院处理日常的重点事物,包括…

算法基础篇-03-查找(顺序查找和二分法查找)

1.查找 查找:在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程;列表查找(线性表查找):从列表中查找指定元素; 输入: 列表,待查找元素输出:元素下标(未找到元素…

【Linux】git的使用

🤢Linux 关联到gitee的操作记录 🤢Linux 下下载gitee的库 🤬sudo yum install git 在Linux中安装git这个软件 🤬git clone 下载gitee库到本地 🤬git add. 将代码放到刚才下载好的目录中 🤬git commit -…

HTML网上书店静态HTML网页作业作品 大学生三联书店网页设计制作成品 简单DIV CSS布局网站

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

SpringBoot 如何进行业务校验,老鸟们都这么玩的~

throw new IllegalArgumentException(“用户不存在!”); } } 采用Assert能使代码更优雅,更简洁。 还是上面的例子,如果采用Assert可以这样写: public void test2(int accountId) { Account account accountDao.selectById(…

【力扣篇一】数组30题

前言 (12月5日)突然想起了很久以前别人(具体来源已经记不清了)传给我的一套题单。网上的题单不少,光收藏可不行,关键还得下手。 这套题单的题目数量为300出头,什么时候刷完我还没有明确计划&a…

对标40亿美金Webflow,「Towify」想用无代码方式搭建小程序

低代码和无代码的浪潮,在全球已经席卷了几次。今年以来,以低代码、无代码方式为主的网页开发、搭建工具受到了资本和市场的认可: 2022年8月,成立于2017年的低代码-内部程序开发平台Retool完成4500万美元融资,投后估值32亿美元。2022年3月,成立于2012年的无代码-外部网页搭…

关于魔趣刷机(含root)步骤

关于魔趣刷机(含root)步骤准备工作第一步:下载room和TWRP第二步:刷入TWRP到手机第三步:刷入room到手机第四步:安装Magisk app第四步:验证手机是否root参考链接准备工作 一台手机(推荐小米)、TW…

ADI Blackfin DSP处理器-BF533的开发详解28:SD卡的文件系统(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了通过文件系统读取 SD 卡上的文件,并对文件和文件夹做读、写、删除、建立、文件列表、文件搜索等功能&#xff0c…

【Pytorch】第 8 章 :实施政策梯度和政策优化

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

Git 客户端::Git Fork 注册版-NEW

Git Fork 是最简单有效的 Windows 客户端之一。许多开发人员正在使用此版本控制程序,它允许您协作处理您的项目。具有类似这样的用户界面的客户端可以使您的工作更轻松。 Fork 的 Fork 界面非常人性化。在右侧的左侧有大量的存储库和分支、标签、来源和藏匿处。此外…

【Pytorch】第 7 章 :深度 Q 网络实战

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

CleanMyMac X4.12.2免费版MAC电脑系统磁盘优化工具

我的 MacBook Pro 只有 256GB 硬盘空间,平时也勉强够用。但最近在升级新版本操作系统 macOS Ventura 13 时发现磁盘空间不够,导致不能升级。对于一个升级强迫症患者来说,任何的小红点都不能忍,更何况是系统升级这种事情。在确定了…

ARM 汇编初始化 SDRAM 详解

一、初始化代码框架介绍(函数调用和返回、步骤等) SDRAM 初始化使用一个函数 sdram_asm_init ,函数在 sdram_init.S 文件中实现,是一个汇编函数。 强调:汇编实现的函数在返回时需要明确使用返回指令(mov p…

1561_AURIX_TC275_电源管理以及监控

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 从这个拓扑图中可以看的出来,AD相关部分的供电以及参考电压都是独立的,而且是来自于外部的。 1. LDO相关的模块有EVR33和EVR13. 2. 1.3V的供电之前只知道是一个内核…

win11:clion + cmake + mingw + glfw

clion & cmake 官网下载安装即可 clion的设置 mingw 链接 版本如下: windows系统只考虑选择x86_64-win32-sjlj和x86_64-win32-seh,区别: sjlj支持32位和64位seh只支持64位,比较新 glfw 官网提供下载:源码、…

[附源码]JAVA毕业设计学生公寓管理系统(系统+LW)

[附源码]JAVA毕业设计学生公寓管理系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术…

蜣螂算法(原理)

原文(附文献下载) 1 群体智能优化算法 SI(swarm intelligence)系统的特点是个体间的相互作用促进了智能行为的出现。 SI优化过程的实现主要包括以下两个步骤: 在搜索空间范围内创建一组随机个体在迭代过程中组合、移动或进化这些随机个体。 每种优化算法的区别…

基于java+springmvc+mybatis+jsp+mysql的校园办公室报修管理系统

项目介绍 校园办公室报修管理系统,是基于java编程语言,ssm框架,jsp技术,mysql数据库开发,本系统主要分为用户,教师,管理员,维修员四个角色,其中用户的功能是注册和登陆系…

【多尺度融合:基于深度学习:压缩图像伪像:blocking artifact】

Deep learning-based compressed image artifacts reduction based onmulti-scale image fusion (基于多尺度图像融合的基于深度学习的压缩图像伪影减少) 在基于块的图像/视频压缩平台中,视觉上明显的压缩伪像之一称为blocking artifact&…