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实现udp数据报传输的方法
Sep 26 Python
Python生成随机MAC地址
Mar 10 Python
基于scrapy实现的简单蜘蛛采集程序
Apr 17 Python
python基于itchat实现微信群消息同步机器人
Feb 27 Python
python一行sql太长折成多行并且有多个参数的方法
Jul 19 Python
Python Pywavelet 小波阈值实例
Jan 09 Python
django fernet fields字段加密实践详解
Aug 12 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
Aug 22 Python
opencv python Canny边缘提取实现过程解析
Feb 03 Python
django实现将后台model对象转换成json对象并传递给前端jquery
Mar 16 Python
Python直接赋值及深浅拷贝原理详解
Sep 05 Python
利用Python函数实现一个万历表完整示例
Jan 23 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+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
解决php的“It is not safe to rely on the system’s timezone settings”问题
2015/10/08 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
JavaScript 获取事件对象的注意点
2009/07/29 Javascript
基于jquery tab切换(防止页面刷新)
2012/05/23 Javascript
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
jquery登录的异步验证操作示例
2019/05/09 jQuery
js尾调用优化的实现
2019/05/23 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
仅用50行Python代码实现一个简单的代理服务器
2015/04/08 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
发布你的Python模块详解
2016/09/15 Python
Python通过命令开启http.server服务器的方法
2017/11/04 Python
Python中 传递值 和 传递引用 的区别解析
2018/02/22 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
Python ATM功能实现代码实例
2020/03/19 Python
Python3如何实现Win10桌面自动切换
2020/08/11 Python
Lookfantastic挪威官网:英国知名美妆购物网站
2017/07/26 全球购物
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
老公给老婆的保证书
2014/04/28 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
个人创业事迹材料
2014/12/30 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
雷锋电影观后感
2015/06/10 职场文书
小时代观后感
2015/06/10 职场文书
2019垃圾分类宣传口号汇总
2019/08/16 职场文书
探讨Java中的深浅拷贝问题
2021/06/26 Java/Android
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
2022/04/08 Java/Android