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 相关文章推荐
linux系统使用python监测网络接口获取网络的输入输出
Jan 15 Python
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 Python
python制作小说爬虫实录
Aug 14 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
python中将字典形式的数据循环插入Excel
Jan 16 Python
Django 限制用户访问频率的中间件的实现
Aug 23 Python
计算机二级python学习教程(3) python语言基本数据类型
May 16 Python
Python中注释(多行注释和单行注释)的用法实例
Aug 28 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
Mar 05 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
python转化excel数字日期为标准日期操作
Jul 14 Python
Python三维绘图之Matplotlib库的使用方法
Sep 20 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
2006/12/23 PHP
网页的分页下标生成代码(PHP后端方法)
2016/02/03 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
2019/10/17 PHP
JS宝典学习笔记(下)
2007/01/10 Javascript
js过滤数组重复元素的方法
2010/09/05 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
javascript 中__proto__和prototype详解
2014/11/25 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
JS抛物线动画实例制作
2018/02/24 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
深入Vue-Router路由嵌套理解
2018/08/13 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
2019/10/11 Javascript
在antd中setFieldsValue和defaultVal的用法
2020/10/29 Javascript
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
Python插件机制实现详解
2020/05/04 Python
浅析python中的del用法
2020/09/02 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
双十佳事迹材料
2014/01/29 职场文书
研究生毕业鉴定
2014/01/29 职场文书
交通事故检查书范文
2014/01/30 职场文书
普罗米修斯教学反思
2014/02/06 职场文书
食品安全工作实施方案
2014/03/26 职场文书
分公司任命书
2014/06/06 职场文书
领导班子“四风问题”“整改方案
2014/10/02 职场文书
2016年国培研修日志
2015/11/13 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书