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实现的一只从百度开始不断搜索的小爬虫
Aug 13 Python
详解Python中的文件操作
Aug 28 Python
最近Python有点火? 给你7个学习它的理由!
Jun 26 Python
Python用Pillow(PIL)进行简单的图像操作方法
Jul 07 Python
详解pyqt5 动画在QThread线程中无法运行问题
May 05 Python
Django 限制用户访问频率的中间件的实现
Aug 23 Python
python TKinter获取文本框内容的方法
Oct 11 Python
Python 实现Windows开机运行某软件的方法
Oct 14 Python
python求加权平均值的实例(附纯python写法)
Aug 22 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
Pytorch使用shuffle打乱数据的操作
May 20 Python
Python上下文管理器Content Manager
Jun 26 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
全国FM电台频率大全 - 4 山西省
2020/03/11 无线电
php adodb连接mssql解决乱码问题
2009/06/12 PHP
php设计模式 Template (模板模式)
2011/06/26 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
JavaScript使用Max函数返回两个数字中较大数的方法
2015/04/06 Javascript
jquery实现手机号码选号的方法
2015/07/31 Javascript
深入浅析JavaScript中对事件的三种监听方式
2015/09/29 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
js实现浏览器倒计时跳转页面效果
2016/08/12 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
Bootstrap 手风琴菜单的实现代码
2017/01/20 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
2017/02/22 Javascript
探讨Vue.js的组件和模板
2017/10/27 Javascript
Vue父组件调用子组件事件方法
2018/02/23 Javascript
为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题
2018/04/03 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
详解vue或uni-app的跨域问题解决方案
2020/02/21 Javascript
Python yield 小结和实例
2014/04/25 Python
Python类的定义、继承及类对象使用方法简明教程
2015/05/08 Python
Python编码类型转换方法详解
2016/07/01 Python
详解Python中的文件操作
2016/08/28 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
加拿大领先的牛仔零售商:Bluenotes
2018/01/22 全球购物
新西兰购物网站:TheMarket NZ
2020/09/19 全球购物
学生操行评语大全
2014/04/24 职场文书
报案材料怎么写
2015/05/25 职场文书
北京大学中文系教授推荐的10本小说
2019/08/08 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang