使用Python进行自动化测试Selenium与PyTest的结合【第150篇—自动化测试】

👽发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。

使用Python进行自动化测试:Selenium与PyTest的结合

在软件开发中,自动化测试是确保应用程序质量和稳定性的关键步骤之一。Selenium是一个流行的自动化测试工具,而PyTest则是Python社区中广泛使用的测试框架之一。本文将介绍如何结合Selenium和PyTest来进行自动化测试,以提高测试效率和代码质量。

简介

Selenium是一个用于自动化Web应用程序测试的工具,它支持多种浏览器和操作系统。PyTest是一个简单而强大的Python测试框架,具有丰富的插件生态系统和易用的语法。结合这两者,可以轻松编写和管理自动化测试用例,并进行可靠的测试。

环境设置

在开始之前,确保你的系统已经安装了Python和pip。然后使用pip安装所需的库:

pip install selenium pytest

同时,确保你已经安装了浏览器驱动器,如ChromeDriver或GeckoDriver,并将其添加到系统的环境变量中。

编写测试用例

让我们通过一个简单的示例来演示如何结合Selenium和PyTest编写测试用例。假设我们要测试一个登录页面:

# test_login.pyfrom selenium import webdriver
import pytest@pytest.fixture
def browser():driver = webdriver.Chrome()  # 使用Chrome浏览器yield driverdriver.quit()def test_login_success(browser):browser.get("https://example.com/login")browser.find_element_by_id("username").send_keys("your_username")browser.find_element_by_id("password").send_keys("your_password")browser.find_element_by_id("login-button").click()assert browser.current_url == "https://example.com/dashboard"def test_login_failure(browser):browser.get("https://example.com/login")browser.find_element_by_id("username").send_keys("invalid_username")browser.find_element_by_id("password").send_keys("invalid_password")browser.find_element_by_id("login-button").click()assert "Invalid username or password" in browser.page_source

在上面的示例中,我们首先定义了一个fixture browser,它将在每个测试用例执行前后启动和关闭浏览器。然后我们编写了两个测试用例,分别测试登录成功和失败的情况。

运行测试

现在我们可以使用PyTest来运行我们的测试用例。在命令行中进入测试用例所在的目录,并运行以下命令:

pytest test_login.py

PyTest将会执行测试用例,并输出测试结果。

参数化测试

PyTest提供了参数化测试的功能,可以在一组输入参数下运行同一个测试用例。这在需要覆盖不同场景的测试时非常有用。我们可以修改上述示例,使用参数化测试来测试不同的用户名和密码组合。

# test_login_parametrized.pyimport pytest
from selenium import webdriver@pytest.fixture
def browser():driver = webdriver.Chrome()  # 使用Chrome浏览器yield driverdriver.quit()@pytest.mark.parametrize("username, password", [("valid_username", "valid_password"),("invalid_username", "invalid_password"),("another_valid_username", "another_valid_password"),
])
def test_login(browser, username, password):browser.get("https://example.com/login")browser.find_element_by_id("username").send_keys(username)browser.find_element_by_id("password").send_keys(password)browser.find_element_by_id("login-button").click()if username == "valid_username" and password == "valid_password":assert browser.current_url == "https://example.com/dashboard"else:assert "Invalid username or password" in browser.page_source

在这个示例中,我们使用了@pytest.mark.parametrize装饰器来指定参数化测试的输入参数。测试用例test_login将会在每一组参数组合下执行,并验证登录是否成功。

并发测试

通过结合Selenium的分布式执行功能和PyTest的并发执行插件,我们可以实现并发执行测试用例,从而提高测试速度。在PyTest中,可以使用-n参数指定并发执行的进程数。

pytest -n 4 test_login.py

这将会以4个进程并发执行测试用例,加快测试速度。

页面对象模式

页面对象模式是一种设计模式,用于将页面的元素和操作封装到单独的类中,以提高测试代码的可维护性和可读性。让我们修改示例,引入页面对象模式。

# login_page.pyclass LoginPage:def __init__(self, browser):self.browser = browserself.url = "https://example.com/login"self.username_field = "username"self.password_field = "password"self.login_button = "login-button"def load(self):self.browser.get(self.url)def login(self, username, password):self.browser.find_element_by_id(self.username_field).send_keys(username)self.browser.find_element_by_id(self.password_field).send_keys(password)self.browser.find_element_by_id(self.login_button).click()

现在我们可以创建一个独立的页面对象 LoginPage,其中包含了登录页面的所有元素和操作。然后,我们可以修改测试用例来使用这个页面对象。

# test_login_page.pyfrom selenium import webdriver
from login_page import LoginPage
import pytest@pytest.fixture
def browser():driver = webdriver.Chrome()  # 使用Chrome浏览器yield driverdriver.quit()def test_login_success(browser):login_page = LoginPage(browser)login_page.load()login_page.login("your_username", "your_password")assert browser.current_url == "https://example.com/dashboard"def test_login_failure(browser):login_page = LoginPage(browser)login_page.load()login_page.login("invalid_username", "invalid_password")assert "Invalid username or password" in browser.page_source

通过页面对象模式,我们可以将页面元素和操作与测试代码分离开来,提高了代码的可读性和可维护性。任何页面结构或元素的更改都可以在页面对象类中进行更新,而不必修改测试用例。

数据驱动测试

在实际的测试中,我们经常需要使用不同的数据进行测试,例如不同的用户名、密码或其他输入。数据驱动测试是一种常见的测试方法,可以通过外部数据源来驱动测试用例的执行。让我们扩展我们的示例,使用数据驱动测试来测试不同的用户名和密码组合。

# test_login_data_driven.pyimport pytest
from selenium import webdriver
from login_page import LoginPage@pytest.fixture
def browser():driver = webdriver.Chrome()  # 使用Chrome浏览器yield driverdriver.quit()# 定义测试数据
test_data = [("valid_username", "valid_password", True),("invalid_username", "invalid_password", False),("another_valid_username", "another_valid_password", False)
]@pytest.mark.parametrize("username, password, expected_result", test_data)
def test_login_data_driven(browser, username, password, expected_result):login_page = LoginPage(browser)login_page.load()login_page.login(username, password)if expected_result:assert browser.current_url == "https://example.com/dashboard"else:assert "Invalid username or password" in browser.page_source

在这个示例中,我们使用了@pytest.mark.parametrize装饰器来指定参数化测试的输入参数,但这次我们使用了一个外部的数据列表test_data来提供参数。每个数据项包含用户名、密码和预期结果(成功或失败)。

执行测试

现在我们可以执行我们的测试用例了:

pytest test_login_data_driven.py

PyTest将会运行test_login_data_driven.py文件中的测试用例,并使用提供的不同数据组合来执行测试。

测试报告和日志记录

在自动化测试中,生成详细的测试报告和记录测试执行过程是非常重要的。PyTest提供了丰富的插件生态系统,可以轻松地生成漂亮的测试报告和记录测试执行日志。

首先,让我们安装一些PyTest的报告插件:

pip install pytest-html pytest-logger

然后,我们可以修改我们的测试用例以生成HTML测试报告和记录执行日志。

# test_login_with_report.pyimport pytest
from selenium import webdriver
from login_page import LoginPage@pytest.fixture
def browser():driver = webdriver.Chrome()  # 使用Chrome浏览器yield driverdriver.quit()# 定义测试数据
test_data = [("valid_username", "valid_password", True),("invalid_username", "invalid_password", False),("another_valid_username", "another_valid_password", False)
]@pytest.mark.parametrize("username, password, expected_result", test_data)
def test_login_with_report(browser, username, password, expected_result):login_page = LoginPage(browser)login_page.load()login_page.login(username, password)if expected_result:assert browser.current_url == "https://example.com/dashboard"else:assert "Invalid username or password" in browser.page_source# 添加用于生成HTML测试报告的插件配置
def pytest_configure(config):config._metadata['Project Name'] = 'Web Login Test'config._metadata['Tester'] = 'Your Name'# 添加用于记录测试执行日志的插件配置
def pytest_logger_stdoutloggers():return ['tests']

现在我们可以使用PyTest运行测试,并生成HTML测试报告和记录执行日志:

pytest --html=report.html --logger-level=INFO test_login_with_report.py

PyTest将会生成一个名为report.html的HTML测试报告,并记录执行过程中的日志信息。

扩展测试覆盖范围

除了简单的页面登录测试之外,我们还可以扩展测试用例来覆盖更多功能和场景,以增强测试覆盖范围。例如,我们可以测试注册新用户、忘记密码功能等。让我们扩展我们的示例,添加一个测试用例来测试注册新用户的功能。

# test_registration.pyimport pytest
from selenium import webdriver
from login_page import LoginPage@pytest.fixture
def browser():driver = webdriver.Chrome()  # 使用Chrome浏览器yield driverdriver.quit()def test_register_new_user(browser):login_page = LoginPage(browser)login_page.load()browser.find_element_by_link_text("Register").click()# 在这里填写注册新用户的操作,假设注册成功后跳转到登录页面assert "Login" in browser.title

在这个示例中,我们添加了一个测试用例test_register_new_user来测试注册新用户的功能。测试开始时,我们加载登录页面,然后点击注册链接,执行注册新用户的操作,并验证是否成功跳转到了登录页面。

总结

总结

本文介绍了如何结合Selenium和PyTest进行自动化测试,并提供了一系列示例来演示如何编写、执行和优化自动化测试用例。我们首先了解了Selenium和PyTest的基本概念和用法,然后通过示例详细介绍了如何结合这两个工具进行自动化测试。

在示例中,我们涵盖了以下内容:

  1. 编写基本的自动化测试用例,测试登录页面的成功和失败情况。
  2. 使用参数化测试来测试不同的用户名和密码组合。
  3. 使用并发测试加快测试执行速度。
  4. 引入页面对象模式,提高测试代码的可维护性和可读性。
  5. 使用数据驱动测试来覆盖更多的测试场景。
  6. 生成详细的测试报告和记录执行日志,以便了解测试结果和排查问题。
  7. 扩展测试覆盖范围,测试注册新用户等功能。

通过结合这些技术和工具,我们可以轻松地编写、管理和执行自动化测试,提高测试效率、代码质量和软件稳定性。同时,这些方法也有助于更好地理解和应用自动化测试技术,为软件开发和测试工作带来更多的价值。希望本文能够帮助读者更好地应用自动化测试技术,提升软件质量和开发效率。
在这里插入图片描述

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

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

相关文章

css盒子模型及浮动

内容(content)、内边距(padding)、边框(border)、外边距(margin) oder:1px solid red; 边框的粗细 边框的样式(虚线还是实线) 边框的颜色 border中也有一些属性可以直接调某一个方向上的边框的粗细,样式,颜色 border-left\bord…

2024/3/24 LED点阵屏

显示原理: 类似矩阵键盘,逐行or逐列扫描 74HC595是串行 寄存器 感觉就是三转八寄存器 并行:同时输出;串行:一位一位输出 先配置74HC595,重新进行位声明 sbit RCKP3^5; //RCLK sbit SCKP3^6; …

淘宝|天猫|京东|1688主流电商平台的实时数据返回接口|附Python实例

导读:随着淘宝/天猫直通车功能升级,很多功能越来越白盒化,越来越简化,更方便用户的操作,只需一键即可看出淘宝/天猫直通车存在的问题。淘宝/天猫直通车千人千面后有了实时数据工具,下面通过一个案例告诉大家…

23. UE5 RPG制作属性面板(一)

随着角色的属性越来越多,我们不能每次都进行showdebug abilitysystem进行查看,而且玩家也需要查看角色属性,所以需要一个查看玩家角色属性的面板。 在前面,我们创建三种类型的属性 Primary Attributes(主要属性&#…

常见的OOM 问题的 6 种场景

今天跟大家一起聊聊线上服务出现 OOM 问题的 6 种场景,希望对你会有所帮助。 一、堆内存 OOM 堆内存 OOM 是最常见的 OOM 了。 出现堆内存 OOM 问题的异常信息如下: java.lang.OutOfMemoryError: Java heap space此 OOM 是由于 JVM 中 heap 的最大值,已经不能满足需求了…

资深测试总结,性能测试-常见并发问题+解决总结(最全)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、并发测试的定义…

vscode用SSH远程开发c语言

vscode配置远程 这里我使用虚拟机进行展示,首先需要你的虚拟机安装好ssh 没安装好就执行下面的命令安装并开启服务 sudo apt-get install ssh sudo service ssh start ps -e | grep sshvscode安装 remote-ssh扩展 点击左下角的远程连接,我这里已经连接…

【Hive】HIVE运行卡死没反应

Hive运行卡死 再次强调 hive:小兄弟,没想到吧,咱可不是随便的人。😄 那么,这次又遇见了hadoop问题,问题描述是这样的。 hive> insert into test values(1, nucty, 男); Query ID atguigu_202403241754…

图论基础|695. 岛屿的最大面积、1020. 飞地的数量、130. 被围绕的区域

695. 岛屿的最大面积 力扣题目链接(opens new window) 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&#xff0…

C语言操作符和数据类型的存储详解

CSDN成就一亿技术人 目录​​​​​​​ 一.操作符 一.算数操作符: 二.位移操作符: 三.位操作符: 四.赋值操作符: 五.单目操作符: 六.关系操作符: 七.逻辑操作符: 八.条件操作符&…

【Redis】Redis 介绍Redis 为什么这么快?Redis数据结构Redis 和Memcache区别 ?为何Redis单线程效率也高?

目录 Redis 介绍 Redis 为什么这么快? Redis数据结构 Redis 和Memcache区别 ? 为何Redis单线程效率也高? Redis 介绍 Redis 是一个开源(BSD 许可)、基于内存、支持多种数据结构的存储系统,可以作为数据…

前端基础篇-前端工程化 Vue 项目开发流程(环境准备、Element 组件库、Vue 路由、项目打包部署)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 环境准备 1.1 安装 NodeJs 1.2 验证 NodeJs 环境变量 1.3 配置 npm 的全局安装路径 1.4 切换 npm 的淘宝镜像( npm 使用国内淘宝镜像的方法(最新) ) 1.5 查看镜像…

【C语言】——指针四:字符指针与函数指针变量

【C语言】——指针四:字符指针与函数指针变量 一、字符指针二、函数指针变量2.1、 函数指针变量的创建2.2、两段有趣的代码 三、typedef关键字3.1、typedef的使用3.2、typedef与define比较 四、函数指针数组 一、字符指针 在前面的学习中,我们知道有一种…

解码新时代内存架构:探秘数据在内存中的灵动驻足

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看,已成习惯 创作不易,多多支持! 随着信息技术的飞速发展,我们身处一个数据爆炸的时代。数据的处理和存储方式正日益成为技术革新的重要领域。在新时代的…

CSS时钟案例

文章目录 1. 演示效果2. 分析思路3. 代码实现 1. 演示效果 2. 分析思路 背景是表盘&#xff0c;不用自己制作然后用CSS的定位做时针&#xff0c;分针和秒针黑点用伪元素::after生成转动用animation实现 3. 代码实现 <!DOCTYPE html> <html lang"en">&…

Java学习笔记 | JavaSE基础语法05 | 方法

文章目录 0.前言1. 方法概述2. 方法的定义和调用2.1 无参数方法定义和调用2.2 带参数方法定义和调用1 带参数方法定义和调用2 形参和实参3 带参数方法练习 2.3 带返回值方法的定义和调用1 带返回值方法定义和调用2 带返回值方法练习13 带返回值方法练习24 带返回值方法练习3 3.…

Python学习从0到1 day18 Python可视化基础综合案例 1.折线图

我默记这段路的酸楚&#xff0c;等来年春暖花开之时再赏心阅读 —— 24.3.24 python基础综合案例 数据可视化 — 折线图可视化 一、折线图案例 1.json数据格式 2.pyecharts模块介绍 3.pyecharts快速入门 4.数据处理 5.创建折线图 1.json数据格式 1.什么是json 2.掌握如何使用js…

SqlServer找不到SQL Server Configuration Manager(配置管理)

1、Win键 R &#xff0c;输入 compmgmt.msc 2、找到Sql Server配置管理器

演讲嘉宾公布 | 智能家居与会议系统专题论坛将于3月28日举办

一、智能家居与会议系统专题论坛 智能家居通过集成先进的技术和设备&#xff0c;为人们提供了更安全、舒适、高效、便捷且多彩的生活体验。智能会议系统它通过先进的技术手段&#xff0c;提高了会议效率&#xff0c;降低了沟通成本&#xff0c;提升了参会者的会议体验。对于现代…

Deconstructing Denoising Diffusion Models for Self-Supervised Learning

开头说点题外话&#xff1a;这篇可谓是大咖云集啊&#xff0c;刘壮、谢赛宁、何凯明这些耳熟能详的名字&#xff0c;并且这篇论文一些人也觉得分析特别到位&#xff0c;不愧是大佬视角&#xff0c;配得上“解构”两个字&#xff1b;很巧的是&#xff0c;本科阶段的团队导师也是…