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中函数参数设置及使用的学习笔记
May 03 Python
Python3中的列表,元组,字典,字符串相关知识小结
Nov 10 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
python实现定时提取实时日志程序
Jun 22 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
May 16 Python
Django框架中间件(Middleware)用法实例分析
May 24 Python
Python实现K折交叉验证法的方法步骤
Jul 11 Python
Python文件路径名的操作方法
Oct 30 Python
django ajax发送post请求的两种方法
Jan 05 Python
python入门之井字棋小游戏
Mar 05 Python
vscode调试django项目的方法
Aug 06 Python
Pycharm无法打开双击没反应的问题及解决方案
Aug 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
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
php解决约瑟夫环示例
2014/04/09 PHP
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
php+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
利用PHP如何实现Socket服务器
2015/09/23 PHP
php中关于换行的实例写法
2019/09/26 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
js中parseFloat(参数1,参数2)定义和用法及注意事项
2013/01/27 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
js如何获取object类型里的键值
2014/02/18 Javascript
纯javascript实现图片延时加载方法
2015/08/21 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
jQuery插件imgAreaSelect基础讲解
2017/05/26 jQuery
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
JQuery实现折叠式菜单的详细代码
2020/06/03 jQuery
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
python实现简易通讯录修改版
2018/03/13 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
python+Django+pycharm+mysql 搭建首个web项目详解
2019/11/29 Python
详解HTML5通讯录获取指定多个人的信息
2016/12/20 HTML / CSS
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
html5的pushstate以及监听浏览器返回事件的实现
2020/08/11 HTML / CSS
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
计算机软件个人的自荐信范文
2013/12/01 职场文书
会计电算化专业毕业生自荐信
2013/12/20 职场文书
承诺函格式模板
2015/01/21 职场文书
2015年幼儿园中班下学期工作总结
2015/05/22 职场文书
学校隐患排查制度
2015/08/05 职场文书
Python+Selenium自动化环境搭建与操作基础详解
2022/03/13 Python