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 相关文章推荐
Phantomjs抓取渲染JS后的网页(Python代码)
May 13 Python
用Python实现命令行闹钟脚本实例
Sep 05 Python
Python 描述符(Descriptor)入门
Nov 20 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
python实现隐马尔科夫模型HMM
Mar 25 Python
python使用webdriver爬取微信公众号
Aug 31 Python
python进行TCP端口扫描的实现
Dec 21 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 Python
详解python--模拟轮盘抽奖游戏
Apr 12 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 Python
Python实现智慧校园自动评教全新版
Jun 18 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 遍历数据表数据并列表横向排列的代码
2009/09/05 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
zend framework重定向方法小结
2016/05/28 PHP
php实现base64图片上传方式实例代码
2017/02/22 PHP
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
2014/06/06 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
jQuery实现指定内容滚动同时左侧或其它地方不滚动的方法
2015/08/08 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
2017/04/22 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
js input输入百分号保存数据库失败的解决方法
2018/05/26 Javascript
微信小程序模板消息推送的两种实现方式
2019/08/27 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
Python中的类学习笔记
2014/09/23 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
python实现接口并发测试脚本
2019/06/25 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
python 制作简单的音乐播放器
2020/11/25 Python
HTML5中判断用户是否正在浏览页面的方法
2014/05/03 HTML / CSS
网络教育自我鉴定
2013/11/01 职场文书
党课学习思想汇报
2014/01/02 职场文书
七年级音乐教学反思
2014/01/26 职场文书
巾帼文明岗申报材料
2014/05/01 职场文书
家庭贫困证明
2014/09/23 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
2016高考寄语或鼓励的话语
2015/12/04 职场文书
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL