unittest官方文档摘录 翻译 reffer to: https://docs.python.org/3/library/unittest.html#unittest.TextTestRunner

第一部分-使用

1、基本概念

1.1)unittest单元测试框架最初的灵感来自于JUnit,其特点有

  • 支持测试自动化
  • 为测试共享setup和shutdown代码
  • 可以把单个测试集合成测试用例集
  • 将测试报告框架和测试用例独立开来

1.2)unittest支持的面向对象的重要理念

  • test fixture

    测试固件:表示一个或多个测试用例需要的准备,以及关联的清理操作,例如:创建临时DB、目录或启动一个进程

  • test case

    测试用例: 一个独立的测试单元,它校验一组输入得到的一个指定的响应,unittest提供一个基类TestCase,用来创建新的测试用例

  • test suite

    测试套件: 一个测试用例的集合,用来集合应该被一起执行的测试用例

  • test runner

    测试执行组件: 安排测试的执行并给用户提供结果

2、简单实例

unittest库提供了一系列丰富的工具来构建和执行测试,下面讲一下可以满足大部分用户需求的一个小的工具子集

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO') def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper()) def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2) if __name__ == '__main__':
unittest.main()
  • 测试用例继承TestCase类,单个测试方法需要已test开头,这样便于告诉test runner哪些方法代表测试用例
  • 每一个测试均用到了断言行数assert*(),以便于test runner计算测试结果及生成测试报告
  • setUp()和tearDown()方法用于定义一些测试前后的操作
  • unittest.main()为测试脚本提供了一个命令行接口来运行测试

3、命令行执行测试的方式

# 您可以像这样执行一个测试模块:
python -m unittest test_module1 test_module2
# 也可以执行一个测试类,如:
python -m unittest test_module.TestClass
# 或者单独执行一个测试方法
python -m unittest test_module.TestClass.test_method

4、组织测试代码

  • 测试用例: 单元测试的基础组成模块是 测试用例--必须建立起来并且完成正确性校验的单个场景
  • 编写用例的规范
    • 在unittest框架中,测试用例就是TestCase的实例,所以你必须继承TestCase类来写用例
    • 测试方法必须带self参数,用来单独运行或则组合运行用例
    • assert*()方法是TestCase类提供的,如果测试失败了,它会抛出解释性的说明,unittest则会把这个用例定义为失败,其他的异常都会被视为错误。
    • setUp()方法会在每一个test_func执行之前执行,同理的tearDown
    • 测试用例的执行顺序是测试方法名的字符串排序

自由组装测试套件

import unittest

class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget('The widget') def tearDown(self):
self.widget.dispose()

def suite():
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase('test_default_widget_size'))
suite.addTest(WidgetTestCase('test_widget_resize'))
return suite if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite())

5、跳过用例

5.1 跳过一个用例使用skip()装饰器就可以了,下面是几个实例

class MyTestCase(unittest.TestCase):

@unittest.skip("demonstrating skipping")
def test_nothing(self):
self.fail("shouldn't happen") @unittest.skipIf(mylib.__version__ < (1, 3),
"not supported in this library version")
def test_format(self):
# Tests that work for only a certain version of the library.
pass @unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
def test_windows_support(self):
# windows specific testing code
pass

第二部分-深入unittest APIs

1、Test cases 测试用例相关

unittest.TestCase(methodName="runTest")

  • TestCase类的实例展示了unittest宇宙中单元测试逻辑,这个类被设计为基类,由它的子类来实现特定的测试。
  • 这些子类实现test runner需要的接口,来让它控制测试用例和各个失败的检查和报告的测试方法
  • TestCase实例提供三类方法:
    • A: 用来运行测试: setUp() 、tearDown()、setUpClass()、tearDownClass()、run(result=None)、skipTest(reason)
    • B: 用来实现条件检查和报告失败assert*()
    • C: 一些查询信息的方法

2、Grouping tests 组织测试用例

unittest.TestSuite(tests=())

这个类代表一些单独测试用例或测试集的集合,TestSuite的对象有点像TestCase对象,除了它并不真正实现一个测试外,另外,它们用来集成需要一起运行的测试,下面是一些常用方法:

  • addTest(test) 向测试集中加入一个测试用例或测试集
  • addTests(tests) 添加多个test
  • run(result)运行suite关联的测试,收集测试结果放到result中
  • countTestCases()

3、Loading and running tests 加载并执行测试

class unittest.TestLoader

  • 用来通过测试类和或者测试模块创建测试集,这个类一般无需实例化,
  • 方法:
    • loadTestsFromTestCase(testCaseClass)
    • loadTestsFromModule(module, pattern=None)
    • loadTestsFromName(name, module=None)
    • loadTestsFromNames(names, module=None)
    • getTestCaseNames(testCaseClass)
    • discover(start_dir, pattern='test*.py', top_level_dir=None)

class unittest.TestResult

  • TestResult对象保存了测试集的测试结果
  • TestRunner.run()会返回一个TestResult实例,用于生成测试不报告用
    • 结果属性:errors、failures、skipped、testsRun

class unittest.TextTestResult(stream, descriptions, verbosity)

  • 用TextTestRunner对TestResult的实现
  • 方法:
    • _makeResult():通过运行run函数返回一个TestResult实例。
    • run(test): TextTestRunner的主入口,以TestSuite或TestCase为参数,并输出一个TestResult
    • unittest.main(*):一个从module中载入测试集并执行他们的命令行程序,为了方便测试模块执行。最简单的执行方式是:

--

# 执行一个module中的所有用例
if __name__ == '__main__':
unittest.main()

4、 Class and Module Fixtures

  • class及module级别的固件(Fixture)在测试套件TestSuite中已经实现, 当suite遇到一个新类中的测试用例时,前一个类先tearDown且新的类会setUp固件。Shared fixtures

unittest (python标准库-开发工具-单元测试框架)的更多相关文章

  1. python第六天 函数 python标准库实例大全

    今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...

  2. 转--Python标准库之一句话概括

    作者原文链接 想掌握Python标准库,读它的官方文档很重要.本文并非此文档的复制版,而是对每一个库的一句话概括以及它的主要函数,由此用什么库心里就会有数了. 文本处理 string: 提供了字符集: ...

  3. Python 标准库一览(Python进阶学习)

    转自:http://blog.csdn.net/jurbo/article/details/52334345 写这个的起因是,还是因为在做Python challenge的时候,有的时候想解决问题,连 ...

  4. python 标准库大全

    python 标准库 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata:Unicode字符数据库 string ...

  5. Python标准库、第三方库和外部工具汇总

    导读:Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具. 这些库可用于文件读写.网络抓取和解析.数据连 ...

  6. Python 标准库、第三方库

    Python 标准库.第三方库 Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具.这些库可用于文件读写 ...

  7. 140种Python标准库、第三方库和外部工具

    导读:Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具. 这些库可用于文件读写.网络抓取和解析.数据连 ...

  8. Python标准库与第三方库详解(转载)

    转载地址: http://www.codeweblog.com/python%e6%a0%87%e5%87%86%e5%ba%93%e4%b8%8e%e7%ac%ac%e4%b8%89%e6%96%b ...

  9. Python - 标准库概况 - 第二十一天

    Python 标准库概览 操作系统接口 os模块提供了不少与操作系统相关联的函数. 建议使用 "import os" 风格而非 "from os import *&quo ...

随机推荐

  1. 《Cracking the Coding Interview》——第11章:排序和搜索——题目2

    2014-03-21 20:49 题目:设计一种排序算法,使得anagram排在一起. 解法:自定义一个comparator,使用额外的空间来统计字母个数,然后比较字母个数. 代码: // 11.2 ...

  2. php中utf-8转unicode

    public function utf8_unicode($str) { $unicode = array(); $values = array(); $lookingFor = 1; for ($i ...

  3. IE开发人员工具教程

    写在前面 一直非常谷歌的控制台,因为我是做前端的,谷歌浏览器在我看来是解析JS最快的浏览器,所谓的熟能生巧,用熟悉了谷歌浏览器之后就特别喜欢用谷歌的控制台调试脚本.改变样式.查看HTML.查看资源加载 ...

  4. 【Perceptron Learning Algorithm】林轩田机器学习基石

    直接跳过第一讲.从第二讲Perceptron开始,记录这一讲中几个印象深的点: 1. 之前自己的直觉一直对这种图理解的不好,老按照x.y去理解. a) 这种图的每个坐标代表的是features:fea ...

  5. JFinal 添加Druid插件

    第一步:添加依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</a ...

  6. 解决Navicat for MySQL 连接 Mysql 8.0.11 出现1251- Client does not support authentication protocol 错误

    安装MySQL8.0之后,使用Navicat连接数据库,报1251错误. 上网搜索解决方案,网上说出现这种情况的原因是:mysql8 之前的版本中加密规则是mysql_native_password, ...

  7. 洛谷P1071潜伏者(提高组)

    题目描述 R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于S国的R 国间谍小C终于摸清了 S 国军用密码的编码规则: 1. S国军方内部欲发送的原信息经过加密后在网 ...

  8. 服务器tomcat配置教程

    2018年上学期期末课程设计做了一个留言板,但是我需要把这个Jave Web弄到我的服务器上 首先我们可以安装jdk tomcat在启动时,会读取环境变量的信息,需要一个CATALINA_HOME 与 ...

  9. C#中的&运算

    2是一个比较特殊的数. 2的1次方2 2的2次方4 2的3次方8 2的4次方16 2的5次方32 2的6次方64 2的7次方128 2的8次方256 2的9次方512 2的10次方1024 2的11次 ...

  10. poj 3436 网络流构图经典

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6012   Accepted: 2 ...