python自动化测试实战 —— 自动化测试框架的实例

简介: python自动化测试实战 —— 自动化测试框架的实例

软件测试专栏


实战相关知识

      PO模式(Page Object模式)是一种软件测试自动化设计模式,它将网页封装成对象,通过操作对象的方法来完成自动化测试,从而将测试代码与页面逻辑分离,提高了测试代码的可维护性和可重复使用性。

      在PO模式中,每个页面或页面的一部分(如表单、菜单)都被封装到一个对象里,这个对象提供了操作页面元素的方法和属性。测试脚本只需要调用这些方法和属性,而不需要了解页面的具体实现细节。当页面元素改变时,只需要更新对象,而不需要修改测试脚本。

PO模式的优点包括:

  • 提高测试代码的可维护性和可重复使用性。
  • 降低测试代码的耦合性,测试脚本只需要关注业务逻辑,而不用关注页面实现细节。
  • 增强测试脚本的可读性和可维护性。
  • 支持多浏览器测试,只需要针对不同的浏览器实现不同的页面对象。
  • 提高测试自动化的效率和稳定性,避免了测试人员重复操作页面的失误。

实战内容

访问“新浪微博”网页 ,完成“搜索”、“登录”和“发微博”三个测试用例。

(1)测试用例设计

  1. 登录测试用例 (test_login):
    实例化LoginPage对象。
    调用click_login_button方法,点击登录按钮。
    调用verify_login_success方法,验证登录微博是否成功。
  2. 发布微博测试用例 (test_post_weibo):
    实例化HomePage对象。
    调用input_weibo_content方法,输入微博内容。
    调用click_publish_button方法,点击发布按钮。
    调用verify_publish_success方法,验证微博发布是否成功。
  3. 搜索测试用例 (test_search):
    实例化SearchPage对象。
    调用input_keyword_and_search方法,输入关键字并搜索。

(2)测试框架设计

      通过使用PO模式将页面元素的定位以及元素的操作分离出来,测试用例脚本直接调用这些封装好的元素操作来组织测试用例,从而实现测试用例脚本和元素定位、操作的分离。

      定义了三个页面类:LoginPage、HomePage和SearchPage,分别封装了登录页面、主页和搜索页面的操作和验证方法。样我们就可以将与页面操作相关的代码封装到对应的Page Object类中,以实现更好的代码组织和可维护性。

      在测试方法中,我们通过创建相应的Page Object实例来执行页面操作,例如在test_login中使用LoginPage执行登录操作,在test_post_weibo中使用HomePage执行发微博操作,在test_search中使用SearchPage执行搜索操作。这样可以提高代码的可读性和可维护性。

      使用了pytest作为测试框架,通过@pytest.fixture装饰器定义了setup函数,使用@pytest.mark.usefixtures装饰器将setup函数应用于测试类。测试类中定义了测试方法,最后使用pytest.main函数运行测试用例,并生成 HTML 格式的报告文件。如果该脚本直接被执行,则会运行测试用例并关闭 mpmath 中的 fp 函数。

封装登录页面操作和验证方法

封装主页页面操作和验证方法

封装搜索页面操作和验证方法

      “@pytest.fixture(scope=“class”)”是 Pytest 测试框架中的装饰器,我们使用了 scope=“class” 参数,它指定了该函数的作用范围为测试类级别。在 setup 夹具函数中,我们做了以下几个操作:创建了一个Chrome浏览器的实例,即 webdriver.Chrome()。最大化了浏览器窗口。设置了隐式等待时间为 10 秒,即在查找元素时,如果元素未立即出现,会等待最多10秒。打开了微博网站,即driver.get(“https://weibo.com”)。将创建的浏览器实例传递给测试类,通过request.cls.driver = driver。使用yield将控制权交还给测试类。在测试结束后,关闭浏览器,即driver.quit()。

      “这样,测试类中的测试方法就可以共享同一个浏览器实例,并在每个测试方法运行之前和之后进行相应的设置和清理工作。

setup函数

      “@pytest.mark.usefixtures(“setup”)”是 Pytest 测试框架中的装饰器,它告诉Pytest在运行测试类的每个测试方法之前先运行指定的函数(setup),这样可以确保在每个测试方法开始之前都进行一些必要的设置或准备工作。这样可以提高测试代码的可读性和可维护性,并减少重复代码。

测试类

(3)测试报告

运行结果

登录成功截图

发微博成功截图

搜索成功截图

测试报告

操作异常问题与解决方案

  • 异常问题:
    页面对象无法找到页面上的元素,导致定位失败。
  • 解决方法:
    检查页面对象中的元素定位方法和表达式是否正确。确认页面结构和元素属性是否发生了变化。可以使用开发者工具或浏览器插件来验证元素定位表达式是否有效。

  • 异常问题:
    在操作页面元素时,等待超时导致无法执行操作。
  • 解决方法:
    使用适当的等待机制等待元素的出现、可点击或可见状态。可以使用显式等待(WebDriverWait)等待元素出现或满足特定条件。调整等待时间,确保足够的时间加载页面或元素。

  • 异常问题:
    在测试用例中,断言条件未满足,导致断言失败。
  • 解决方法:
    检查断言条件是否正确,确保预期结果与实际结果一致。仔细查看测试数据、操作流程或页面变化等因素,确保断言条件正确。

  • 异常问题:
    在页面对象操作元素时,元素处于不可交互状态,无法执行操作。
  • 解决方法:
    确认元素是否被其他元素覆盖、隐藏或禁用。等待页面元素可交互的状态,如等待其他元素完成加载或动画。确保操作元素的可见性和可点击性。

附录

      具体的测试脚本、配置文件等源码。

第一层:将所有元素对象定位器放到一个文件(locator.py)

from selenium.webdriver.common.by import By
class LoginPageLocators:
    LOGIN_BUTTON = (By.XPATH, "//*[@id='__sidebar']/div/div[2]/div[1]/div/button")
class HomePageLocators:
    CONTENT_INPUT = (By.XPATH, "//*[@id='homeWrap']/div[1]/div/div[1]/div/textarea")
    PUBLISH_BUTTON = (By.XPATH, "//*[@id='homeWrap']/div[1]/div/div[4]/div/div[4]/button")
class SearchPageLocators:
    SEARCH_BOX = (By.XPATH, "//*[@id='app']/div[2]/div[1]/div/div[1]/div/div/div[1]/div/div[2]/div/span/form/div/input")
    POST_BUTTON = (By.XPATH, "//*[@id='app']/div[2]/div[1]/div/div[1]/div/div/div[1]/div/div[2]/div/div/div/div[1]/div[1]/div/a/div/div/div/div[2]")
class SuccessMessageLocators:
    SUCCESS_MESSAGE = (By.XPATH, "//*[@id='scroller']/div[1]/div[1]/div/article/div[2]/div/div/div")

第二层:将所有元素操作放到一个文件(elements.py)

import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from 自动化实验四.PageObject.locator import LoginPageLocators, HomePageLocators, SearchPageLocators, SuccessMessageLocators
class LoginPage:
    def __init__(self, driver):
        self.driver = driver
    def click_login_button(self):
        login_button = self.driver.find_element(*LoginPageLocators.LOGIN_BUTTON)
        login_button.click()
        time.sleep(2)
    def verify_login_success(self):
        assert "微博 – 随时随地发现新鲜事" in self.driver.title
class HomePage:
    def __init__(self, driver):
        self.driver = driver
    def input_weibo_content(self, content):
        content_input = self.driver.find_element(*HomePageLocators.CONTENT_INPUT)
        content_input.clear()
        content_input.send_keys(content)
    def click_publish_button(self):
        publish_button = self.driver.find_element(*HomePageLocators.PUBLISH_BUTTON)
        publish_button.click()
        time.sleep(3)
    def verify_publish_success(self):
        success_message = self.driver.find_element(*SuccessMessageLocators.SUCCESS_MESSAGE)
        assert success_message.is_displayed()
class SearchPage:
    def __init__(self, driver):
        self.driver = driver
    def input_keyword_and_search(self, keyword):
        search_box = self.driver.find_element(*SearchPageLocators.SEARCH_BOX)
        search_box.send_keys(keyword)
        time.sleep(3)
        post_button = self.driver.find_element(*SearchPageLocators.POST_BUTTON)
        post_button.click()
        time.sleep(3)

第三层:将公共的业务场景封装到一个文件中(test_weibo_ui.py)

import pytest
from mpmath import fp
from selenium import webdriver
from 自动化实验四.Scenario.elements import LoginPage,HomePage,SearchPage
@pytest.fixture(scope="class")
def setup(request):
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.implicitly_wait(10)
    driver.get("https://weibo.com")
    request.cls.driver = driver
    yield
    driver.quit()
@pytest.mark.usefixtures("setup")
class TestWeiboUI:
    def test_login(self):
        login_page = LoginPage(self.driver)
        login_page.click_login_button()
        login_page.verify_login_success()
    def test_post_weibo(self):
        home_page = HomePage(self.driver)
        home_page.input_weibo_content("今天好热啊!--20215120808")
        home_page.click_publish_button()
        home_page.verify_publish_success()
    def test_search(self):
        search_page = SearchPage(self.driver)
        search_page.input_keyword_and_search("自动化")
if __name__ == '__main__':
    pytest.main(['-v', '--html=test_weibo_ui.html'])
    fp.close()


目录
相关文章
|
1天前
|
监控 测试技术 Python
软件测试的艺术与科学:探索测试自动化的奥秘
【8月更文挑战第30天】在软件开发的海洋中,测试是那把确保航船不偏离航线的罗盘。本文将带您一探究竟,从测试的基础到高级自动化策略,揭示如何通过代码和工具提升测试效率。准备好启航,因为我们将深入探讨软件测试的核心,以及如何利用自动化技术来优化您的测试流程。
11 4
|
1天前
|
物联网 测试技术 持续交付
软件测试的艺术与科学:探索自动化测试框架未来技术的融合与创新:探索区块链、物联网和虚拟现实的交汇点
【8月更文挑战第30天】在软件开发的海洋中,测试是确保航行安全不可或缺的灯塔。本文将带领读者揭开软件测试神秘的面纱,深入理解自动化测试框架的重要性和实现方法。通过实际案例,我们将一起探索如何构建高效、可靠的自动化测试系统,从而保障软件质量,提升开发效率。
|
2天前
|
测试技术
基于LangChain手工测试用例转Web自动化测试生成工具
该方案探索了利用大模型自动生成Web自动化测试用例的方法,替代传统的手动编写或录制方式。通过清晰定义功能测试步骤,结合LangChain的Agent和工具包,实现了从功能测试到自动化测试的转换,极大提升了效率。不仅减少了人工干预,还提高了测试用例的可维护性和实用性。
12 4
|
1天前
|
敏捷开发 测试技术 持续交付
软件测试中的自动化策略与实践云计算时代的网络安全挑战与对策
【8月更文挑战第30天】在软件开发的海洋中,自动化测试是一艘能够带领团队高效航行的帆船。本文将探讨如何搭建这艘帆船,从选择适合的自动化测试框架开始,到编写有效的测试脚本,再到持续集成的实施和测试结果的分析,我们将一步步揭开自动化测试的神秘面纱。你将学习到如何通过自动化测试来提升软件质量和开发效率,以及如何克服实施过程中的挑战。让我们一起启航,探索自动化测试的世界。
|
1天前
|
数据采集 数据挖掘 开发者
Python编程入门:从基础到实战
【8月更文挑战第30天】本文将带你走进Python的世界,从基本语法开始,逐步深入到数据结构、函数、面向对象编程等高级特性。我们将通过实际案例,如网页爬虫和数据分析,展示如何应用所学知识解决实际问题。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供宝贵的指导和启发。
|
2天前
|
Python
探索Python中的装饰器:从入门到实战
【8月更文挑战第29天】在Python的世界里,装饰器是那些让代码更加优雅和高效的小精灵。它们就像是编程世界的调味料,能让平淡无奇的函数变得鲜活起来。本文将带你走进装饰器的世界,从基础概念出发,一步步深入到它们的应用实战中。你将看到,装饰器不仅仅是语法糖,它们是实现代码重用、功能增强的强有力工具。准备好了吗?让我们一起揭开装饰器的神秘面纱,开启一段代码美化之旅!
|
2天前
|
数据采集 机器学习/深度学习 存储
Python编程入门:从基础到实战
【8月更文挑战第29天】本文将带你走进Python的世界,从最基础的语法开始,逐步深入到实际的项目开发。我们将通过详细的代码示例和实践案例,帮助你掌握Python编程的核心技能,提升你的编程能力。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考和指导。
|
1天前
|
运维 监控 应用服务中间件
自动化运维:打造高效、稳定的系统环境
【8月更文挑战第30天】本文将探讨如何通过自动化运维技术,提升系统的稳定性和效率。我们将从基础概念出发,逐步深入到实践应用,分享一些实用的工具和技术,以及如何将这些工具和技术融入到日常的运维工作中。无论你是运维新手,还是有一定经验的老手,都能在这篇文章中找到有价值的信息。让我们一起探索自动化运维的世界,提升我们的工作效率,让系统运行得更加平稳。
|
1天前
|
运维 安全 应用服务中间件
自动化运维的利器:Ansible入门与实战网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【8月更文挑战第30天】在当今快速发展的IT时代,自动化运维已成为提升效率、减少错误的关键。本文将介绍Ansible,一种流行的自动化运维工具,通过简单易懂的语言和实际案例,带领读者从零开始掌握Ansible的使用。我们将一起探索如何利用Ansible简化日常的运维任务,实现快速部署和管理服务器,以及如何处理常见问题。无论你是运维新手还是希望提高工作效率的资深人士,这篇文章都将为你开启自动化运维的新篇章。
|
1天前
|
数据采集 运维 Devops
探索Python编程之美:从基础到进阶自动化运维的变革之路:从脚本到DevOps
【8月更文挑战第30天】在数字化时代的浪潮中,编程已经成为一门重要的技能。Python以其简洁明了的语法和强大的功能,成为了许多初学者的首选编程语言。本文将通过浅显易懂的语言,带领读者从Python的基础语法出发,逐步深入到面向对象编程、网络爬虫开发以及数据分析等高级应用,旨在帮助初学者构建扎实的编程基础,并激发他们进一步探索编程世界的热情。文章不仅分享实用的编程技巧,还将探讨如何将编程知识应用于解决实际问题,以期培养读者的问题解决能力和创新思维。
下一篇
云函数