目录

  • 1、unittest全部属性
  • 2、用例基本类:unittest.TestCase
    • 2.1、前置条件:setUp()
    • 2.2、后置条件:tearDown()
    • 2.3、断言:assert*()
  • 3、单元测试:unittest.main()
  • 4、用例套件_1:unittest.TestSuite()
  • 5、用例套件_2:unittest.defaultTestLoader()
  • 6、执行套件:unittest.TextTextRunner()
  • 7、装饰器:unittest.skip()
  • 8、装饰器:@classmethod
  • 9、数据驱动:ddt
  • 10、生成测试报告:HTMLTestRunner
  • 11、截图

1、unittest全部属性

['BaseTestSuite', 'FunctionTestCase', 'SkipTest', 'TestCase', 'TestLoader',
'TestProgram', 'TestResult', 'TestSuite', 'TextTestResult', 'TextTestRunner',
'_TextTestResult', '__all__', '__builtins__', '__doc__', '__file__', '__name__',
'__package__', '__path__', '__unittest', 'case', 'defaultTestLoader',
'expectedFailure', 'findTestCases', 'getTestCaseNames', 'installHandler', 'loader',
'main', 'makeSuite', 'registerResult', 'removeHandler', 'removeResult', 'result',
'runner', 'signals', 'skip', 'skipIf', 'skipUnless', 'suite', 'util']

2、用例基本类:unittest.TestCase

TestCase类,所有测试用例类继承的基本类。使用方法:class BaiduTest(unittest.TestCase):pass

2.1、前置条件:setUp()

  • 用于测试用例执行前的初始化工作。
  • 如:连接数据库、初始化浏览器等。
# 使用方法:def setUp(self):'''这里编写执行用例的前置条件'''pass

2.2、后置条件:tearDown()

  • 用于测试用例执行之后的善后工作。
  • 如:关闭数据库、关闭浏览器之内的。
# 使用方法:def tearDown(self):'''这里编写执行用例的善后工作'''pass

2.3、断言:assert*()

  • assert*():一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。
assertEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,相等则测试用例通过。assertNotEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,不相等则测试用例通过。assertTrue(x,[msg='测试失败时打印的信息']):断言x是否True,是True则测试用例通过。assertFalse(x,[msg='测试失败时打印的信息']):断言x是否False,是False则测试用例通过。assertIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,是则测试用例通过。assertNotIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,不是则测试用例通过。assertIsNone(x,[msg='测试失败时打印的信息']):断言x是否None,是None则测试用例通过。assertIsNotNone(x,[msg='测试失败时打印的信息']):断言x是否None,不是None则测试用例通过。assertIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,在b中则测试用例通过。assertNotIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,不在b中则测试用例通过。assertIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,是则测试用例通过。assertNotIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,不是则测试用例通过。

3、单元测试:unittest.main()

【1】作用:可以运行单个测试用例检查用例是否正确,单元测试。【2】执行条件:执行的时候会自动搜索模块中以“test”命名开头的测试方法。【3】执行默认顺序:
1、根据ASCII码的顺序加载测试用例。
2、数字与字母的顺序为:0-9,A-Z,a-z。
3、所以A开头的测试用例方法会优先执行,以a开头会后执行。【4】使用方法:import unittestclass Test(unittest.TestCase):def setUp(self):print('start')def test_01(self):print('test_01')def test_02(self):print('test_02')def tearDown(self):print('end')if __name__ == '__main__':unittest.main()# 执行顺序:setUp() -> test_01() -> tearDown() -> setUp() -> test_01() -> tearDown()#完整流程即 [前置 -> 用例 -> 后置]这样一个循环反复的顺序。

4、用例套件_1:unittest.TestSuite()

  • unittest框架的TestSuite()类是用来创建测试套件的。

addTest():

  • addTest()方法是将测试用例添加到测试套件中。
import unittestclass Test(unittest.TestCase):def test_01(self):print('test_01')if __name__ == '__main__':suite = unittest.TestSuite()suite.addTest(Test('test_01'))suite.addTest(Test('test_02'))runner = unittest.TextTestRunner()runner.run(suite)

5、用例套件_2:unittest.defaultTestLoader()

  • unittest框架的defaultTestLoader()类,通过该类下面的discover()方法可根据测试目录匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直接通过run()方法执行discover。用法如下:
···
····
·····if __name__ == '__main__':case_path =os.path.join(os.getcwd(),'case')discover = unittest.defaultTestLoader.discover(case_path, pattern='test_*.py')runner = unittest.TextTestRunner()runner.run(discover)#case_path是存放测试用例的地方

备注:discover方法里面有三个参数

-case_dir:这个是待执行用例的目录。

-pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。

-top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。

6、执行套件:unittest.TextTextRunner()

  • unittest框架的TextTextRunner()类,配合TestSuite()、defaultTestLoader()类一起使用,通过TextTextRunner类下面的run()方法来运行套件所组装的测试用例,入参为suite测试套件。
import unittestclass Test(unittest.TestCase):def setUp(self):print('start')def test_01(self):print('test_01')def test_02(self):print('test_02')def tearDown(self):print('end')if __name__ == '__main__':suite = unittest.TestSuite()suite.addTest(Test('test_01'))suite.addTest(Test('test_02'))runner = unittest.TextTestRunner()runner.run(suite)

7、装饰器:unittest.skip()

  • unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。
@unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试,并说明跳过测试的原因。@unittest.skipIf(reason): skipIf(condition,reason)装饰器:条件为真时,跳过装饰的测试,并说明跳过测试的原因。@unittest.skipUnless(reason): skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。@unittest.expectedFailure(): expectedFailure()测试标记为失败。

8、装饰器:@classmethod

  • 作用:在某些特定情况下,避免每次执行用例时候都会执行一次unittest里面setUp()。
  • 比如进行登陆、打开浏览器、连接数据库等操作的时候。
#使用方法:
import unittestclass Test(unittest.TestCase):@classmethoddef setUpClass(cls):    #注意这里传入的参数不是self,而是指定参数clsprint('start')@classmethoddef test_01(self):print('test_01')@classmethoddef test_02(self):print('test_02')@classmethoddef tearDownClass(cls):     #注意这里传入的参数不是self,而是指定参数clsprint('end')if __name__ == '__main__':unittest.main()#运行结果:
# start
# test_01
# test_02
# end

9、数据驱动:ddt

【1】作用:

  • 针对某些功能相同,但是输入的参数数据不同时,可以使用数据驱动设计的模式,一组数据对应一个测试用例,用例自动加载生成,有效的较少代码量。如:登录时。

【2】安装ddt模块

pip install ddt

【3】ddt模块使用方法

  1. 测试数据为存放多个字典的列表。
  2. 测试类的前面需要加上修饰器:@ddt.ddt
  3. 对应测试用例之前加上修饰器:@ddt.data()
import unittest
import ddt#   测试数据:每一条数据都是一个字典;全部数据存放在一个列表中。
testDate = [{'username': 'AAA', 'password': '11111'},{'username': 'BBB', 'password': '22222'},{'username': 'CCC', 'password': '33333'}]#测试类之前需要加上装饰器:@ddt.ddt
@ddt.ddt
class Test(unittest.TestCase):def setUp(self):print('start')#测试用例前面需要加上装饰器:@ddt.data()#装饰器的参数就是测试数据:@ddt.data(*testDate)@ddt.data(*testDate)def test_ddt(self, data):print(data)def tearDown(self):print('end')if __name__ == '__main__':unittest.main()//#输出结果:start
{'username': 'AAA', 'password': '11111'}
end
start
{'username': 'BBB', 'password': '22222'}
end
start
{'username': 'CCC', 'password': '33333'}
end

10、生成测试报告:HTMLTestRunner

【1】安装HTMLTestRunner

  • 1.HTMLTestRunner这个模块下载不能通过pip安装了,只能下载后手动导入,下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html

  • 2.Download下HTMLTestRunner.py文件就是我们需要下载的包。
  • 3.下载后手动拖到python安装文件的Lib目录下

【2】使用方法:

····
·····if __name__ == '__main__':#将测试用例加入到套件中suite = unittest.TestSuite()suite.addTest(Test('test_01'))suite.addTest(Test('test_02'))# 获取当前时间,这样便于下面的使用。now = time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time())) + '.html'# filePath:测试报告保存的路径filePath = os.path.join(os.getcwd(), 'report', now)fp = open(filePath, 'wb')# 测试报告的title、描述runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='自动化测试HTML文件标题',description='自动化测试HTML文件描述')runner.run(suite)# 最后记着关闭文件fp.close()

11、截图

在测试过程中,用的最多的就是截图功能,毕竟有图有真相嘛,截图不仅可以把缺陷原原本本的记录下来,也方便后面我们根据缺陷。

webdriver中提供的截图方法一:

  • get_screenshot_as_file(filename)
  • 这个方法是获取当前window的截图,出现IOError时候返回False,截图成功返回True。
  • filename参数是保存文件的路径。
import os
import time
import unittestfrom selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWaitclass Test(unittest.TestCase):def setUp(self):'''初始化浏览器、打开网址、并等待页面加载完'''self.driver = webdriver.Chrome()self.driver.get('https://www.baidu.com/')self.wait = WebDriverWait(self.driver, 10)self.wait.until(EC.presence_of_all_elements_located)def test_get_screenshot(self):'''获取当前时间,用于后面创建图片名'''now = '百度' + time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time())) + '.jpg'filePath = os.path.join(os.getcwd(), 'image', now)# get_screenshot_as_file()的参数就是图片保存路径self.driver.get_screenshot_as_file(filePath)def tearDown(self):self.driver.quit()if __name__ == '__main__':unittest.main()

