我们知道setUp()和setDown()的作用是在每条测试用例执行前准备测试环境以及用例测试结束后恢复测试环境,如果我们执行的测试类下所有测试用例的环境准备和环境复原的操作都是一样的,那么我们就没必要每条测试用例执行前都执行一次setUp()和setDown()的操作。在运行测试类前只执行一次环境的准备,测试类运行结束后只执行一次环境复原的操作,这时我们就可以引入装饰器@classmethod

代码:

# coding = utf-8
import unittest
import warnings
from selenium import webdriver
from time import sleep
# 驱动文件路径
driverfile_path = r'D:\coship\Test_Framework\drivers\IEDriverServer.exe' class CmsLoginTest(unittest.TestCase): @classmethod
def setUpClass(cls):
print("test start!")
# 这行代码的作用是忽略一些告警打印
warnings.simplefilter("ignore", ResourceWarning)
cls.driver = webdriver.Ie(executable_path=driverfile_path)
cls.driver.get("http://172.21.13.83:28080/") @classmethod
def tearDownClass(cls):
cls.driver.quit()
print("test end!") def test_login1(self):
'''用户名、密码为空'''
self.driver.find_element_by_css_selector("[name='admin.loginName']").clear()
self.driver.find_element_by_css_selector("[name='admin.password']").clear()
self.driver.find_element_by_css_selector("#imageField").click()
error_message1 = self.driver.find_element_by_css_selector("[for='loginName']").text
error_message2 = self.driver.find_element_by_css_selector("[for='textfield']").text
self.assertEqual(error_message1, '用户名不能为空')
self.assertEqual(error_message2, '密码不能为空') def test_login2(self):
'''用户名正确,密码错误'''
self.driver.find_element_by_css_selector("[name='admin.loginName']").clear()
self.driver.find_element_by_css_selector("[name='admin.password']").clear()
self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("autotest")
self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("")
self.driver.find_element_by_css_selector("#imageField").click()
error_message = self.driver.find_element_by_css_selector(".errorMessage").text
self.assertEqual(error_message, '密码错误,请重新输入!') def test_login3(self):
'''用户名不存在'''
self.driver.find_element_by_css_selector("[name='admin.loginName']").clear()
self.driver.find_element_by_css_selector("[name='admin.password']").clear()
self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("test007")
self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("")
self.driver.find_element_by_css_selector("#imageField").click()
error_message = self.driver.find_element_by_css_selector(".errorMessage").text
self.assertEqual(error_message, '用户不存在!') def test_login4(self):
'''用户名、密码正确'''
self.driver.find_element_by_css_selector("[name='admin.loginName']").clear()
self.driver.find_element_by_css_selector("[name='admin.password']").clear()
self.driver.find_element_by_css_selector("[name='admin.loginName']").send_keys("autotest")
self.driver.find_element_by_css_selector("[name='admin.password']").send_keys("")
self.driver.find_element_by_css_selector("#imageField").click()
sleep(1)
self.driver.switch_to.frame("topFrame")
username = self.driver.find_element_by_css_selector("#nav_top>ul>li>a").text
self.assertEqual(username,"autotest") if __name__ == "__main__":
unittest.main(verbosity=2)

执行结果:

"C:\Program Files\Python36\python.exe" D:/Git/Test_Framework/test_case/test_cmslogin.py
test start!
test_login1 (__main__.CmsLoginTest)
用户名、密码为空 ... ok
test_login2 (__main__.CmsLoginTest)
用户名正确,密码错误 ... ok
test_login3 (__main__.CmsLoginTest)
用户名不存在 ... ok
test_login4 (__main__.CmsLoginTest)
用户名、密码正确 ... ok
test end! ----------------------------------------------------------------------
Ran 4 tests in 22.462s OK Process finished with exit code 0

从执行结果中可以看到,整个测试类的运行过程中,只执行了一次setUpClass()和tearDownClass()

unittest详解(五) 引入装饰器@classmethod的更多相关文章

  1. 详解python的装饰器decorator

    装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...

  2. 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter

    上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...

  3. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

  4. 详解Python的装饰器

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  5. python设计模式之迭代器与生成器详解(五)

    前言 迭代器是设计模式中的一种行为模式,它提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.python提倡使用生成器,生成器也是迭代器的一种. 系列文章 python设计模 ...

  6. 【笔记】Python基础五:装饰器

    一,什么是装饰器 本质就是函数,功能是为其他函数添加附加功能 原则: 1,不修改被修饰函数的源代码 2,不修改被修饰函数的调用方式 例子: import time def timmer(func): ...

  7. .NET DLL 保护措施详解(五)常规条件下的破解

    为了证实在常规手段破解下能有效保护程序核心功能(演示版本对AES加解密算法及数据库的密钥(一段字符串)进行了保护),特对此DLL保护思路进行相应的测试,包含了反编译及反射测试,看是否能得到AES加解密 ...

  8. 转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。

    原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模 ...

  9. 初学 Python(十五)——装饰器

    初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...

随机推荐

  1. [AGC040C] Neither AB nor BA

    Description 一个长度为 n 的字符串是好的当且仅当它由 'A', 'B', 'C' 组成,且可以通过若干次删除除了"AB"和"BA"的连续子串变为空 ...

  2. Java基础开篇

    我是一个2019毕业的非计算机的毕业生,从大二开始喜欢上Java直到现在一直都在学习,Brid从小就对计算机感兴趣,可惜高中的时候不懂事,没有规划未来,考上了一所专科学院,然后大一并不能转专业,现在毕 ...

  3. FFmpeg4.0笔记:封装ffmpeg的解码功能类CDecode

    Github https://github.com/gongluck/FFmpeg4.0-study/tree/master/Cff CDecode.h /********************** ...

  4. 列出bug的几种状态

    1.New:(新的) 当某个“bug”被发现的时候(第一次),测试人员需要与项目负责人沟通以确认发现的的确是一个bug,如果被确认是一个bug,就将其记录下来,并将bug的状态设为New. 2.Ass ...

  5. 小白基础Python重要的字符串详解String的内置方法

    String的内置方法: st='hello world  {name} is {age}'  {}  特殊内容需要识别format print(st.count('1')) 统计元素个数 print ...

  6. 1,全局变量;2,图形验证码;3,解决bug的毅力

    通过这一整天的学习,主要解决了这三个: 1,全局变量 在函数外部定义: var gloabl: function test(){ global = " ":    //不能写成va ...

  7. 独热编码 pandas get_dummies

    映射技巧 将'income_raw'编码成数字值 income_mapping = {'<=50K': 0,'>50K': 1} income = income_raw.map(incom ...

  8. Nginx默认配置语法

    Nginx默认配置语法 1. 我们进入  /etc/nginx/目录下,打开  nginx.conf文件 2. 我们来解析下 这里面标签和各模块的作用 # 设置nginx服务的系统使用用户 user ...

  9. mysql 5.7.24 root密码重置

    sudo mysql -u root -p 初始root密码没有,直接按回车 show databases: use mysql; update user set authentication_str ...

  10. Delphi 鼠标的编程