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 相关文章推荐
Windows8下安装Python的BeautifulSoup
Jan 22 Python
python获取本机mac地址和ip地址的方法
Apr 29 Python
基于pip install django失败时的解决方法
Jun 12 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
Aug 25 Python
Python中is和==的区别详解
Nov 15 Python
Python 判断奇数偶数的方法
Dec 20 Python
对python使用telnet实现弱密码登录的方法详解
Jan 26 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
python实现诗歌游戏(类继承)
Feb 26 Python
pycharm创建scrapy项目教程及遇到的坑解析
Aug 15 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
python实现KNN分类算法
Oct 16 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制作用户注册系统
2015/10/23 PHP
纯php生成随机密码
2015/10/30 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
既简单又安全的PHP验证码 附调用方法
2016/06/02 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
prototype与__proto__区别详细介绍
2017/01/09 Javascript
jQuery实现的浮动层div浏览器居中显示效果
2017/02/03 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
vue实现模态框的通用写法推荐
2018/02/26 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
python实现定制交互式命令行的方法
2014/07/03 Python
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
使用Python更换外网IP的方法
2018/07/09 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
详解python方法之绑定方法与非绑定方法
2020/08/17 Python
python判断变量是否为列表的方法
2020/09/17 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
冰峪沟导游词
2015/02/09 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
走近毛泽东观后感
2015/06/04 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang
解决vue $http的get和post请求跨域问题
2021/06/07 Vue.js
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers