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判断字符串是否包含子字符串的方法
Mar 24 Python
Python实现登录人人网并抓取新鲜事的方法
May 11 Python
分享Python字符串关键点
Dec 13 Python
Python数据结构之单链表详解
Sep 12 Python
Python文本特征抽取与向量化算法学习
Dec 22 Python
基于Python开发chrome插件的方法分析
Jul 07 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 Python
浅谈python 导入模块和解决文件句柄找不到问题
Dec 15 Python
python opencv minAreaRect 生成最小外接矩形的方法
Jul 01 Python
python计算Content-MD5并获取文件的Content-MD5值方式
Apr 03 Python
Python 通过正则表达式快速获取电影的下载地址
Aug 17 Python
python异步的ASGI与Fast Api实现
Jul 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
url decode problem 解决方法
2011/12/26 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
2018/04/30 PHP
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
详解HTML5 使用video标签实现选择摄像头功能
2017/10/25 Javascript
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
2018/12/06 NodeJs
Vue使用localStorage存储数据的方法
2019/05/27 Javascript
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
js观察者模式的弹幕案例
2020/11/23 Javascript
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
基于numpy中数组元素的切片复制方法
2018/11/15 Python
python爬虫实现获取下一页代码
2020/03/13 Python
通过Python实现一个简单的html页面
2020/05/16 Python
Django 构建模板form表单的两种方法
2020/06/14 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
python识别验证码的思路及解决方案
2020/09/13 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
2021/01/09 Python
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
婚鞋、新娘鞋、礼服鞋、童鞋:Nina Shoes
2019/09/04 全球购物
服装行业创业计划书范文
2014/02/05 职场文书
党的群众路线教育实践活动对照检查材料(个人)
2014/09/24 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
售后服务承诺函格式
2015/01/21 职场文书
团队拓展训练心得体会
2016/01/12 职场文书