方法二:

  • get_screenshot_as_base64()
  • 这个方法也是获取屏幕截图,保存的是base64的编码格式,在HTML界面输出截图的时候,会用到。

方法三:

  • get_screenshot_as_png()
  • 这个是获取屏幕截图,保存的是二进制数据。

转载于:https://www.cnblogs.com/jasontang369/p/9568979.html

unittest框架学习笔记相关推荐

  1. selenium + python自动化测试unittest框架学习(二)

    1.unittest单元测试框架文件结构 unittest是python单元测试框架之一,unittest测试框架的主要文件结构: File >report >all_case.py &g ...

  2. SpringMVC框架--学习笔记(下)

    接上篇:SpirngMVC框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81038382 17.全局异常处理: 系统中异常包 ...

  3. SpringMVC框架--学习笔记(上)

    1.SpringMVC入门程序: (1)导入jar包:spring核心jar包.spring-webmvc整合Jar包 (2)配置前端控制器:web.xml文件中 <?xml version=& ...

  4. mybatis框架--学习笔记(下)

    上篇:mybatis框架--学习笔记(上):https://blog.csdn.net/a745233700/article/details/81034021 8.高级映射: (1)一对一查询: ①使 ...

  5. mybatis框架--学习笔记(上)

    使用JDBC操作数据库的问题总结: (1)数据库连接,使用时创建,不使用时立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 设想:使用数据库连接池管理数据库连接. (2) ...

  6. JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...

  7. python表单提交的两种方式_Flask框架学习笔记之表单基础介绍与表单提交方式

    本文实例讲述了Flask框架学习笔记之表单基础介绍与表单提交方式.分享给大家供大家参考,具体如下: 表单介绍 表单是HTML页面中负责数据采集功能的部件.由表单标签,表单域和表单按钮组成.通过表单,将 ...

  8. php框架费尔康,GitHub - majixian/study-phalcon: phalcon(费尔康)框架学习笔记

    phalcon(费尔康)框架学习笔记 以实例程序invo为例(invo程序放在网站根目录下的invo文件夹里,推荐php版本>=5.4) 环境不支持伪静态网址时的配置 第一步: 在app\con ...

  9. selenium + python自动化测试unittest框架学习(一)selenium原理及应用

    unittest框架的学习得益于虫师的<selenium+python自动化实践>这一书,该书讲得很详细,大家可以去看下,我也只学到一点点用于工作中,闲暇时记录下自己所学才能更加印象深刻. ...

最新文章

  1. php变量 标签,html标签如何使用php中的变量
  2. 架构与思维:设计容量,到底有多重要 ?
  3. 7天搞定图神经网络,实战助力新冠疫情防控!
  4. 数字高程模型DEM和构建学习1
  5. poj 1958 Strange Towers of Hanoi
  6. Vue007_ 表单输入绑定
  7. mysql多表成绩查询_MySQL多表数据记录查询(一)
  8. 使用PHP创建一个REST API(Create a REST API with PHP)
  9. 【ES11(2020)】String 扩展 String.prototype.matchAll()
  10. 4-1MapReduce原理
  11. C++——cout输出流与字符指针
  12. TX2+GStreamer+OpenCV读取显示网络摄像头
  13. (转)深入理解Javascript闭包(closure)
  14. 怎么样生成bean对象java_使用BeanFactory实现创建对象
  15. 收藏!Java 500 道核心面试题全解析
  16. 微信小程序上传图片到阿里云存储
  17. oracle 丢失msvcr71,安装oracle10G 即时客户端 instant client时msvcr71.dll缺失问题解决
  18. 一些个人感觉很不错的特效
  19. vue音乐播放器笔记
  20. 【译】Linux不同的IO访问方式中,Scylla的选择和依据

热门文章

  1. 14.并发与异步 - 2.任务Task -《果壳中的c#》
  2. Android ListView 的优化
  3. C#操作数据库,DataSet,DataGridView,更新数据库 [一] - ADO.NET入门之中
  4. python商务图表_Excel职场商务图表高效制作
  5. java计算时间差_JAVA并发编程三大Bug源头(可见性、原子性、有序性),彻底弄懂...
  6. tortoise清理本地分支_TortoiseGit操作本地仓库的详细使用方法
  7. 外部工具连接SaaS模式云数仓MaxCompute 实战—— 数据库管理工具篇
  8. 函数计算帮助石墨文档突破性能瓶颈,有效节省服务器成本
  9. 云话题 | 5G消息是什么?
  10. DTCC 2020 | 阿里云梁高中:DAS基于Workload的全局自动优化实践