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进程管理工具supervisor使用实例
Sep 17 Python
python3序列化与反序列化用法实例
May 26 Python
使用Python编写简单的画图板程序的示例教程
Dec 08 Python
Python黑魔法@property装饰器的使用技巧解析
Jun 16 Python
利用python实现简单的邮件发送客户端示例
Dec 23 Python
Python通过Pygame绘制移动的矩形实例代码
Jan 03 Python
django celery redis使用具体实践
Apr 08 Python
使用Python函数进行模块化的实现
Nov 15 Python
python返回数组的索引实例
Nov 28 Python
基于python图像处理API的使用示例
Apr 03 Python
python numpy库np.percentile用法说明
Jun 08 Python
pytorch 查看cuda 版本方式
Jun 23 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
一个可以找出源代码中所有中文的工具
2006/10/25 PHP
PHP中HTML标签过滤技巧
2014/01/07 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
js数组操作学习总结
2013/11/04 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
Javascript实现计算个人所得税
2015/05/10 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
通过vue-cli来学习修改Webpack多环境配置和发布问题
2017/12/22 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
微信小程序实现传递多个参数与事件处理
2019/08/12 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
微信小程序图片自适应实现解析
2020/01/21 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
Python实现的凯撒密码算法示例
2018/04/12 Python
python散点图实例之随机漫步
2018/08/27 Python
python绘制热力图heatmap
2020/03/23 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
英国最大的婴儿监视器网上商店:Baby Monitors Direct
2018/04/24 全球购物
残疾人小组计划书
2014/04/27 职场文书
政风行风评议整改方案
2014/09/15 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
侵犯商业秘密的律师函
2015/05/27 职场文书
电影复兴之路观后感
2015/06/02 职场文书
八年级作文之友谊
2019/12/02 职场文书
OpenCV-Python使用cv2实现傅里叶变换
2021/06/09 Python
Java移除无效括号的方法实现
2021/08/07 Java/Android