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

news2024/9/30 15:24:18

👽发现宝藏

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

使用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.py

from selenium import webdriver
import pytest

@pytest.fixture
def browser():
    driver = webdriver.Chrome()  # 使用Chrome浏览器
    yield driver
    driver.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.py

import pytest
from selenium import webdriver

@pytest.fixture
def browser():
    driver = webdriver.Chrome()  # 使用Chrome浏览器
    yield driver
    driver.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.py

class LoginPage:
    def __init__(self, browser):
        self.browser = browser
        self.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.py

from selenium import webdriver
from login_page import LoginPage
import pytest

@pytest.fixture
def browser():
    driver = webdriver.Chrome()  # 使用Chrome浏览器
    yield driver
    driver.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.py

import pytest
from selenium import webdriver
from login_page import LoginPage

@pytest.fixture
def browser():
    driver = webdriver.Chrome()  # 使用Chrome浏览器
    yield driver
    driver.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.py

import pytest
from selenium import webdriver
from login_page import LoginPage

@pytest.fixture
def browser():
    driver = webdriver.Chrome()  # 使用Chrome浏览器
    yield driver
    driver.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.py

import pytest
from selenium import webdriver
from login_page import LoginPage

@pytest.fixture
def browser():
    driver = webdriver.Chrome()  # 使用Chrome浏览器
    yield driver
    driver.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.coloradmin.cn/o/1540712.html

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

相关文章

Linux 常用命令 1

Tips:终端热键ctrl shift 放大终端窗口的字体 ctrl - 缩小终端窗口的字体 注意区分大小写 查阅命令帮助信息: 1)--help command –help(两个减号) 显示command命令的帮助信息 2)man man command 查阅command命令的使…

java数据结构与算法刷题-----LeetCode75. 颜色分类

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 双指针两次遍历2. 三指针 1. 双指针两次遍历 解题思路&#…

linux下线程分离属性

linux下线程分离属性 一、线程的属性---分离属性二、线程属性设置2.1 线程创建前设置分离属性2.2 线程创建后设置分离属性 一、线程的属性—分离属性 什么是分离属性? 首先分离属性是线程的一个属性,有了分离属性的线程,不需要别的线程去接合…

YOLOv8 | 网络结构 | 详细讲解YOLOv8的网络结构

⭐欢迎大家订阅我的专栏一起学习⭐ 🚀🚀🚀订阅专栏,更新及时查看不迷路🚀🚀🚀 YOLOv5涨点专栏:http://t.csdnimg.cn/70xZa YOLOv8涨点专栏:http://t.csdnimg.cn/Cb89a YOLOv7专栏:http://t.csdnimg.cn/HaTdn 💡魔改网络、复现论文、优化创新💡 …

风靡全球的WEB3街头时尚品牌Hape正式启动2024年回到街头系列活动

什么是「街头」 是永不畏惧的竞技精神 是肆意生长的野性力量 是色彩绮丽的感官世界 3月23日! 跟随Hape的节奏,领略最原始纯粹的街头文化,在Yolo Block找到属于你的街头时尚 「回到街头」活动信息 时间 3月23日 - 4月14日 地点 福建省…

【数据结构初阶】之堆(C语言实现)

数据结构初阶之堆(C语言实现) 🌏 堆的概念🌏 堆的模拟实现🐓 堆的结构和方法接口🐓 堆的方法的模拟实现🙊 堆的初始化🙊 堆的构建🙊 堆的插入🙊 向上调整&…

仿牛客社区项目所有PPT图片

文章目录 第1章 初识Spring Boot,开发社区首页1.1 课程介绍1.1.1 课程目标1.1.2 技术架构1.1.3 开发环境 1.2 搭建开发环境1.2.1 Apache Maven1.2.2 Intellij IDEA1.2.3 Spring Initializer1.2.4 SpringBoot 入门示例 1.3 Spring入门1.3.1 SpringBoot 全家桶1.3.2 S…

RecyclerView notifyItemRemoved 之后的源码分析

源码版本:androidx1.3.2 分析场景: RecyclerView使用线性布局,方向为竖直方向,布局从上到下,宽高都是 MATCH_PARENT。开始有3条数据。然后移除 position 1 的数据。 流程图 先说下结论: 在 dispatchL…

MySQL | 用户管理

目前为止,我们一直使用的是root权限写的SQL语句。但如果我们只能用root,这样存在安全隐患。而MySQL是给我们提供了用户管理的,可以创建用户,提供权限,收回权限。 1. 用户 MySQL中的用户,都存储在系统数据库…

软件测试教程 性能测试概论

文章目录 1. 性能测试实施的流程1.1 常见的性能问题1.2 性能测试是什么?1.3 性能测试和功能测试之间的区别1.4 什么样的系统/软件表现属于性能好,什么样的软件性能表现属于性能不好1.5 为什么要进行性能测试1.6 性能测试实施的流程1.7 常见的性能指标以及…

基于ssm汽车养护管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本汽车养护管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

ASP .Net Core 配置集合 IConfiguration 的使用

🐳简介 IConfiguration 是 ASP.NET Core 中的一个接口,用于表示配置集合。以下是关于 IConfiguration 的详细介绍: 作用:IConfiguration 允许开发人员从各种来源(如文件、环境变量、命令行参数等)读取应用…

PySide6-YOLO8目标检测、追踪可视化界面

目录 项目地址实现效果DetectTrack 项目地址 https://github.com/zhengjie9510/pyside-yolo 实现效果 Detect Track

【蓝牙协议栈】【BLE】低功耗蓝牙配对绑定过程分析(超详细)

1. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅,【蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待&#xff01…

网络层(IP层)

IP协议的本质:有将数据跨网络传输的能力 而用户需要的是将数据从主机A到主机B可靠地跨网络传输 IP的组成:目标网络目标主机 IP由目标网络和目标主机两部分组成,IP报文要进行传输,要先到达目标网络,然后经过路由器转到…

Unity3d Shader篇(十六)— 模拟雪的Shader

文章目录 前言一、什么是模拟雪的Shader?1. 雪Shader原理2. 雪Shader优缺点优点:缺点: 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数6. 控制雪大小的脚本 三、效果四、总结 …

AI大模型学习:理论基石、优化之道与应用革新

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

数组三(冒泡排序、二分查找)

目录 冒泡排序算法 冒泡排序的基础算法 冒泡排序的优化算法 二分法查找 冒泡排序算法 冒泡排序是最常用的排序算法,在笔试中也非常常见,能手写出冒泡排序算法可以说是 基本的素养。 冒泡排序的基础算法 冒泡排序算法重复地走访过要排序的数列&#…

GUROBI的数据结构

为了在GUROBI中能够更加高效地建模,Python API内置了三种特殊的数据结构,方便根据下标来查找数据。注意在使用这三种数据结构之前需要 import gurobipy as gp multidict 一、普通字典dict()的用法 小结:普通字典dict()只有一个返回值&…

Java代码基础算法练习-数位交换-2024.03.23·

任务描述: 输入一个三位整数,将其个位和百位交换后输出 任务要求: package march0317_0331;import java.util.Scanner;public class m240323 {public static void main(String[] args) {Scanner scanner new Scanner(System.in);System.out…