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创建日历实例
Aug 21 Python
python解决方案:WindowsError: [Error 2]
Aug 28 Python
Python中字符串的修改及传参详解
Nov 30 Python
Python使用正则表达式实现文本替换的方法
Apr 18 Python
Python自动化运维之Ansible定义主机与组规则操作详解
Jun 13 Python
python实现在函数图像上添加文字和标注的方法
Jul 08 Python
Kali Linux安装ipython2 和 ipython3的方法
Jul 11 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
Mar 01 Python
用python写爬虫简单吗
Jul 28 Python
python在CMD界面读取excel所有数据的示例
Sep 28 Python
python OpenCV学习笔记
Mar 31 Python
Python 数据结构之十大经典排序算法一文通关
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
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
数字转英文
2006/12/06 PHP
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
2011/09/19 PHP
codeigniter中view通过循环显示数组数据的方法
2015/03/20 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
浅析PHP开发规范
2018/02/05 PHP
php实现对短信验证码发送次数的限制实例讲解
2021/03/04 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
IE8中使用javascript动态加载CSS的解决方法
2014/06/17 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
2015/03/27 Javascript
JavaScript改变CSS样式的方法汇总
2015/05/07 Javascript
js电话号码验证方法
2015/09/28 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
详细讲解用Python发送SMTP邮件的教程
2015/04/29 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
Python中交换两个元素的实现方法
2018/06/29 Python
python db类用法说明
2020/07/07 Python
运行python提示no module named sklearn的解决方法
2020/11/29 Python
Python脚本调试工具安装过程
2021/01/11 Python
应届专科生个人的自我评价
2014/01/05 职场文书
数学系毕业生的自我评价
2014/01/10 职场文书
《忆江南》教学反思
2014/04/07 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
2016新年年会主持词
2015/07/06 职场文书
小学美术教学反思
2016/02/17 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
redis 查看所有的key方式
2021/05/07 Redis