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项目发布为exe可执行程序过程分享
Oct 23 Python
Python中的迭代器漫谈
Feb 03 Python
sublime text 3配置使用python操作方法
Jun 11 Python
Python实现爬取需要登录的网站完整示例
Aug 19 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
Apr 28 Python
python实现随机漫步方法和原理
Jun 10 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
Python切图九宫格的实现方法
Oct 10 Python
python安装本地whl的实例步骤
Oct 12 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
在django admin中配置搜索域是一个外键时的处理方法
May 20 Python
Django执行源生mysql语句实现过程解析
Nov 12 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删除HTMl标签的三种解决方法
2013/06/30 PHP
php实现的Captcha验证码类实例
2014/09/22 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
2016/03/02 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
2010/12/28 Javascript
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
2012/07/26 Javascript
js移除事件 js绑定事件实例应用
2012/11/28 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
七个很有意思的PHP函数
2014/05/12 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
jQuery EasyUI 页面加载等待及页面等待层
2017/02/06 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
2017/12/24 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
element-ui 本地化使用教程详解
2019/10/28 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
softmax及python实现过程解析
2019/09/30 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
Pycharm安装python库的方法
2020/11/24 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
css3中的calc函数浅析
2018/07/10 HTML / CSS
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
2014年新教师工作总结
2014/11/08 职场文书
员工家属慰问信
2015/03/24 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
办公室规章制度范本
2015/08/04 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers