前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python篇】unittest单元测试框架介绍及使用(一)

【Python篇】unittest单元测试框架介绍及使用(一)

作者头像
王大力测试进阶之路
发布2019-10-25 17:56:28
1.3K0
发布2019-10-25 17:56:28
举报
文章被收录于专栏:橙子探索测试橙子探索测试

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

代码语言:javascript
复制
#未加装饰器,先执行前置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/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
setUp__
这里是减法
tearDown
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
 
OK
 
Process finished with exit code 0
代码语言:javascript
复制
#加了装饰器@classmethod,先执行setUp,再执行test开头的所有用例,最后执行tearDown
 
import 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.001s
 
OK
 
Process 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就行了

代码语言:javascript
复制
# 测试用例路径(当前文件目录)
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>]>]>]>
代码语言:javascript
复制
 
 
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)
    #实例化runner
    runner=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())

代码语言:javascript
复制
 
 
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)
    #实例化runner
    runner=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:测试报告的描述

代码语言:javascript
复制
#实例化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()
代码语言:javascript
复制
 
 
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)
 
    #实例化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()
 
 
 
 
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 0
 
 
 
 
 
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>]>]>]>
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'> 
Time Elapsed: 0:00:00.001000
 
Process finished with exit code 0
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 橙子探索测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档