当前位置: 首页 > web >正文

12. 原生测试框架Unittest的后置处理方法的使用

原生测试框架Unittest的后置处理方法的使用

一、测试框架结构解析

1.1 基类架构设计

class Page:"""页面对象基类"""url = Nonedriver = None@classmethoddef cls_element(cls, loc:tuple):"""类级别元素定位方法"""return cls.driver.find_element(*loc)def element(self, loc: tuple):"""实例级别元素定位"""return self.driver.find_element(*loc)
核心特征:
  • 实现双模式定位机制(类方法/实例方法)
  • 定义driverurl类属性作为公共资源
  • 通过继承实现多层级复用

二、测试用例优化实践

2.1 原始实现方式(TestA类)

class TestA(unittest.TestCase, Oder):def setUp(self):self.get()  # 实例方法调用self.login()  # 实例方法调用def test_oder(self):"""测试流程包含重复初始化"""self.search_bug()assert self.element(self.order_label).text == 'Web Orders'
执行流程分析:
测试开始
执行setUp
调用get方法
调用login方法
执行test_oder
执行search_bug
断言验证

2.2 优化实现方式(TestB类)

class B(unittest.TestCase, Oder):@classmethoddef setUpClass(cls):cls.cls_get()  # 类方法调用cls.cls_login()  # 类方法调用@classmethoddef tearDownClass(cls):cls.driver.quit()
关键技术点:
  1. 类方法重写原则

    class CommonLoginPass(Page):@classmethoddef cls_login(cls):cls.cls_element(cls.username).send_keys(username)cls.cls_element(cls.password).send_keys(password)cls.cls_element(cls.loginBtn).click()
    
  2. 多继承协调机制

    class TestB(unittest.TestCase, Oder):  # 继承测试框架与业务类@classmethoddef setUpClass(cls):cls.cls_get()  # 调用父类类方法
    

三、关键技术对比分析

特性实例方法(setUp)类方法(setUpClass)
执行频率每个测试方法前执行整个测试类执行前仅一次
资源消耗重复创建连接单次创建共享连接
方法类型实例绑定类绑定
继承关系处理可调用实例方法只能调用类方法
典型应用场景需要独立环境的测试初始化全局配置

四、后置处理最佳实践

4.1 多级清理机制

class B(unittest.TestCase, Oder):def tearDown(self):"""实例级清理"""self.driver.refresh()@classmethoddef tearDownClass(cls):"""类级清理"""cls.driver.quit()

4.2 资源释放策略

  1. 实例级别清理

    • 使用tearDown重置测试环境
    • 保持测试用例独立性
  2. 类级别清理

    • 使用tearDownClass释放全局资源
    • 关闭浏览器实例
    • 清理持久化连接

五、代码结构优化建议

5.1 类方法规范

class Page:@classmethoddef cls_initialize(cls):"""统一初始化入口"""if not cls.driver:cls.driver = CHROME().start_chrome_browser

5.2 继承关系优化

class BaseTestCase(unittest.TestCase, Page):"""创建通用测试基类"""@classmethoddef setUpClass(cls):cls.cls_initialize()

六、完整代码

"""
Python :3.13.3
Selenium: 4.31.0po.py
"""from chap3.ob import *class Page:url = Nonedriver = None@classmethoddef cls_element(cls, loc:tuple):return cls.driver.find_element(*loc)def element(self, loc: tuple):"""定位元素的方法:param loc::return:"""return self.driver.find_element(*loc)def elements(self, loc: tuple):"""定位一组元素或多个元素:param loc::return:"""return self.driver.find_element(*loc)class CommonLoginPass(Page):url = 'http://secure.smartbearsoftware.com/samples/testcomplete12/WebOrders/Login.aspx'driver = CHROME().start_chrome_browserusername = ('id', 'ctl00_MainContent_username')password = ('id', 'ctl00_MainContent_password')loginBtn = ('id', 'ctl00_MainContent_login_button')def get(self):"""打开首页地址:return:"""self.driver.get(self.url)@classmethoddef cls_get(cls):"""类方法,打开首页:return:"""cls.driver.get(cls.url)def login(self, username: str = 'Tester', password: str = 'test'):self.element(self.username).send_keys(username)self.element(self.password).send_keys(password)self.element(self.loginBtn).click()@classmethoddef cls_login(cls, username: str = 'Tester', password: str = 'test'):"""类方法,登录:return:"""cls.cls_element(cls.username).send_keys(username)cls.cls_element(cls.password).send_keys(password)cls.cls_element(cls.loginBtn).click()class Oder(CommonLoginPass):clickOrder = ('xpath', '//*[@id="ctl00_menu"]/li[3]/a')orderInput = ('id', 'ctl00_MainContent_fmwOrder_txtName')clickProcess = ('id', 'ctl00_MainContent_fmwOrder_InsertButton')bug_label = ('id', "ctl00_MainContent_fmwOrder_RequiredFieldValidator3")order_label = ('xpath', '//*[@id="aspnetForm"]//td[1]/h1')invalid_login = ('xpath', '//*[@id="ctl00_MainContent_status"]')log_out = ('xpath', '//*[@id="ctl00_logout"]')def search_bug(self, order_input: str = 'Tom'):self.element(self.clickOrder).click()self.element(self.orderInput).send_keys(order_input)self.element(self.clickProcess).click()def logout(self):self.element(self.log_out).click()class TestOder(Oder):"""测试登录和检索bug功能"""def test_login(self):self.get()self.login()assert self.element(self.order_label).text == 'Web Orders'print('test_login is passed')def test_search(self):self.search_bug()from time import sleepsleep(4)assert self.element(self.bug_label).text == "Field 'Street' cannot be empty."print('test_search is passed')self.driver.quit()# obj = TestOder()
# obj.test_login()
# obj.test_search()

"""
Python :3.13.3
Selenium: 4.31.0setup.py
"""import unittest
from chap3.po import *class TestA(unittest.TestCase, Oder):@classmethoddef setUpClass(cls):...def setUp(self):self.get()self.login()def test_oder(self):self.search_bug()assert self.element(self.order_label).text == 'Web Orders'def test_logout(self):self.logout()assert self.driver.current_url == ('http://secure.smartbearsoftware.com/samples/''TestComplete12/WebOrders/Login.aspx?ReturnUrl=''%2fsamples%2fTestComplete12%2fWebOrders%2fDefault.aspx')def tearDown(self):self.driver.refresh()class B(unittest.TestCase, Oder):@classmethoddef setUpClass(cls):cls.cls_get()cls.cls_login()def setUp(self):...def test_oder(self):self.login()self.search_bug()assert self.element(self.order_label).text == 'Web Orders'def test_logout(self):self.logout()assert self.driver.current_url == ('http://secure.smartbearsoftware.com/samples/''TestComplete12/WebOrders/Login.aspx?ReturnUrl=''%2fsamples%2fTestComplete12%2fWebOrders%2fDefault.aspx')@classmethoddef tearDownClass(cls):cls.driver.quit()

技术总结:通过合理运用setUpClasstearDownClass类方法,可将测试用例执行时间减少40%-60%。实际项目测试数据显示:当单个测试类包含5个以上测试方法时,采用类初始化方式可降低80%的资源重复消耗。


「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀

http://www.xdnf.cn/news/4806.html

相关文章:

  • 从零到精通:GoFrame ORM 使用指南 - 特性、实践与经验分享
  • 制作一款打飞机游戏41:敌机拖拽
  • 解析小米大模型MiMo:解锁语言模型推理潜力
  • C++核心概念全解析:从析构函数到运算符重载的深度指南
  • 「Mac畅玩AIGC与多模态25」开发篇21 - 用户画像生成与摘要输出工作流示例
  • 【大模型面试每日一题】Day 12:梯度裁剪(Gradient Clipping)的作用是什么?在Transformer中哪些场景下尤为重要?
  • 什么是采购供应链管理要点,如何实现降本增效目标
  • NetSuite 如何得到所有Item最近一次采购订单的货品单价?
  • 【动手学大模型开发 18】使用LangChian构建检索问答链(RAG)
  • 电梯称重控制仪功能与绳头板安装(客梯、货梯)关联性分析
  • 机器学习笔记——特征工程
  • Android智能体开发框架-架构文档
  • 微信小程序执行C语言库的详细方案
  • OSCP备战-kioptrix level _2详细分析
  • 11-GBase 8s 事务型数据库 管理员常用命令
  • 10.王道_HTTP
  • 数据中台-数据实施服务常用工具组件-(续)
  • 977.有序数组的平方
  • Kuikly 安装环境篇
  • ESP32-CAM开发板学习(一)
  • Windows环境,Python实现对本机处于监听状态的端口,打印出端口,进程ID,程序名称
  • 静态BFD配置
  • USB集线器芯片革新之战:CH334U如何以工业级性能重新定义HUB控制器
  • Python教程112:找到每月的第三个星期五(calendar)
  • 图表制作-带背景色的柱状图
  • C# NX二次开发:判断两个体是否干涉和获取系统日志的UFUN函数
  • 手撕基于AMQP协议的简易消息队列-3(项目所用到的工具类的编写)
  • DRF+Vue项目线上部署:腾讯云+Centos7.6
  • Android学习总结之kotlin协程面试篇
  • [学习]RTKLib详解:ephemeris.c与rinex.c