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实现网页链接提取的方法分享
Feb 25 Python
Python读取ini文件、操作mysql、发送邮件实例
Jan 01 Python
Python 序列的方法总结
Oct 18 Python
基于python(urlparse)模板的使用方法总结
Oct 13 Python
Flask框架单例模式实现方法详解
Jul 31 Python
python安装本地whl的实例步骤
Oct 12 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
Nov 08 Python
Django restframework 框架认证、权限、限流用法示例
Dec 21 Python
如何基于Python + requests实现发送HTTP请求
Jan 13 Python
Python如何输出百分比
Jul 31 Python
python爬虫scrapy图书分类实例讲解
Nov 23 Python
Python3中对json格式数据的分析处理
Jan 28 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扩展图文教程
2008/12/12 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
PHP 实现判断用户是否手机访问
2015/01/21 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
jQuery Validate验证框架经典大全
2015/09/23 Javascript
javascript与jquery中的this关键字用法实例分析
2015/12/24 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
Webpack之tree-starking 解析
2018/09/11 Javascript
layer弹出层自适应高度,垂直水平居中的实现
2019/09/16 Javascript
Element Dropdown下拉菜单的使用方法
2020/07/26 Javascript
JavaScript实现世界各地时间显示
2020/09/07 Javascript
在Python中的Django框架中进行字符串翻译
2015/07/27 Python
Python中运算符"=="和"is"的详解
2016/10/08 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
Python3如何使用tabulate打印数据
2020/09/25 Python
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
高中毕业自我鉴定
2013/12/22 职场文书
即兴演讲稿
2014/01/04 职场文书
毕业晚会主持词
2014/03/24 职场文书
新闻工作者先进事迹
2014/05/26 职场文书
精神文明建设标语
2014/06/16 职场文书
毕业生工作求职信
2014/06/30 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
党支部对照检查材料
2014/08/25 职场文书
医学检验专业自荐信
2014/09/18 职场文书
寻衅滋事罪辩护词
2015/05/21 职场文书
想要创业,那么你做好准备了吗?
2019/07/01 职场文书
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers