什么是单元测试

单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。

比如对于函数abs(),我们可以编写的测试用例为:

(1)输入正数,比如1、1.2、0.99,期待返回值与输入相同

(2)输入复数,比如-1、-1.2、-0.99,期待返回值与输入相反

(3)输入0,期待返回0

(4)输入非数值类型,比如None、[]、{}、期待抛出TypeError

把上面这些测试用例放到一个测试模块里,就是一个完整的单元测试

unittest工作原理

unittest中最核心的四部分是:TestCase,TestSuite,TestRunner,TestFixture

(1)一个TestCase的实例就是一个测试用例。测试用例就是指一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。

(2)而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。

(3)TestLoader是用来加载TestCase到TestSuite中的。

(4)TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法

(5)测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。

综上,整个流程就是首先要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。

python unittest简介

unittest是python下的单元测试框架,是java JUnit的python版本, 跟其它语言下的单元测试框架风格类似,unittest支持自动化测试、共享setup和teardown代码、测试聚合成集、独立于报告框架。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()

可以通过继承unittest.TestCase创建一个测试用例TestStringMethods,在这个用例中定义了测试函数,这些函数名字都以”test”开头,在执行测试用例TestStringMethods时,这些方法会被自动调用。每个测试函数中都调用了assertTrue()和assertFalse()方法检查预期结果,或者使用assertRaises()确认产生了一个特定异常。现在来看一下这段代码的运行结果:

...

----------------------------------------------------------------------

Ran 3 tests in 0.000s

OK

有时我们需要在用例执行前后做一些工作如初始化和清理,这就需要实现setUp()和tearDown()方法

import unittest

class WidgetTestCase(unittest.TestCase):

def setUp(self):

print("setUp()")

def test_1(self):

print("test_1")

def test_2(self):

print("test_2")

def tearDown(self):

print("tearDown()")

if __name__ == "__main__":

unittest.main()

运行结果:

setUp()

.test_1

tearDown()

setUp()

.test_2

tearDown()

----------------------------------------------------------------------

Ran 2 tests in 0.000s

OK

注:如果setUp()执行成功(没有异常发生),那么无论测试方法是否通过,tearDown()都会被执行

根据所测的特性测试用例被组合在一起,通过调用unittest.main(),unittest测试框架会自动收集所有模块的测试用例然后执行。

import unittest

class WidgetTestCase(unittest.TestCase):

def setUp(self):

print("WidgetTestCase setUp()")

def test_Widget(self):

print("test_Widget")

def tearDown(self):

print("WidgetTestCase tearDown()")

class FuncTestCase(unittest.TestCase):

def setUp(self):

print("FuncTestCase setUp()")

def test_func(self):

print("test_func")

def tearDown(self):

print("FuncTestCase tearDown()")

if __name__ == "__main__":

unittest.main()

运行结果:

FuncTestCase setUp()

test_func

FuncTestCase tearDown()

.WidgetTestCase setUp()

test_Widget

WidgetTestCase tearDown()

.

----------------------------------------------------------------------

Ran 2 tests in 0.003s

OK

如果想构建自已的用例集,只需要这么做:

import unittest

class WidgetTestCase(unittest.TestCase):

def setUp(self):

print("WidgetTestCase setUp()")

def test_Widget(self):

print("test_Widget")

def tearDown(self):

print("WidgetTestCase tearDown()")

class FuncTestCase(unittest.TestCase):

def setUp(self):

print("FuncTestCase setUp()")

def test_func(self):

print("test_func")

def tearDown(self):

print("FuncTestCase tearDown()")

def suite():

suite = unittest.TestSuite()

suite.addTest(FuncTestCase("test_func"))

return suite

if __name__ == "__main__":

runner=unittest.TextTestRunner()

runner.run(suite())

运行结果:

FuncTestCase setUp()

test_func

FuncTestCase tearDown()

.

----------------------------------------------------------------------

Ran 1 test in 0.001s

OK

unittest中相关类和函数

在unittest中 TestCase类的实例代表逻辑测试单元,这个类通常被当作测试类的基类使用, TestCase类实现了许多测试相关的接口,主要是以下三组方法:

1.执行测试用例的方法

setUp()

#在每个测试方法之前执行,这个方法引发的异常会被认为是错误,而非测试失败,默认实现是不做任何事

tearDown()

#在每个测试方法之后执行,即使测试方法抛出异常tearDown()方法仍会执行,并且只有setUp()成功执行时tearDown()才会执行,

#同样这个方法引发的异常会被认为是错误,而非测试失败。默认实现是不做任何事

setUpClass()

#在一个测试类的所有测试方法执行之前执行,相当于google test中的SetUpTestCase()方法,setUpClass()必须被装饰成一个classmethod()

@classmethod

def setUpClass(cls):

...

tearDownClass()

#在一个测试类的所有测试方法执行之后执行,相当于google test中的TearDownTestCase()方法,tearDownClass()必须被装饰成一个classmethod()

@classmethod

def tearDownClass(cls):

...

2.检查条件和报告错误的方法

Method

Checks that

New in

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) raises exc

assertRaisesRegex(exc, r, fun, *args, **kwds)

fun(*args, **kwds) raises exc and the message matches regex r

3.1

assertWarns(warn, fun, *args, **kwds)

fun(*args, **kwds) raises warn

3.2

assertNotAlmostEqual(a, b)

round(a-b, 7) != 0

assertGreater(a, b)

a > b

3.1

assertGreaterEqual(a, b)

a >= b

3.1

assertLess(a, b)

a < b

3.1

assertLessEqual(a, b)

a <= b

3.1

assertRegex(s, r)

r.search(s)

3.1

assertNotRegex(s, r)

not r.search(s)

3.2

assertCountEqual(a, b)

a and b have the same elements in the same number, regardless of their order

3.2

assertWarnsRegex(warn, r, fun, *args, **kwds)

fun(*args, **kwds) raises warn and the message matches regex r

3.2

assertLogs(logger, level)

The with block logs on logger with minimum level

3.4

assertMultiLineEqual(a, b)

strings

3.1

assertSequenceEqual(a, b)

sequences

3.1

assertListEqual(a, b)

lists

3.1

assertTupleEqual(a, b)

tuples

3.1

assertSetEqual(a, b)

sets or frozensets

3.1

assertDictEqual(a, b)

dicts

3.1

本文标题: Python unittest单元测试框架总结

本文地址: http://www.cppcns.com/jiaoben/python/239363.html

python单元测试框架-Python unittest单元测试框架总结相关推荐

  1. 基于Python的接口自动化unittest测试框架和ddt数据驱动详解

    引言 在编写接口自动化用例时,我们一般针对一个接口建立一个.py文件,一条接口测试用例封装为一个函数(方法),但是在批量执行的过程中,如果其中一条出错,后面的用例就无法执行,还有在运行大量的接口测试用 ...

  2. python selenium unittest_python+selenium+unittest单元测试框架

    unittest简介 python自动化测试不得不提unittest,unittest原名为PyUnit是python自带的单元测试框架,类似于java的JUnit是有JUnit衍生而来. unitt ...

  3. Python接口自动化之unittest单元测试

    ------·今天距2021年251天·------ 这是ITester软件测试小栈第115次推文 在上一篇Python接口自动化测试系列文章:Python接口自动化之requests请求封装,主要通 ...

  4. 【Python自动化测试15】unittest测试框架的核心概念与作用

    文章目录 一.前言 二.认识单元测试 三.unittest核心概念与操作 3.1.unittest的作用 3.2.测试用例(TestCase) 3.3.运行测试用例 3.4.测试套件.加载器与运行器( ...

  5. python unit test_python 中unittest单元测试为什么addTest没用。

    #! /usr/bin/env python #! -*-cording:utf-8 -*- import unittest from appium import webdriver import t ...

  6. 单元测试框架之unittest(一)

    一.单元测试的含义 unittest单元测试框架的设计灵感来源于Junit(Java语言的单元测试框架),它与其他语言的单元测试框架风格相类似,支持自动化测试.为测试共享setUp和shutDown. ...

  7. Python框架之UnitTest

    unittest 是python 的单元测试框架,unittest 单元测试提供了创建测试用例,测试套件以及批量执行的方案, unittest 在安装pyhton 以后就直接自带了,直接import ...

  8. python自动化测试框架pytest.pdf_Python自动化测试框架

    随着技术的进步和自动化技术的出现,市面上出现了一些自动化测试框架.只需要进行一些适用性和效率参数的调整,这些自动化测试框架就能够开箱即用,大大节省了开发时间.而且由于这些框架被广泛使用,他们具有很好的 ...

  9. 接口自动化框架python+pytest+Allure 思路总结

    前言: 好久没有更新博客了,新的一年该对过去一年的学习经验做一个总结了~ 之前一直用unittest库做接口自动化测试框架,最近发现pytest库太好用了,而且参数化起来很方便,因为是自己加上通过网络 ...

  10. 【Python自动化测试20】接口自动化测试框架模型搭建

    文章目录 一.前言 二.框架搭建流程 2.1 项目创建 2.2 README文件 2.3 .gitignore文件 2.4 什么是测试框架? 2.5 分层设计 2.6 框架搭建 2.6.1 公用目录( ...

最新文章

  1. 述说C#中的值类型和引用类型的千丝万缕
  2. XML 的简介与开发
  3. Synchronize对象锁
  4. Linux中修改登录提示文件
  5. 南邮CTF-MISC-Remove Boyfriend
  6. 解决Docker构建时出现的 WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.13/main: Permission denied
  7. 剑指offer编程题Java实现——面试题3二维数组中的查找
  8. Java:以CSV格式流式传输JDBC结果集
  9. Centos 安装 禅道
  10. openssl漏洞检查
  11. SAP License:基于成本的获利分析表CE1-CE4
  12. Mac下实现Word文档批量转换为PDF
  13. 暑假计算机教育培训总结,暑假信息技术培训心得
  14. Vivado IP核之RAM Block Memery Generator
  15. 2021年征兵没有高考成绩查询,2021年征兵政策新调整,三种情况无法通过政审,快看看是不是自己...
  16. AutoCAD家具设计入门到精通视频教程
  17. 工信部新规本月底施行 未经用户同意发送商业短信将被罚款
  18. Java并发HashMap报错ConcurrentModificationException解决方案
  19. 2022-2028全球食品级柠檬酸镁行业调研及趋势分析报告
  20. Oracle--加锁的方法

热门文章

  1. go defer 语句会延迟函数的执行直到上层函数返回。
  2. javascript最快入门
  3. 【转】pDc-SelectObject(pOldBrush)恢复画刷
  4. 基于Android的浮动组件,可以用于应用中的新功能展示等等。
  5. IE8 chrome 中 table隔行换色解决办法
  6. 确定多重选择列表控件 (List Control) 中的选定内容
  7. C#调用USER32.DLL的API函数
  8. 沃尔沃投资两家以色列科技创企 布局人工智能
  9. 宝马戴姆勒、大众福特 自动驾驶圈又添新团伙
  10. tensorflow函数总结