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选课系统开发程序
Sep 02 Python
Python生成密码库功能示例
May 23 Python
Python 网页解析HTMLParse的实例详解
Aug 10 Python
Numpy数据类型转换astype,dtype的方法
Jun 09 Python
面向初学者的Python编辑器Mu
Oct 08 Python
python机器人运动范围问题的解答
Apr 29 Python
pycharm重命名文件的方法步骤
Jul 29 Python
python3常用的数据清洗方法(小结)
Oct 31 Python
如何分离django中的媒体、静态文件和网页
Nov 12 Python
python标识符命名规范原理解析
Jan 10 Python
如何在django中实现分页功能
Apr 22 Python
Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
Jun 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小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
PHP 批量更新网页内容实现代码
2010/01/05 PHP
PHP 图片文件上传实现代码
2010/12/29 PHP
php实现过滤表单提交中html标签的方法
2014/10/17 PHP
php查询whois信息的方法
2015/06/08 PHP
PDO::quote讲解
2019/01/29 PHP
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
文本框的字数限制功能jquery插件
2009/11/24 Javascript
jquery异步循环获取功能实现代码
2010/09/19 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
JS实现table表格内针对某列内容进行即时搜索筛选功能
2018/05/11 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
前端面试知识点目录一览
2019/04/15 Javascript
微信小程序实现侧边栏分类
2019/10/21 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
跟老齐学Python之通过Python连接数据库
2014/10/28 Python
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
Python中turtle库的使用实例
2019/09/09 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
远程培训的心得体会
2014/09/01 职场文书
法人委托书的范本格式
2014/09/11 职场文书
管理失职检讨书范文
2015/05/05 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
培训后的感想
2015/08/07 职场文书
Python实现的扫码工具居然这么好用!
2021/06/07 Python
JavaScript的function函数详细介绍
2021/11/20 Javascript
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android