一、unittest简介

  unitest单元测试框架最初是有JUnit的启发,它支持测试自动化,共享测试的设置和关闭代码,将测试聚合到集合中,以及测试与报告框架的独立性。

二、unittest相关概念

TestFixture:表示测试一个或多个测试的时候,需要的一些相关动作,比如,创建临时或代理数据库,目录或启动服务器进程。测试代码的这种工作环境称为夹具。
TestCase(测试用例):就是测试的各个单元,他检查对特定输入集的特定响应,unitest提供了一个基类,TestCase用于创建新的测试用例。
TestSuite(测试套件):多个测试用例集合在一起。测试用例实例根据他们测试的功能组合在一起,unittest为此提供了一个机制:测试套件。
TestRunner:执行测试用例的,测试的结果会保存至TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。
TestLoader():可用于自动创建测试套件并使用单个测试填充它的过程。
运行各种测试用例的顺序是通过根据字符串的内置顺序对测试函数名称进行排序调用。

三、断言方法表

检查并报告故障
assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a, b) a is b 3.1
assertIsNot(a, b) a is not b 3.1
assertIsNone(x) x is None 3.1
assertIsNotNone(x) x is not None 3.1
assertIn(a, b) a in b 3.1
assertNotIn(a, b) a not in b 3.1
assertIsInstance(a, b) isinstance(a, b) 3.2
assertNotIsInstance(a, b) not isinstance(a, b) 3.2
检查异常、警告、日志消息生成
assertRaises(exc, fun, *args, **kwds) fun(*args, **kwds)提高EXC
assertRaisesRegex(exc, r, fun, *args, **kwds) fun(*args, **kwds)提出exc 并且消息匹配正则表达式r 3.1
assertWarns(warn, fun, *args, **kwds) fun(*args, **kwds)提出警告 3.2
assertWarnsRegex(warn, r, fun, *args, **kwds) fun(*args, **kwds)提出警告 和消息的正则表达式匹配ř 3.2
assertLogs(logger, level) 该with块 以最低级别登录记录器 3.4

四、示例

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'.islower()) def test_split(self):
s = "Hello World"
self.assertEqual(s.split(), ['Hello', 'World'])
with self.assertRaises(TypeError):
s.split(2) if __name__ == '__main__':
unittest.main()
首先通过unittest.TestCase子类创建测试用例
通过以test开头的三个方法
assertEqual()检查预期结果
assertTrue()或assertFalse()核实情况
assertRaises()验证是否引发了特定异常
使用这些方法代替assert语句,以便测试运行器可以累积所有测试结果并生成报告
setUp():在每个测试用例执行之前执行
tearDown():在每个测试用例执行之后执行

五、运行测试用例

unittest.main()提供了测试脚本的命令行界面
python BaseExample.py -v 传入-v标志来运行具有更多详细信息的测试用例
python -m unittest test_module1 test_module2
python -m unittest test_module.TestClass
python -m unittest test_module.TestClass.test_method

六、生成测试报告

# coding=utf-8
import unittest
import HtmlTestRunner class TestSuiteExample(unittest.TestCase): def test_equal(self):
s = "Hello"
self.assertEqual(s, "Hello") def test_upper(self):
s = "FOO"
self.assertEqual('FOO', s) def test_lower(self):
s = "foo"
self.assertTrue(s.islower()) if __name__ == '__main__':
# 创建一个测试集合
f = open('./test_suite_example.html')
test_suite = unittest.TestSuite()
loader = unittest.TestLoader() # 向测试套件中添加测试用例
# test_suite.addTest(test=TestSuiteExample("test_equal")) # 使用loader添加所有的测试方法
tests = loader.loadTestsFromTestCase(TestSuiteExample)
test_suite.addTests(tests=tests) # 打开文件,用于生成html runner = HtmlTestRunner.HTMLTestRunner(output="D:/python/")
runner.run(test_suite)

HtmlTestRunner 需要单独安装

pip install html-testRunner==1.0.3

向套件中添加测试用例使用addTest()和addTests()

addTest(test)
Add a TestCase or TestSuite to the suite. addTests(tests)
Add all the tests from an iterable of TestCase and TestSuite instances to this test suite. This is equivalent to iterating over tests, calling addTest() for each element.

七、跳过测试和预期的失败

unittest支持跳过单个测试甚至整个测试类,它支持将测试标记为"预期失败",但不应该视为TestResult失败

import sys
import unittest class MyTestCase(unittest.TestCase): @unittest.skip("跳过测试")
def test_nothing(self):
self.fail("没有发生") @unittest.skipIf(1 > 0, "如果真,则跳过")
def test_format(self):
self.assertTrue(1 < 0) @unittest.skipUnless(sys.platform.startswith("win"),"requires Windows")
def test_upper(self):
s = "hh"
self.assertEqual('HH',s.upper()) if __name__ == '__main__':
unittest.main()

八、TestCase(测试用例)

TestCase类的实例表示unittest中最小的测试单元,此类旨在用作基类,具体的测试有气子类实现,此类实现测试运行期所需的接口以允许其驱动测试

  • setUp():调用准备测试夹具的方法,在调用测试方法之前立即调用它。
  • tearDown(): 调用测试方法后立即调用此方法并记录结果。即使测试方法引发了异常,也会调用此方法。
  • setUpClass():运行测试类中所有测试方法之前调用,必须装饰为@classmethod
  • tearDownClass():已经运行测试类中所有的测试方法才会调用,必须装饰@classmethod
  • run():运行测试,将结果收集到结果对象中,结果对象不会返回给run()调用者
  • skipTest():跳过此测试方法

九、TestSuite(分组测试)

此类表示各个测试用例和测试套件的集合,该类提供了测试运行器所需的接口,以允许他像其他任何测试用例一样运行

  • addTest():添加一个TestCase或TestSuite到套件
  • addTests():将可迭代的TestCase或TestSuite实例中所有测试添加到测试套件中
  • run():运行与此套件关联的测试

十、TestLoader(加载和运行测试)

TestLoader类被用于创建TestSuite从模块或类中。通常,不需要创建此类的实例,unittest模块提供了一个可以共享的实例unittest.defaultTestLoader()

  • loadTestsFromTestCase(testCaseClass):从testCaseClase中返回一个包含所有测试用例的suite
  • loadTestsFromModule(module):从提供的module中返回一个包含所有测试用例的suite,此方法在模块中所有派生来自TestCase的类,并为每个TestCase子类创建实例
  • loadTestsFromName(name, module=None)
  • loadTestFromNames(names, module=None)

十一、TestResult

此类用于编译有关哪些测试成功以及哪些测试失败的信息

一个TestResult对象存储一组测试结果,有以下属性:

  • errors:包含2元组TestCase实例和包含格式化回溯的字符串的列表。每个元组代表一个引发意外异常的测试。
  • failures:包含2元组TestCase实例和包含格式化回溯的字符串的列表
  • skipped:包含2元组TestCase实例和字符串的列表,其中包含跳过测试的原因。

十二、其他

unittest.defaultTestLoader:TestLoader要共享的类的实例。如果不需要自定义,TestLoader则可以使用此实例而不是重复创建新实例。

unittest.main:一个命令行程序,它从模块加载一组测试并运行它们; 这主要是为了使测试模块可以方便地执行

Python单元测试unittest - 单元测试框架的更多相关文章

  1. Python+Selenium ----unittest单元测试框架

    unittest是一个单元测试框架,是Python编程的单元测试框架.有时候,也做叫做“PyUnit”,是Junit的Python语言版本.这里了解下,Junit是Java语言的单元测试框架,Java ...

  2. python之unittest单元测试

    # unittest单元测试 import unittest from class_demo import Car class TestCar(unittest.TestCase): '''测试Car ...

  3. python利用unittest测试框架组织测试用例的5种方法

    利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...

  4. Python 中 unittest 单元测试框架中需要知识点

    现在正在使用 unittest 框架,我们来记录下这个框架的知识点: unittest 框架:我们在写接口用例的时候,会继承 unittest 当中的 TestCase 的类和方法,私有方法除外,来识 ...

  5. Python单元测试unittest测试框架

    本文的主题是自动化测试框架的实现,在实现之前,先了解一下关于unittest模块的相关知识: Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回 ...

  6. python的unittest单元测试框架断言整理汇总

    自动化脚本最重要的是断言,正确设置断言以后才能帮助我们判断测试用例执行结果. 一.先说说unittest常用的断言吧 常用的就以下几个,网上一搜一大堆.python版本2.7以上都可以调用了. 断言语 ...

  7. python + selenium + unittest 自动化测试框架 -- 入门篇

    . 预置条件: 1. python已安装 2. pycharm已安装 3. selenium已安装 4. chrome.driver 驱动已下载 二.工程建立 1. New Project:建立自己的 ...

  8. python+appium+unittest自动化测试框架环境搭建

    一.基础软件准备 1.python 版本最新版本,python的IDE使用pycharm.具体的下载链接: python https://www.python.org/ pycharm:https:/ ...

  9. 基于python的unittest测试框架集成到jenkins(Mac)

    1.jenkins部分 1.1 安装jenkins jenkins下载地址:https://jenkins.io/download/ 安装步骤,疯狂点击下一步 1.2 打开jenkins服务 在浏览器 ...

随机推荐

  1. luogu2827 [NOIp2016]蚯蚓 (模拟)

    可以直观地想到用优先队列来做,但数据范围是O(n)的 然后我们发现,因为我们每次挑出来的蚯蚓是单调的,所以把每个切成两段后,那两段也是对应单调的 也就是说,算上最一开始的蚯蚓,我们一共维护三个队列,三 ...

  2. happens-before

    happens-before是JMM最核心的概念.对应Java程序员来说,理解happens-before是理解JMM的关键. JMM的设计 首先,让我们来看JMM的设计意图.从JMM设计者的角度,在 ...

  3. 前端学习 -- Html&Css -- 框架集

    框架集和内联框架的作用类似,都是用于在一个页面中引入其他的外部的页面,框架集可以同时引入多个页面,而内联框架只能引入一个,在h5标准中,推荐使用框架集,而不使用内联框架. 使用frameset来创建一 ...

  4. B1003. 我要通过!

    “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”. 得到“答案正确”的条件是: 1 ...

  5. [luogu4462][异或序列]

    传送门 突然发现自己没整理过异或的知识,正好借这个题整理一下. 关于异或 (1)异或就是在二进制下,两数各个位置上的数,相同为0,不同为1,所得到的数,比如说4^7,4的二进制是100,7的二进制是1 ...

  6. 快速幂&快速乘法

    尽管快速幂与快速乘法好像扯不上什么关系,但是东西不是很多,就一起整理到这里吧 快速幂思想就是将ax看作x个a相乘,用now记录当前答案,然后将指数每次除以2,然后将当前答案平方,如果x的2进制最后一位 ...

  7. std::lock_guard和std::unique_lock

    std::unique_lock也可以提供自动加锁.解锁功能,比std::lock_guard更加灵活 https://www.cnblogs.com/xudong-bupt/p/9194394.ht ...

  8. react与react-router

    路由在单页应用极其常见,不论是angularjs项目还是react项目,都有路由. 在react项目中使用路由,我们当然是全局安装react-router. 第一步: 第二步:创建几个要跳转到的页面 ...

  9. GO语言的进阶之路-网络安全之proxy

    GO语言的进阶之路-网络安全之proxy 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在党的带领下,我们大陆的孩子身心健康还是杠杠的,尤其是像我这种农村孩纸,从来不会像<人 ...

  10. JVM总结(二):JVM的内存分配策略

    这节我们总结一下JVM中的内存分配策略.目录如下: 内存分配策略 对象优先在新生代Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 内存分配策略 Java ...