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
猜你喜欢
- 在布尔索引中,我们将根据 DataFrame 中数据的实际值而不是它们的行/列标签或整数位置来选择数据子集。在布尔索引中,我们使用布尔向量来
- 问题描述:被搜索名字为:andy这时搜索andy正常,但是搜索a就搜不到。解决办法,在索引配置文件中的index中添加min_infix_l
- 1、基于字典的创建规划问题上篇中介绍了使用 LpVariable 对逐一定义每个决策变量,设定名称、类型和上下界,类似地对约束条件也需要逐一
- 利用ASP从远程服务器上接收XML数据<% dim objXML dim objRootElement dim&n
- 我发布了一个通过FTP自动优化新图像的教程。这次我们将抓取整个网站,并在本地优化我们遇到的图像,按URL组织。请注意,这个简短但中级的脚本不
- 你们要的3D太阳系图片上传之后不知为何帧率降低了许多。。。日地月三体所谓三体,就是三个物体在重力作用下的运动。由于三点共面,所以三个质点仅在
- 看代码吧~import numpy as npa = np.array([[2, 4, 6, 1], [1, 5, 2, 9]])print
- 一.概念简介 脚本:script是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。 二.背景 近来在Wind
- 元组(Tuple)元组是有序且不可更改的集合。在 Python 中,元组是用圆括号编写的。实例创建元组:thistuple = ("
- 一、概念 1. 数据库 (Database)什么是数据库?数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合。这种数据集合具有如下
- 本文实例为大家分享了python实现学生信息管理系统的具体代码,供大家参考,具体内容如下学生管理系统的开发步骤:1、显示学生管理系统的功能菜
- Model中分别提供了filter方法和icontains方法实现简单的搜索功能。html页面中实现搜索框模板api_test_manage
- 1.元字符: . 它匹配除了换行字符外的任何字符,在 alternate 模式(re.DOTALL)下它甚至可以匹配换行 ^ 匹配行首。除非
- 我们知道,在调用函数时如果不指定某个参数,Python 解释器会抛出异常。为了解决这个问题,Python 允许为参数设置默认值,即在定义函数
- 1.依次安装python2和python3,并添加到系统环境变量中2.找到python3的安装目录,一般在C:\Users\Administ
- 在不同平面上绘制二维条形图。本实例制作了一个3d图,其中有二维条形图投射到平面y=0,y=1,等。演示结果:完整代码:from mpl_to
- 现代浏览器可以基于RFC 2397标准使用base64把图片进行编码,然后输出类似data:image/png;base64,iVBORw0
- Dim iSet conn=Server.CreateObject("ADODB.Connecti
- 简单介绍Mac下使用HomeBrew安装Python 3.*版本并设置为默认值1、首先查看Mac自带的python,可以看到是2.7.10的
- 因为工作(懒惰),几年了,断断续续学习又半途而废了一个又一个技能。试着开始用博客记录学习过程中的问题和解决方式,以便激励自己和顺便万一帮助了