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实现问号表达式(?)的方法
Nov 27 Python
python模块之re正则表达式详解
Feb 03 Python
Django实现分页功能
Jul 02 Python
使用python验证代理ip是否可用的实现方法
Jul 25 Python
python使用knn实现特征向量分类
Dec 26 Python
对python中的try、except、finally 执行顺序详解
Feb 18 Python
选择Python写网络爬虫的优势和理由
Jul 07 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
Dec 18 Python
python中sklearn的pipeline模块实例详解
May 21 Python
Python如何将模块打包并发布
Aug 30 Python
Python中的datetime包与time包包和模块详情
Feb 28 Python
Python OpenCV之常用滤波器使用详解
Apr 07 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编程效率的53个要点(经验小结)
2010/09/04 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
取选中的radio的值
2010/01/11 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
js禁止document element对象选中文本实现代码
2013/03/21 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
2015/10/29 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解
2016/04/11 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
详解React开发必不可少的eslint配置
2018/02/05 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
2018/08/12 Javascript
vue过滤器用法实例分析
2019/03/15 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
vue-cli3.0实现一个多页面应用的历奇经历记录总结
2020/03/16 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
简单谈谈python的反射机制
2016/06/28 Python
python多线程同步之文件读写控制
2021/02/25 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
HTML5 canvas画矩形时出现边框样式不一致的解决方法
2013/10/14 HTML / CSS
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
C#的几个面试问题
2016/05/22 面试题
党员教师个人对照检查材料范文
2014/09/25 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
大客户经理岗位职责
2015/04/09 职场文书
班主任开场白
2015/06/01 职场文书
读书笔记格式
2015/07/02 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
高一作文之暖冬
2019/11/09 职场文书
Python的property属性详细讲解
2022/04/11 Python