python unittest教程_python unittest 基本介绍
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 基本介绍相关推荐
- python unittest教程_Python Unittest原理及基本使用方法
基本使用步骤: 1.import unittest 2.新建一个Class继承unittest.TestCase 3.定义一个以test开头的函数作为测试用例[必须以test开头] 4.执行测试用例前 ...
- 视频教程-快速入门Python基础教程_Python基础知识大全-Python
快速入门Python基础教程_Python基础知识大全 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥99.00 立即 ...
- 视频教程-快速入门Python基础教程_Python基础进阶视频-Python
快速入门Python基础教程_Python基础进阶视频 十余年计算机技术领域从业经验,在中国电信.盛大游戏等多家五百强企业任职技术开发指导顾问,国内IT技术发展奠基人之一. 杨千锋 ¥199.00 立 ...
- python单元测试教程_python单元测试unittest 输出测试报告HTMLTestRunner
建立unittest步骤: 1.先导入模块unittest及要测试的函数 2.再创建一个继承unittest.TestCase的类,类命名要包含Test 3.在类中创建一个方法,命名为test_开头 ...
- python 框架 优化_python+unittest框架第六天unittest之优化测试报告
今天的内容主要是,用第三方的HTMLRUNner 第三方的报告来优化之前第五天批量执行案例的测试报告.案例的部分看第五天的批量执行笔记~ HTMLRUNner他可以生成更美观的测试报告,基于前辈造的车 ...
- python教程是什么-Python基础教程_Python入门知识
Python基础教程频道为编程初学者提供入门前的所有基础知识,必须要掌握的一些PYTHON基础语法语句,基本的数据类型. 让大家可以更快速.更容易理解的的方式掌握Python编程所需要的基础知识,灵活 ...
- python zipfile教程_Python中zipfile压缩文件模块的基本使用教程
zipfile Python 中 zipfile 模块提供了对 zip 压缩文件的一系列操作. f=zipfile.ZipFile("test.zip",mode="&q ...
- python 3教程_Python 3 教程
全屏 Python 3 教程 Python的3.0版本,常被称为Python 3000,或简称Py3k.相对于Python的早期版本,这是一个较大的升级.为了不带入过多的累赘,Python 3.0在设 ...
- python基础教程是什么-Python基础教程_Python入门知识
Python基础教程频道为编程初学者提供入门前的所有基础知识,必须要掌握的一些PYTHON基础语法语句,基本的数据类型. 让大家可以更快速.更容易理解的的方式掌握Python编程所需要的基础知识,灵活 ...
- python ctypes教程_python ctypes是什么
ctypes是python的一个函数库,提供和C语言兼容的数据类型,可以直接调用动态链接库中的导出函数. 为了使用ctypes,必须依次完成以下步骤: ·加载动态链接库 ·将python对象转换成ct ...
最新文章
- php 通过stomp协议连接ActiveMQ
- magic_quotes_gpc和magic_quotes_runtime的区别和用法详解
- 搞懂深浅拷贝JavaScript内存之栈和堆
- log4j日志输出框架
- Appcan跨域交互
- flume的配置和开启
- Oracle 常用伎俩和剧本
- ReactWebpack 环境安装
- wordpress.org 删除
- 工业相机镜头选型教程
- 怎么修改html上的文字大小,网页字体大小怎么改_电脑网页字体怎么调整-win7之家...
- 编译原理 - 推导与归约(一)
- Linux串口通信之termios结构体
- 电脑怎么搜索文本内容? 电脑快速搜索内容的技巧
- leetcode-292-Nim游戏(java|python)
- Verilog训练笔记(1)——非重叠序列检测
- 程序员考公指南(逃离996的最强后路!!!)
- C++ 实现内存泄露检查
- Android每日一文
- 复旦大学陈怡然:文本摘要的跨数据集迁移研究