Python Unittest原理及基本使用方法


Posted in Python onNovember 06, 2020

基本使用步骤:

1、import unittest

2、新建一个Class继承unittest.TestCase

3、定义一个以test开头的函数作为测试用例【必须以test开头】

4、执行测试用例前都会先调用Setup函数【每个测试用例调用一次】或者setupClass函数【所有测试用例仅调用一次】

5、执行完测试用例后都会调用tearDown函数【多次】和tearDownClass函数【仅一次】

PS:

1、不能重写init()

2、函数必须以test开头才能作为测试用例

3、setupClass()和tearDownClass()必须用@classmethod修饰

# -*- encoding=utf-8 -*-

import unittest
class Demo1(unittest.TestCase):
  def setUp(self):
    print '调用 setup 函数'

  @classmethod
  def setUpClass(cls):
    print '调用 setupClass 函数'

  def tearDown(self):
    print '调用 tearDown 函数'
  @classmethod
  def tearDownClass(cls):
    print '调用 tearDownClass 函数'

  @staticmethod
  def test_add():
    print '3 + 5 = {}'.format(3 + 5)

  @staticmethod
  def test_sub():
    print '3 - 5 = {}'.format(3 - 5)


if __name__ == '__main__':
  unittest.main()

运行结果

调用 setupClass 函数

调用 setup 函数

3 + 5 = 8

调用 tearDown 函数

调用 setup 函数

3 - 5 = -2

调用 tearDown 函数

调用 tearDownClass 函数

Ran 2 tests in 0.012s

OK

TestSuite【测试组】添加测试用例进行测试

# -*- encoding=utf-8 -*-


class Class1(object):
  def __init__(self):
    print '调用 Class1 初始化函数'
    self.name = '未定义姓名'
    self.age = '未定义年龄'

  def set_name(self, name):
    self.name = name

  def set_age(self, age):
    self.age = age

  def print_name(self):
    print 'Class1 的姓名是:{}'.format(self.name)

  def print_age(self):
    print 'Class1 的年龄是:{}'.format(self.age)


if __name__ == '__main__':
  pass

 

# -*- encoding=utf-8 -*-

import unittest

from Class1 import Class1


class CallClass1(unittest.TestCase):

  def setUp(self):
    self.class1 = Class1()
    pass

  def tearDown(self):
    self.class1 = None
    pass

  def test_set_name(self):
    self.class1.set_name('设置了名字')
    self.class1.print_name()

  def test_print_name(self):
    self.class1.print_name()


if __name__ == '__main__':
  unittest.main()

 

# -*- encoding=utf-8 -*-

import unittest
from Test_Demo2 import CallClass1

if __name__ == '__main__':
  testSuite = unittest.TestSuite()
  testSuite.addTest(CallClass1('test_set_name'))

  testSuite.addTests(
    [CallClass1('test_set_name'), CallClass1('test_print_name')])

  textTestRunner = unittest.TextTestRunner()
  textTestRunner.run(testSuite)

运行结果

调用 Class1 初始化函数

Class1 的姓名是:设置了名字

调用 Class1 初始化函数

Class1 的姓名是:设置了名字

调用 Class1 初始化函数

Class1 的姓名是:未定义姓名

...

----------------------------------------------------------------------

Ran 3 tests in 0.000s

OK

Process finished with exit code 0

记录测试报告到txt文件

# -*- encoding=utf-8 -*-

import unittest
from Test_Demo2 import CallClass1

if __name__ == '__main__':
  testSuite = unittest.TestSuite()
  testSuite.addTest(CallClass1('test_set_name'))

  testSuite.addTests(
    [CallClass1('test_set_name'), CallClass1('test_print_name')])

  # textTestRunner = unittest.TextTestRunner()
  # textTestRunner.run(testSuite)

  # 将测试结果输出到测试报告中
  with open('UnittestTextReport.txt', 'w') as f:
    runner = unittest.TextTestRunner(stream=f, verbosity=2)
    runner.run(testSuite)

记录测试报告到html文件

# 将测试结果输出到测试报告html中
with open('HTMLReport.html', 'w') as f:
  runner = HTMLTestRunner(stream=f,
              title='MathFunc Test Report',
              description='generated by HTMLTestRunner.',
              verbosity=2
              )
  runner.run(suite)

断言

当断言为真时,会执行断言之后的代码如(在断言之后打印成功提示信息)

若断言为假,则之后的代码不会被执行,打应错误信息,之后提示信息不会被执行;unittest中提示F,失败,若捕获到异常,则为E,代表错误;

补充:若断言为假,则当前函数def,停止运行,但会运行之后的def函数

重点:try语句块中不要使用assert一起使用,assert断言为假时,会抛出异常,测试用例为失败,如果放到try中,则会捕获到异常,测试用例永远标记为通过

断言结果:

. 表示通过 或者 pass

F False, 表示断言没有通过

E Error, 表示程序内部发生了错误。

查找当前目录下所有的测试用例【默认以test开头的py文件,可以自己配置】

# -*- encoding=utf-8 -*-

import unittest
import os

if __name__ == '__main__':
  loader = unittest.defaultTestLoader.discover(os.getcwd())
  # tests = unittest.defaultTestLoader.discover(
  #   start_dir='.', # => 指定查找的目录
  #   pattern='test*.py' # => 指定查找规则
  # )
  runner = unittest.TextTestRunner()
  runner.run(loader)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
部署Python的框架下的web app的详细教程
Apr 30 Python
利用Python中的pandas库对cdn日志进行分析详解
Mar 07 Python
Python爬取网页中的图片(搜狗图片)详解
Mar 23 Python
Request的中断和ErrorHandler实例解析
Feb 12 Python
python实现自动登录后台管理系统
Oct 18 Python
基于Python的图像数据增强Data Augmentation解析
Aug 13 Python
PyTorch的自适应池化Adaptive Pooling实例
Jan 03 Python
python实现在内存中读写str和二进制数据代码
Apr 24 Python
Python使用20行代码实现微信聊天机器人
Jun 05 Python
Python中flatten( ),matrix.A用法说明
Jul 05 Python
Python猫眼电影最近上映的电影票房信息
Sep 18 Python
python tkinter实现连连看游戏
Nov 16 Python
python中的yield from语法快速学习
Nov 06 #Python
Python通过字典映射函数实现switch
Nov 06 #Python
Python使用grequests并发发送请求的示例
Nov 05 #Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 #Python
Python中常用的os操作汇总
Nov 05 #Python
Python Web项目Cherrypy使用方法镜像
Nov 05 #Python
Python实现异步IO的示例
Nov 05 #Python
You might like
用PHP实现多级树型菜单
2006/10/09 PHP
php下通过伪造http头破解防盗链的代码
2010/07/03 PHP
深入PHP FTP类的详解
2013/06/13 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
PHP中SESSION过期设置
2021/03/09 PHP
对于Form表单reset方法的新认识
2014/03/05 Javascript
jQuery中click事件用法实例
2014/12/26 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
javascript实现添加附件功能的方法
2015/11/18 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
nodejs入门教程四:URL相关模块用法分析
2017/04/24 NodeJs
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
微信小程序实现全局搜索代码高亮的示例
2018/03/30 Javascript
js中的 || 与 && 运算符详解
2018/05/24 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
python抓取豆瓣图片并自动保存示例学习
2014/01/10 Python
Python正规则表达式学习指南
2016/08/02 Python
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
Weblogic的布署方式
2013/08/23 面试题
自动化专业本科毕业生求职信
2013/10/20 职场文书
自考自我鉴定范文
2013/10/30 职场文书
表扬信格式
2014/01/12 职场文书
品质主管岗位职责
2014/03/16 职场文书
心得体会的写法
2014/09/05 职场文书
毕业证委托书范文
2014/09/26 职场文书
2014年初级职称工作总结
2014/12/08 职场文书
业务员岗位职责范本
2015/04/03 职场文书
毕业论文致谢范文
2015/05/14 职场文书
刑事辩护词范文
2015/05/21 职场文书
 Redis 串行生成顺序编码的方法实现
2022/04/03 Redis
MySQL如何使备份得数据保持一致
2022/05/02 MySQL
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript