Python单元测试框架之unittest+requests+ddt+excel接口自动化测试

unitetest是python里单元测试框架,是基于 java 的 junit 测试框架 相当于是一个 python 版的 junit,除了 unittest,还有一个 pytest 框架

unittest.TestCase:TestCase类,所有测试用例类继承的基本类

一个TestCase的实例就是一个测试用例。一个测试用例要包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个功能进行验证

 

unittest.main():使用她可以方便的将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行

 


一、setUp()和tearDown()函数

    setUp()函数是在众多函数或说是在一个类里最先被调用的函数,每执行完一个函数都要从setUp()调用开始后再执行下一个函数,有几个函数几次,与位置无关,随便放在那里都是他先被调用。

     tearDown()函数是在众多函数执行完后他才被执行,不管这个类里面有多少函数,他总是最后一个被执行,与位置无关,放在那里都行,最后不管测试函数是否执行成功都执行tearDown()方法;如果setUp()方法失败,则认为这个测试项目失败,不会执行测试函数也不执行tearDown()方法。

1、setUp()和tearDown()方法都是非必要条件,如果没有也可以写pass

2、setUp()和tearDown()方法每个测试用例都会执行,先执行前置setUp,然后执行的用例(test*),最后执行的后置tearDown

3、setUp():setUp()方法用于测试用例执行前初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器

4、tearDown():tearDown()方法用于测试用例执行之后的善后工作。如关闭数据库连接、关闭浏览器

5、未加装饰器,先执行前置setUp,再执行test开头的test01,最后执行后置tearDown,继续循环所有用例;加了装饰器@classmethod,先执行setUp,再执行test开头的所有用例,最后执行tearDown

#未加装饰器,先执行前置setUp,再执行test开头的测试用例,最后执行后置tearDown,继续循环所有用例import unittest
class Test(unittest.TestCase):	#继承unittest.TestCase这个类def setUp(self):			#测试用例执行前运行print('setUp__')def tearDown(self):			#测试用例结束后运行print('tearDown')def testMinus(self):	    #测试用例名称以test开头'''这里是减法'''print('这里是减法')					result=6-5					hope=1					self.assertEqual(result,hope)					def testDivide(self):						'''这里是除法'''print('这里是除法')result=7/2hope=3.5self.assertEqual(result,hope)
if __name__ == '__main__':unittest.main()C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
setUp__
这里是除法
tearDown
setUp__
这里是减法
tearDown
..
----------------------------------------------------------------------
Ran 2 tests in 0.000sOKProcess finished with exit code 0
#加了装饰器@classmethod,先执行setUp,再执行test开头的所有用例,最后执行tearDownimport unittest				
class Test(unittest.TestCase):				@classmethod			def setUpClass(cls):			print('setUp__')		@classmethod			def tearDownClass(cls):			print('tearDown')		def test_003(self):			''这里是test_003'''		print('这里是减法')		result=6-5		hope=1		self.assertEqual(result,hope)		def test_004(self):			''这里是test_004'''		print('这里是除法')		result=7/2		hope=3.5		self.assertEqual(result,hope)		
if __name__ == '__main__':				unittest.main()			C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
setUp__
..
这里是减法
这里是除法
tearDown
----------------------------------------------------------------------
Ran 2 tests in 0.001sOKProcess finished with exit code 0

 

二、unittest.defaultTestLoader(): defaultTestLoader()类

通过该类下discover()方法将测试目录匹配查找测试用例文件(test*.py),将查找的测试用例组装到测试套件TestSuite,再返回一个TestSuite实例,因此可以直接通过run()方法执行discover

discover方法来加载用例,discover加载到的用例是一个list集合,需要重新写入到一个list对象testcase里,用TextTestRunner这里类的run方法去执行,discover方法里面有三个参数:

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

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

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

# 测试用例路径(当前文件目录)
case_path = os.path.dirname(os.path.realpath(__file__))
#加载test.py文件,TestCase到TestSuite集合中,返回一个TestSuite实例
discover = unittest.defaultTestLoader.discover(case_path, pattern="test.py", top_level_dir=None)
print(discover)
<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test.Test testMethod=test01>, <test.Test testMethod=test02>]>]>]>
class Test(unittest.TestCase):def setUp(self):print('数据准备阶段')def tearDown(self):print('数据清理结束')def test01(self):print('输出test01')def test02(self):print('输出test02')
if __name__=='__main__':# 测试用例路径case_path = os.path.dirname(os.path.realpath(__file__))#加载test.py文件,TestCase到TestSuite集合中,返回一个TestSuite实例discover = unittest.defaultTestLoader.discover(case_path, pattern="test.py", top_level_dir=None)print(discover)#实例化runnerrunner=unittest.TextTestRunner()#调用实例run方法runner.run(discover)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
..
<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test.Test testMethod=test01>, <test.Test testMethod=test02>]>]>]>
----------------------------------------------------------------------
数据准备阶段
Ran 2 tests in 0.001s
输出test01数据清理结束
OK
数据准备阶段
输出test02
数据清理结束Process finished with exit code 0
 

三、unittest.TestSuite():unittest框架的TestSuite()类

用来创建测试套件,多个测试用例test case集合就是TestSuite,TestSuite可以嵌套TestSuite

对于某一个功能模块的验证可能需要多个测试用例,多个测试用例集合在一起执行验证某一个功能,这样就是一个TestSuite。通过addTest()方法将 TestCase 加载到 TestSuite()中,最终将传递给testRunner进行测试执行

 

四、unittest.TextTestRunner():unittest框架的TextTestRunner()类

通过该类下面的run()方法来运行suite所组装的测试用例,入参为suite测试套件

runner=unittest.TextTestRunner()

runner.run(all_case())

class Test(unittest.TestCase):def setUp(self):print('数据准备阶段')def tearDown(self):print('数据清理结束')def test01(self):print('输出test01')def test02(self):print('输出test02')
if __name__=='__main__':# 测试用例路径case_path = os.path.dirname(os.path.realpath(__file__))#加载test.py文件,TestCase到TestSuite集合中,返回一个TestSuite实例discover = unittest.defaultTestLoader.discover(case_path, pattern="test.py", top_level_dir=None)print(discover)#实例化runnerrunner=unittest.TextTestRunner()#调用实例run方法runner.run(discover)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
..
<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test.Test testMethod=test01>, <test.Test testMethod=test02>]>]>]>
----------------------------------------------------------------------
数据准备阶段
Ran 2 tests in 0.001s
输出test01数据清理结束
OK
数据准备阶段
输出test02
数据清理结束Process finished with exit code 0

 

五、生成html报告,report_path是存放测试报告的地址

stream:测试报告写入文件的存储区域

title:测试报告的主题

description:测试报告的描述

 

#实例化runner
runner=unittest.TextTestRunner()#测试报告存放地址
report_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"result.html")
#打开
fp = open(report_path, "wb")
#写入
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title="自动化测试报告",description="用例执行情况:")
#调用实例run方法
runner.run(discover)
#关闭
fp.close()
import unittest,os
import HTMLTestRunner
class Test(unittest.TestCase):def setUp(self):print('setup数据准备阶段——————')def tearDown(self):print('teardown数据清理收尾阶段————')def test01(self):print('执行test01测试用例')def test02(self):print('执行test02测试用例')
if __name__=='__main__':#测试用例路径case_path = os.path.dirname(os.path.realpath(__file__))#加载test.py文件,TestCase到TestSuite集合中,返回一个TestSuite实例discover = unittest.defaultTestLoader.discover(case_path, pattern="test.py", top_level_dir=None)print(discover)#实例化runnerrunner=unittest.TextTestRunner()#测试报告存放地址report_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"result.html")#打开fp = open(report_path, "wb")#写入runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title="自动化测试报告",description="用例执行情况:")#调用实例run方法runner.run(discover)#关闭fp.close()C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
..
setup数据准备阶段——————
执行test01测试用例
----------------------------------------------------------------------
teardown数据清理收尾阶段————
Ran 2 tests in 0.002s
setup数据准备阶段——————执行test02测试用例
OK
teardown数据清理收尾阶段————Process finished with exit code 0C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
..<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test.Test testMethod=test01>, <test.Test testMethod=test02>]>]>]>
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'> 
Time Elapsed: 0:00:00.001000Process finished with exit code 0

参考代码# coding:utf-8
import unittest
import os
import HTMLTestRunner# python2.7要是报编码问题,就加这三行,python3不用加import sys
reload(sys)
sys.setdefaultencoding('utf8')# 用例路径
case_path = os.path.join(os.getcwd(), "case")
# 报告存放路径
report_path = os.path.join(os.getcwd(), "report")
def all_case():discover = unittest.defaultTestLoader.discover(case_path,pattern="test*.py",top_level_dir=None)print(discover)return discoverif __name__ == "__main__":# runner = unittest.TextTestRunner()# runner.run(all_case())# html报告文件路径report_abspath = os.path.join(report_path, "result.html")fp = open(report_abspath, "wb")runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'自动化测试报告,测试结果如下:',description=u'用例执行情况:')# 调用add_case函数返回值runner.run(all_case())fp.close()

 

六、unittest.skip():装饰器

当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽

@unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试,并说明跳过测试的原因

@unittest.skipIf(reason): skipIf(condition,reason)装饰器:条件为真时,跳过装饰的测试,并说明跳过测试的原因

@unittest.skipUnless(reason): skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。

@unittest.expectedFailure(): expectedFailure()测试标记为失败

 

 

七、断言

assertEqual(self, first, second, msg="失败原因") 

unittest 常用的断言方法 
1.assertEqual(self, first, second, msg=None) 
--判断两个参数相等:first == second 
2.assertNotEqual(self, first, second, msg=None) 
--判断两个参数不相等:first != second 
3.assertIn(self, member, container, msg=None) 
--判断是字符串是否包含:member in container 
4.assertNotIn(self, member, container, msg=None) 
--判断是字符串是否不包含:member not in container 
5.assertTrue(self, expr, msg=None) 
--判断是否为真:expr is True 
6.assertFalse(self, expr, msg=None) 

--判断是否为假:expr is False 
7.assertIsNone(self, obj, msg=None) 
--判断是否为 None:obj is None 
8.assertIsNotNone(self, obj, msg=None) --判断是否不为 None:obj is not None 

 

 

 

八、数据驱动DDT

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【业务篇】史上最全经验版用例之IOS和Android版APP版本更新、IOS版规避审核?

一、IOS app设置苹果审核 为了app提交苹果能快速审核通过&#xff0c;故需设置app审核状态&#xff0c;隐藏部分敏感功能 1、线上app版本1.0.0&#xff0c;新版本app2.0.0测试通过&#xff0c;设置2.0.0版本app审核状态&#xff0c;隐藏2.0.0版本部分敏感功能&#xff0c;提交…

Python之Pymysql模块操作MySQL增删改查

Python3 MySQL 数据库连接 - PyMySQL 驱动 PyMySQL 连接数据库&#xff0c;实现增删改查 什么是 PyMySQL&#xff1f; PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库&#xff0c;Python2中则使用mysqldb。 PyMySQL 遵循 Python 数据库 API v2.0 规范&#x…

Python之日志处理(logging模块)详解

logging模块简介 logging模块是Python内置的标准模块&#xff0c;主要用于输出运行日志&#xff0c;可以设置输出日志的等级、日志保存路径、日志文件回滚等&#xff1b;相比print&#xff0c;具备如下优点 1、可以通过设置不同的日志等级&#xff0c;在release版本中只输出重…

神秘的安全测试思考案例(一)

定义&#xff1a;安全测试是在软件产品开发基本完成时&#xff0c;验证产品是否符合安全需求定义和产品质量标准的过程。 概念&#xff1a;安全测试是检查系统对非法侵入渗透的防范能力。 准则&#xff1a;理论上来讲&#xff0c;只要有足够的时间和资源&#xff0c;没有无法进…

STL Map学习总结

1、 Map是关联容器&#xff0c;以键值对的形式进行存储&#xff0c;方便进行查找&#xff0c;关键词起到索引的作用&#xff0c;值则表示与索引相关联的数据&#xff0c;以红黑树的结构实现&#xff0c;插入删除等操作都可以在O(log n)时间内完成 2、它的特点是增加和删除节点…

【功能业务篇】APP获取用户定位、传参经纬度思考

常用的三种定位方式有&#xff1a;基于GPS定位、基于基站地位、基于wifi定位。 1、基于GPS定位&#xff1a; GPS定位需要GPS模块(硬件)的支持,没有GPS模块是无法进行GPS定位的。 GPS定位最大的优点就是其定位精确度高(一般误差在10m内),无网络也能用;缺点就是耗电高、定位慢、室…

cmd运行python程序

先cd到当前目录&#xff0c;然后python XXX.py

mysql 四种存储引擎

前言 数据库存储引擎是数据库底层软件组织&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能&#xff0c;使用不同的存储引擎&#xff0c;还可以 获得特定的功…

Android ADB调试之无线连接设备

Android无线调试 一、数据线连接手机和电脑&#xff08;首次设置需数据线连接&#xff09;&#xff0c;开启开发者模式和USB调试&#xff0c;确保手机和电脑已连接 cmd下执行adb devices 显示上图1&#xff0c;说明已连接 二、华为手机设置 1、开发人员选项 2、USB调试 3、…

【Python实战】使用python计算多种类型到期还款日

一般金融产品的账务测试时&#xff0c;我们会接触到还款方式&#xff0c;到期还款日等概念。 在自动化测试或者脚本使用中&#xff0c;我们需要动态的生成到期还款日去进行账务测试&#xff0c;这篇文章主要介绍了常见的几种到期还款日计算方式。 一、固定期限&#xff08;比如…

Fiddler抓包工具之Filters(过滤器)进行会话过滤

一、设置User Fiters启用 未勾选Use Filters&#xff0c;未启用此功能&#xff1b;已勾选Use Filters&#xff0c;已启用此功能 二、Action设置 Run Filterset now :马上执行过滤&#xff0c;立即生效过滤 Load Filterset&#xff1a; 加载本地过滤文件到fiddler Save Filt…

【pyQT5】Python3+pyQT5开发环境安装与配置

在PyQt中编写UI界面可以直接通过代码来实现&#xff0c;也可以通过Qt Designer来完成。Qt Designer的设计符合MVC的架构&#xff0c;其实现了视图和逻辑的分离&#xff0c;从而实现了开发的便捷。 Qt Designer中的操作方式十分灵活&#xff0c;其通过拖拽的方式放置控件可以随时…

【TensorFlow】TensorFlow是什么?

TensorFlow 是一个开源的、基于 Python 的机器学习框架&#xff0c;它由 Google 开发&#xff0c;并在图形分类、音频处理、推荐系统和自然语言处理等场景下有着丰富的应用&#xff0c;是目前最热门的机器学习框架。 除了Python&#xff0c;TensorFlow 也提供了 C/C、Java、Go、…

【TensorFlow】Win7+Anaconda+python3.6+Tensorflow1.9安装教程

相关链接 官网&#xff1a;https://tensorflow.google.cn/ github&#xff1a;https://github.com/tensorflow/tensorflow 中文社区网&#xff1a;http://www.tensorfly.cn/ 安装说明 平台&#xff1a;windows 7 Anaconda版本&#xff1a;4.6.14 python版本&#xff1a;3.6.…

【Jmeter篇】如何利用Jmeter配置元件计数器、随机变量制造批量数据和变量参数化?

一、计数器 1、线程组-配置元件-计数器 2、功能介绍 starting value&#xff1a;给定计数器的起始值、初始值&#xff0c;第一次迭代时&#xff0c;会把该值赋给计数器 递增(Increment)&#xff1a; 每次迭代后&#xff0c;给计数器增加的值 最大值(Maximum) &#xff1a;…

软件工程经济学习题 答案(不保证对错,找不到答案)

一、资金等值计算 1.某IT企业今年向银行贷款20万元以购置一台设备。若银行贷款利率为10%&#xff0c;规定10年内等额偿还&#xff0c;试求每年的偿还金额。 2.某软件企业向银行贷款200万元&#xff0c;按年利率为8%进行复利计息&#xff0c;试求该企业第5年末连本带利一次偿还银…

Django+Jquery+Ajax+验证码登录案例

1&#xff0c;创建项目test04 2&#xff0c;创建应用app为booktest 3&#xff0c;注册应用booktest 作用让创建的应用运行起来 4&#xff0c;在项目根目录下创建模板templates目录 作用就是存放html文件在项目的settings.py文件中配置模板&#xff0c;如下图&#xff1a;5&…

【数据库】Mysql日期/时间函数实际案例

有一款金融产品&#xff0c;总共24期&#xff0c;每月2日到期还款日&#xff0c;第一个到期还款日为放款日下个月的2日&#xff0c;现在我们知道所有订单的放款时间&#xff0c;现在我们想统计每个订单当前时间是第几期。 举个简单例子&#xff1a;当期日期为2019-11-12&#…

【Jmeter篇】1小时轻松搞定项目接口自动化测试与数据驱动

之前我们的用例数据都是配置在 Jmeter Http 请求中&#xff0c;每次需要增加&#xff0c;修改用例都需要打开 jmeter 重新编辑&#xff0c;当用例越来越多的时候&#xff0c;用例维护起来就越来越麻烦&#xff0c;有没有好的方法来解决这种情况呢&#xff1f; 其实我们可以将用…

module 'queue' has no attribute 'Queue'解决

import queue q queue.Queue() q.put(a) q.put(b) print(q.get())错误&#xff1a; AttributeError: module queue has no attribute Queue 解决方法&#xff1a; 把程序名命名和包名一样导致错误。命名为queue1.py就ok了