Python unittest装饰器实现原理及代码


Posted in Python onSeptember 08, 2020

1、前言

前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间。

于是就想是不是可以只打开一次浏览器,执行完用例再关闭呢?这就需要用到装饰器(@classmethod)来解决了。

2、@classmethod 装饰器中的 setUpClass() 和 tearDownClass() 与 setUp() 和 tearDown() 的区别

  • setUp():每个测试 case 运行之前运行
  • tearDown():每个测试 case 运行完之后执行
  • setUpClass():必须使用 @classmethod 装饰器, 所有 case 运行之前只运行一次
    • @是修饰符,classmethod 是 python 里的类方法
  • tearDownClass():必须使用 @classmethod 装饰器, 所有 case 运行完之后只运行一次
import unittest

class Test(unittest.TestCase):

  @classmethod
  def setUpClass(cls) -> None:
    print("-----开始执行用例-----")

  def setUp(self) -> None:
    print("执行用例准备动作...")
  def test01(self):
    print("第一条用例正在执行...")
  def test02(self):
    print("第二条用例正在执行...")
  def tearDown(self) -> None:
    print("用例执行完结动作...")
    
  @classmethod
  def tearDownClass(cls) -> None:
    print("-----用例执行结束-----")
    
if __name__ == '__main__':
  unittest.main()

#执行结果如下:
"""
-----开始执行用例-----
执行用例准备动作...
第一条用例正在执行...
用例执行完结动作...
执行用例准备动作...
第二条用例正在执行...
用例执行完结动作...
-----用例执行结束-----
"""

from selenium import webdriver
import unittest
from time import sleep

class DymLogin(unittest.TestCase):

  @classmethod
  def setUpClass(cls) -> None:
    """
    所有的用例只需要执行一次打开浏览器操作
    """
    print("Test start...")
    cls.dr = webdriver.Chrome()
    cls.dr.get("http://www.duoyoumi.com/")
    cls.dr.implicitly_wait(10)
    cls.dr.maximize_window()
    cls.dr.find_element_by_class_name("login").click()
    sleep(1)

  @classmethod
  def tearDownClass(cls) -> None:
    sleep(2)
    cls.dr.quit()
    print("Test end...")

  def test_login01(self):
    """
    账号密码都为空
    """
    self.dr.find_element_by_name("loginName").clear()
    self.dr.find_element_by_name("loginPwd").clear()
    self.dr.find_element_by_xpath('//*[@id="loginForm"]/div/div/div/div[2]/div[1]/div[2]').click()   #登录操作
    TipsMsg = self.dr.find_element_by_class_name("promptLogin").text
    self.assertEqual(TipsMsg,"-请输入登录账号!",msg="Test_login01 login exception")

  def test_login02(self):
    """
    账号正确,密码为空
    """
    self.dr.find_element_by_name("loginName").clear()
    self.dr.find_element_by_name("loginPwd").clear()
    self.dr.find_element_by_name("loginName").send_keys("17779828887")
    self.dr.find_element_by_xpath('//*[@id="loginForm"]/div/div/div/div[2]/div[1]/div[2]').click() # 登录操作
    TipsMsg = self.dr.find_element_by_class_name("promptLogin").text
    self.assertEqual(TipsMsg, "-请输入密码!", msg="Test_login02 login exception")

  def test_login03(self):
    """
    账号密码都正确
    """
    self.dr.find_element_by_name("loginName").clear()
    self.dr.find_element_by_name("loginPwd").clear()
    self.dr.find_element_by_name("loginName").send_keys("17779828887")
    self.dr.find_element_by_name("loginPwd").send_keys("zy295240???")
    self.dr.find_element_by_xpath('//*[@id="loginForm"]/div/div/div/div[2]/div[1]/div[2]').click()   #登录操作
    sleep(2)
    TipsMsg = self.dr.find_element_by_css_selector("#w_nav_temp_1000 > div.fr.dl > a:nth-child(4)").text
    self.assertEqual(TipsMsg,"[退出]",msg="Test_login03 login exception")

if __name__ == '__main__':
  unittest.main()
#执行结果如下
"""
Test start...
...
Test end...
----------------------------------------------------------------------
Ran 3 tests in 25.253s

OK
"""

3、通过装饰器跳过某条用例

添加装饰器(@unittest.skip(""))

import unittest

class Test(unittest.TestCase):

  def setUp(self) -> None:
    print("---start---")

  def tearDown(self) -> None:
    print("---end---")

  def testbbb(self):
    print("case testbbb")

  @unittest.skip("testaaa 被跳过")
  def testaaa(self):
    print("case testaaa")

if __name__ == '__main__':
  unittest.main()

# 结果如下
s.
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK (skipped=1)

---start---
case testbbb
---end---

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python程序和Flask框架中使用SQLAlchemy的教程
Jun 06 Python
python2.7的编码问题与解决方法
Oct 04 Python
python numpy格式化打印的实例
May 14 Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
python日期与时间戳的各种转换示例
Feb 12 Python
pycharm第三方库安装失败的问题及解决经验分享
May 09 Python
python编写一个会算账的脚本的示例代码
Jun 02 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
Oct 15 Python
CocosCreator ScrollView优化系列之分帧加载
Apr 14 Python
Pygame Time时间控制的具体使用详解
Nov 17 Python
Python selenium环境搭建实现过程解析
Sep 08 #Python
Python unittest生成测试报告过程解析
Sep 08 #Python
Python使用Selenium模拟浏览器自动操作功能
Sep 08 #Python
Python unittest如何生成HTMLTestRunner模块
Sep 08 #Python
Django模型验证器介绍与源码分析
Sep 08 #Python
Python unittest discover批量执行代码实例
Sep 08 #Python
Python selenium实现断言3种方法解析
Sep 08 #Python
You might like
用Simple Excel导出xls实现方法
2012/12/06 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
2020/02/03 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
jquery实现表单验证并阻止非法提交
2015/07/09 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
AngularJS中filter的使用实例详解
2017/08/25 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
JS实现单张或多张图片持续无缝滚动的示例代码
2020/05/10 Javascript
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
pygame学习笔记(6):完成一个简单的游戏
2015/04/15 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
巴西家用小家电购物网站:Polishop
2016/08/07 全球购物
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
英国专业美容产品在线:Mylee(从指甲到脱毛)
2020/07/06 全球购物
学习委员自我鉴定
2014/01/13 职场文书
大学专科自荐信
2014/06/17 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
给老师的感谢信
2015/01/20 职场文书
超级礼物观后感
2015/06/15 职场文书
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript
JAVA springCloud项目搭建流程
2022/05/11 Java/Android
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers