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 (1)
Oct 31 Python
python概率计算器实例分析
Mar 25 Python
Python中MySQL数据迁移到MongoDB脚本的方法
Apr 28 Python
Python使用PIL模块生成随机验证码
Nov 21 Python
python+pygame简单画板实现代码实例
Dec 13 Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 Python
python生成器与迭代器详解
Jan 01 Python
python中正则表达式与模式匹配
May 07 Python
Ubuntu+python将nii图像保存成png格式
Jul 18 Python
python正则表达式匹配不包含某几个字符的字符串方法
Jul 23 Python
python输出带颜色字体实例方法
Sep 01 Python
Python configparser模块应用过程解析
Aug 14 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
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
2016/01/27 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
jquery实用代码片段集合
2010/08/12 Javascript
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
jquery实现submit提交表单
2015/02/03 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
jQuery实现的登录浮动框效果代码
2015/09/26 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
jQuery动画效果相关方法实例分析
2015/12/31 Javascript
javascript日期比较方法实例分析
2016/06/17 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
Angular使用操作事件指令ng-click传多个参数示例
2018/03/27 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
JS typeof fn === 'function' && fn()详解
2020/08/22 Javascript
[01:18:45]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第三场2月1日
2021/03/11 DOTA
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
Python交互环境下实现输入代码
2018/06/22 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
Python tkinter之Bind(绑定事件)的使用示例
2021/02/05 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
物流合作计划书
2014/01/10 职场文书
搞笑婚礼主持词
2014/03/13 职场文书
小区物业门卫岗位职责
2014/04/10 职场文书
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
政府采购方案
2014/06/12 职场文书
2014年高中教师工作总结
2014/12/19 职场文书
股东大会通知
2015/04/24 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书
如何在python中实现ECDSA你知道吗
2021/11/23 Python