Python unittest装饰器实现原理及代码
作者:多测师_郑sir 发布时间:2022-05-06 22:33:49
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---
来源:https://www.cnblogs.com/ZhengYing0813/p/12343875.html


猜你喜欢
- 本文介绍用python实现的搜索本地文本文件内容的小程序。从而学习Python I/O方面的知识。代码如下:import os#根据文件扩展
- tkinter是python自带的GUI库,可以实现简单的GUI交互,该例子添加了五种不同效果的Button,如图:from tkinter
- Linux环境MySQL服务器级优化讲解 摘要:本节简单介绍了如何在服务器级优化数据库的性能
- 本文实例讲述了js+html5操作sqlite数据库的方法。分享给大家供大家参考,具体如下://copyright by lanxyou l
- <%Function BytesToBstr(body,Cset)dim objstreamset&n
- 定义一个什么都不做的函数>>> def a():... pass...>>> def printHell
- 例子老规矩,先上一个代码:def add(s, x): return s + xdef gen(): for i in range(4):
- 一、如何设置utf8mb4mysql中针对字符串类型,在设置charset的时候可以精确到字段。如果只将某个字段设置utf8mb4,那么其他
- 一、 node安装1)如果不确定自己是否安装了node,可以在命令行工具内执行: node -v (检查一下 版本);2)如果 执行结果显示
- 问题描述: 买了mac电脑,第一次装mysql,不知道初始密码,如何修改初始密码记录下。解决方式:htt
- 最近一个项目开发要用到PHP技术导出Word文档,比较了几种方案,首先是使用Microsoft Office自带的ActiveX/COM组件
- 本文实例讲述了Python面向对象思想与应用。分享给大家供大家参考,具体如下:面向对象思想1、面向对象的设计思想面向对象是基于万物皆对象这个
- 1. 相对与比较老的环境,建议使用第二个 set dbconnection=Server.CREATEOBJECT("ADODB.
- 1. 优化你的MySQL查询缓存在MySQL服务器上进行查询,可以启用高速查询缓存。让数据库引擎在后台悄悄的处理是提高性能的最有
- plt.imshow(image)无法显示图片的解决使用plt.imshow()发现不能显示图片,加了plt.show()也还是不能显示先引
- 如果想读取用 open() 函数打开的文件中的内容,除了可以使用 read() 函数,还可以使用 readline() 和 readline
- 视频对象提取与其说是视频对象提取,不如说是视频颜色提取,因为其本质还是使用了OpenCV的HSV颜色物体检测。下面话不多说了,来一起看看详细
- pycharm简介PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语
- 今天在部署一个实验系统的时候,报出下面这个错: Your 'max_allowed_packet' variable is
- 函数的作用域python中的作用域分4种情况:L:local,局部作用域,即函数中定义的变量;E:enclosing,嵌套的父级函数的局部作