unittest(@classmethod 装饰器)
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("")
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("")
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---
unittest(@classmethod 装饰器)的更多相关文章
- 3.4 unittest之装饰器(@classmethod)
3.4 unittest之装饰器(@classmethod) 前言前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例 ...
- (unittest之装饰器(@classmethod)) 让多个测试用例在一个浏览器里面跑 的方法
一.装饰器 1.用setUp与setUpClass区别 setup():每个测试case运行前运行teardown():每个测试case运行完后执行setUpClass():必须使用@classmet ...
- python unittest框架装饰器
要说单元测试和UI自动化之间的是什么样的一个关系,说说我个人的一些心得体会吧,我并没有太多的这方面经验,由于工作本身就用的少,还有就是功能测试点点对于我这种比较懒惰的人来说,比单元测试复杂...思考单 ...
- unittest之装饰器
前面讲到 unittest 里面 setUp 可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间.于是就想是不是可以 ...
- @classmethod装饰器
当一个类中有多条用例,我们在执行的时候每执行一条用例就要重新打开一次浏览器操作,例如下: start test1 quit start test2 start 若我们使用@classmethod装饰器 ...
- 手动实现staticmethod和classmethod装饰器
首先,staticmethod和classmethod装饰器是通过非数据描述符实现的.用法简单,这里就不细说了. 这里主要分析一下staticmethod和classmethod是如何通过描述符实现的 ...
- day28 classmethod 装饰器
类方法装饰类方法 把一个方法变成类中的方法 之后调用此方法不需要对类实例化后在调用 直接通过类.方法即可调用 class Goods: __discount = 0.5 def __init__(se ...
- Python + selenium + unittest装饰器 @classmethod
前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间. 于是就想是不是可以 ...
- Selenium2+python-unittest之装饰器(@classmethod)
原文地址:http://www.cnblogs.com/yoyoketang/p/6685416.html 前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量 ...
随机推荐
- Kafka,RocketMQ,RabbitMQ部署与使用体验
前言 近期在研究各种消息队列方案,为了有一个直观的使用体验,我把Kafka,RocketMQ,RabbitMQ各自部署了一遍,并使用了最基本的生产与消费消息功能.在部署过程中也遇到一些问题,特此记录. ...
- Hadoop在Ubuntu的安装和使用
由于小编在本学期有一门课程需要学习hadoop,需要在ubuntu的linux系统下搭建Hadoop环境,在这个过程中遇到一些问题,写下这篇博客来记录这个过程,并把分享给大家. Hadoop的安装方式 ...
- Python操作rabbitmq系列(五):根据主题分配消息
接着上一章,使用exchange_type='direct'进行消息传递.这样消息会完全匹配后发送到对应的接收端.现在我们想干这样一件事: C1获取消息中包含:orange内容的消息,并且消息是由3个 ...
- Idea离线安装plugins插件 如Lombok
由于公司不允许使用外网,之前用的idea 15 安装了一次.但是idea15的提示不够友好,今天升级idea2017.3.2,同样又需要安装,那就写个教程吧. 网上其他的安装教程不通用,也是针对不同i ...
- Linux c++ vim环境搭建系列(6)——CMakeLists.txt多文档多目录组织方法和编写示例
CMakeLists.txt学习 1. 概要 主要是关于cmakelists.txt的编写模板,和多文档多目录的组织方法详解, 涉及第三方库的添加使用方法. 这里主要介绍cmakelists.txt的 ...
- spring 中 hibernate 的 2种 配置方式(新旧 2种方式)
Spring对hibernate配置文件hibernate.cfg.xml的集成,来取代hibernate.cfg.xml的配置 Spring对hibernate配置文件hibernate.cfg.x ...
- 如何练习python?有这五个游戏,实操经验就已经够了
现在学习python的人越来越多了,但仅仅只是学习理论怎么够呢,如何练习python?已经是python初学者比较要学会的技巧了! 其实,最好的实操练习,就是玩游戏. 也许你不会信,但这五个小游戏足够 ...
- 2019-07-31【机器学习】无监督学习之聚类 K-Means算法实例 (图像分割)
样本: 代码: import numpy as np import PIL.Image as image from sklearn.cluster import KMeans def loadData ...
- jquery的焦点图片无限循环关键思维
在循环的时候,关键的是按(下一页按钮)到最后一页的时候和按(上一页按钮)到到第一页的时候如何转换: 首先必须知道3个js方法,prepend().append()和clone(); prepend() ...
- vue2.x学习笔记(三)
接着前面的内容:https://www.cnblogs.com/yanggb/p/12562137.html. vue实例 要使用vue提供的特性与功能,都需要通过vue实例来使用. 创建一个vue实 ...