1介绍下unittest的基本使用方法:

1.import unittest

2.定义一个继承自unittest.TestCase的测试用例类

3.定义setUp和tearDown,在每个测试用例前后做一些辅助工作。

4.定义测试用例,名字以test开头。

5.一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。

6.调用unittest.main()启动测试

7.如果测试未通过,会输出相应的错误提示。如果测试全部通过则不显示任何东西,这时可以添加-v参数显示详细信息。

具体例子如下:

# -*- coding: cp936 -*-

import unittest

class DefaultWidgetSizeTestCase(unittest.TestCase):

def setUp(self):    #测试前的准备工作

pass

def test_testcase1(self):   #测试用例1,且必须以test开头才能被认作是一个测试用例

pass

def test_testcase2(self):

pass

def test_testcase3(self):

pass

def runTest(self):

pass

def tearDown(self):  #测试后的清除数据工作

pass

if __name__ == "__main__":

unittest.main()   #必须调用main启动此次测试

查看了unittest的源代码发现,这个类中有四个testcase,3个以test开头,另一个是runTest,但是结果只运行了test开头的3个testcase,是因为代码中写着如果有test开头的则运行test开头的testcase,如果没有test开头的testcase而又存在runTest,怎运行runtest这个测试用例,在这里例子中,如果把3个test开头的testcase注释掉,则显示运行了一条testcase,即runTest。

测试结果:

...

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

Ran 3 tests in 0.078s

OK

2 下面是unittest模块的常用方法:

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     2.7

assertIsNot(a, b)     a is not b

2.7 assertIsNone(x)     x is None     2.7

assertIsNotNone(x)     x is not None     2.7

assertIn(a, b)     a in b     2.7

assertNotIn(a, b)     a not in b     2.7

assertIsInstance(a, b)     isinstance(a, b)     2.7

assertNotIsInstance(a, b)     not isinstance(a, b)     2.7

3也有其他的unittest方法,用于执行更具体的检查,如:

Method     Checks that     New in

assertAlmostEqual(a, b)     round(a-b, 7) == 0

assertNotAlmostEqual(a, b)     round(a-b, 7) != 0

assertGreater(a, b)     a > b     2.7

assertGreaterEqual(a, b)     a >= b     2.7

assertLess(a, b)     a

assertLessEqual(a, b)     a <= b     2.7

assertRegexpMatches(s, re)     regex.search(s)     2.7

assertNotRegexpMatches(s, re)     not regex.search(s)     2.7

assertItemsEqual(a, b)     sorted(a) == sorted(b) and works with unhashable objs     2.7

assertDictContainsSubset(a, b)     allthekey/valuepairsinaexistinb     2.7

单元测试例子:

import random

import unittest

class TestSequenceFunctions(unittest.TestCase):

def setUp(self):

self.seq = range(10)

def test_shuffle(self):

# make sure the shuffled sequence does not lose any elements

random.shuffle(self.seq)

self.seq.sort()

self.assertEqual(self.seq, range(10))

# should raise an exception for an immutable sequence

self.assertRaises(TypeError, random.shuffle, (1,2,3))

def test_choice(self):

element = random.choice(self.seq)

self.assertTrue(element in self.seq)

def test_sample(self):

with self.assertRaises(ValueError):

random.sample(self.seq, 20)

for element in random.sample(self.seq, 5):

self.assertTrue(element in self.seq)

if__name__ =='__main__':

unittest.main()

或者用下面的代码替代最后执行testcase的代码:

suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)

unittest.TextTestRunner(verbosity=2).run(suite)

TestSequenceFunctions继承自unittest.TestCase,重写了setUp()方法,并且定义了三个以'test'开头的 方法,那这个TestSequenceFunctions类到底是个什么呢?它是一个测试用例,还是三个测试用例?说是三个测试用例的话,它本身继承自 TestCase,说是一个测试用例的话,里面又有三个test_*()方法,明显是三个测试用例。其实,我们只要看一些TestLoader是如何加载 测试用例的,就一清二楚了,在loader.TestLoader类中有一个loadTestsFromTestCase()方法:

def loadTestsFromTestCase(self, testCaseClass):

"""Return a suite of all tests cases contained in testCaseClass"""

if issubclass(testCaseClass, suite.TestSuite):

raise TypeError("Test cases should not be derived from TestSuite." \

" Maybe you meant to derive from TestCase?")

testCaseNames = self.getTestCaseNames(testCaseClass)

if not testCaseNames and hasattr(testCaseClass, 'runTest'):

testCaseNames = ['runTest']

loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))

return loaded_suite

getTestCaseNames()是从TestCase这个类中找所有以“test”开头的方法,然后注意第9行,在构造TestSuite对象时, 其参数使用了一个map方法,即对testCaseNames中的每一个元素,使用testCaseClass为其构造对象,其结果是一个 TestCase的对象集合,可以用下面的代码来分步说明:

testcases = []

for name in testCaeNames:

testcases.append(TestCase(name))

loaded_suite = self.suiteClass(tuple(testcases))

可见,对每一个以test开头的方法,都为其构建了一个TestCase 对象,值得注意的是,如果没有定义test开头的方法,而是将测试代码写到了一个名为runTest的方法中,那么会为该runTest方法构建 TestCase对象,如果定义了test开头的方法,就会忽略runTest方法。

至此,基本就清楚了,每一个以test开头的方法,都会为其构建TestCase对象,也就是说TestSequenceFunctions类中其实定义 了三个TestCase,之所以写成这样,是为了方便,因为这几个测试用例的fixture是相同的,如果每一个测试用例单独写成一个TestCase的 话,会有很多的冗余代码。

python unittest教程_python unittest 基本介绍相关推荐

  1. python unittest教程_Python Unittest原理及基本使用方法

    基本使用步骤: 1.import unittest 2.新建一个Class继承unittest.TestCase 3.定义一个以test开头的函数作为测试用例[必须以test开头] 4.执行测试用例前 ...

  2. 视频教程-快速入门Python基础教程_Python基础知识大全-Python

    快速入门Python基础教程_Python基础知识大全 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥99.00 立即 ...

  3. 视频教程-快速入门Python基础教程_Python基础进阶视频-Python

    快速入门Python基础教程_Python基础进阶视频 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥199.00 立 ...

  4. python单元测试教程_python单元测试unittest 输出测试报告HTMLTestRunner

    建立unittest步骤: 1.先导入模块unittest及要测试的函数 2.再创建一个继承unittest.TestCase的类,类命名要包含Test 3.在类中创建一个方法,命名为test_开头 ...

  5. python 框架 优化_python+unittest框架第六天unittest之优化测试报告

    今天的内容主要是,用第三方的HTMLRUNner 第三方的报告来优化之前第五天批量执行案例的测试报告.案例的部分看第五天的批量执行笔记~ HTMLRUNner他可以生成更美观的测试报告,基于前辈造的车 ...

  6. python教程是什么-Python基础教程_Python入门知识

    Python基础教程频道为编程初学者提供入门前的所有基础知识,必须要掌握的一些PYTHON基础语法语句,基本的数据类型. 让大家可以更快速.更容易理解的的方式掌握Python编程所需要的基础知识,灵活 ...

  7. python zipfile教程_Python中zipfile压缩文件模块的基本使用教程

    zipfile Python 中 zipfile 模块提供了对 zip 压缩文件的一系列操作. f=zipfile.ZipFile("test.zip",mode="&q ...

  8. python 3教程_Python 3 教程

    全屏 Python 3 教程 Python的3.0版本,常被称为Python 3000,或简称Py3k.相对于Python的早期版本,这是一个较大的升级.为了不带入过多的累赘,Python 3.0在设 ...

  9. python基础教程是什么-Python基础教程_Python入门知识

    Python基础教程频道为编程初学者提供入门前的所有基础知识,必须要掌握的一些PYTHON基础语法语句,基本的数据类型. 让大家可以更快速.更容易理解的的方式掌握Python编程所需要的基础知识,灵活 ...

  10. python ctypes教程_python ctypes是什么

    ctypes是python的一个函数库,提供和C语言兼容的数据类型,可以直接调用动态链接库中的导出函数. 为了使用ctypes,必须依次完成以下步骤: ·加载动态链接库 ·将python对象转换成ct ...

最新文章

  1. php 通过stomp协议连接ActiveMQ
  2. magic_quotes_gpc和magic_quotes_runtime的区别和用法详解
  3. 搞懂深浅拷贝JavaScript内存之栈和堆
  4. log4j日志输出框架
  5. Appcan跨域交互
  6. flume的配置和开启
  7. Oracle 常用伎俩和剧本
  8. ReactWebpack 环境安装
  9. wordpress.org 删除
  10. 工业相机镜头选型教程
  11. 怎么修改html上的文字大小,网页字体大小怎么改_电脑网页字体怎么调整-win7之家...
  12. 编译原理 - 推导与归约(一)
  13. Linux串口通信之termios结构体
  14. 电脑怎么搜索文本内容? 电脑快速搜索内容的技巧
  15. leetcode-292-Nim游戏(java|python)
  16. Verilog训练笔记(1)——非重叠序列检测
  17. 程序员考公指南(逃离996的最强后路!!!)
  18. C++ 实现内存泄露检查
  19. Android每日一文
  20. 复旦大学陈怡然:文本摘要的跨数据集迁移研究

热门文章

  1. Windows安装RabbitMQ集群的几个注意点
  2. javascript ajax 脚本跨域调用全解析
  3. iptables小结
  4. Storm处理流程, 基本参数配置
  5. Date实战案例:倒计时日历
  6. 如何安全地进行ddos压力测试
  7. 关于Spring Cloud Netflix
  8. [macOS] git忽略所有的.DS_Store文件
  9. 【CodeVs 6128 Lence的方块们】
  10. Zabbix安装界面显示PHP time zone 为“红色”的解决办法