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多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
Python使用scrapy采集时伪装成HTTP/1.1的方法
Apr 08 Python
Python多线程和队列操作实例
Jun 21 Python
python用装饰器自动注册Tornado路由详解
Feb 14 Python
利用python模拟实现POST请求提交图片的方法
Jul 25 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
python单例模式实例解析
Aug 28 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
Dec 10 Python
python threading和multiprocessing模块基本用法实例分析
Jul 25 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
Aug 09 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
Feb 26 Python
解决keras加入lambda层时shape的问题
Jun 11 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(1)
2006/10/09 PHP
超级实用的7个PHP代码片段分享
2012/01/05 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
实测在class的function中include的文件中非php的global全局环境
2013/07/15 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
php析构函数的简单使用说明
2015/08/24 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
2017/09/29 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
UI Events 用户界面事件
2012/06/27 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
JavaScript使用focus()设置焦点失败的解决方法
2014/09/03 Javascript
jquery实现select选择框内容左右移动代码分享
2015/11/21 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
vue二级路由设置方法
2018/02/09 Javascript
Javascript中prototype与__proto__的关系详解
2018/03/11 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
js图片无缝滚动插件使用详解
2020/05/26 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
Python写的服务监控程序实例
2015/01/31 Python
python实现自动登录后台管理系统
2018/10/18 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
CSS3实现背景透明文字不透明的示例代码
2018/06/25 HTML / CSS
五年级语文教学反思
2014/01/30 职场文书
残疾人创业典型事迹
2014/02/01 职场文书
优秀部门获奖感言
2014/02/14 职场文书
小学生学雷锋演讲稿
2014/04/25 职场文书
建筑技术负责人岗位职责
2015/04/13 职场文书
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis