Python 单元测试
测试
测试用例
对函数 abs(),这个函数的作用就是取绝对值,我们可以编写以下几个测试用例:
- 输入正数,比如 1、 1.5、 0.99,期待返回值与输入相同
- 输入负数,比如 -1、 -1.5、 -0.99, 期待返回值与输入值相反
- 输入0, 期待返回0;
- 输入非数值类型,比如 None、 []、 {}, 期待抛出 TypeError 把上面的测试用例,放到测试模块中,就是一个完整的单元测试。 单元测试通过说明我们的函数能够正常工作,要是不过,就说明函数还有bug, 那么就得修改,直到单元测试通过。
单元测试得意义
- 一旦测试通过,以后的修改不会对abs()有影响,如果造成影响,测试就不能通过
- 单元测试,在重构中,也是经常用到的,有了单元测试,就可以放心的重构
mydict.py 代码:
class Dict(dict):def __init__(self, **kw):super().__init__(**kw)def __getattr__(self, key):try:return self[key]except KeyError:raise AttributeError(r"'Dict' object has no attribute '%s'" % key)def __setattr__(self, key, value):self[key] = value
复制代码
编写单元测试
我们需要引入 Python 自带的 unittest 模块,编写 mydict_test 如下:
import unittestfrom learn.two.测试.mydict import Dictclass TestDict(unittest.TestCase):def test_init(self):d = Dict(a = 1, b = '测试')self.assertEqual(d.a, 1)self.assertEqual(d.b, '测试')self.assertTrue(isinstance(d, dict))# def test_key(self): #这部分是测试用例通不过的例子# d = Dict()# d['key'] = 'value'# self.assertSetEqual(d.key, 'value')def test_attr(self):d = Dict()d.key = 'value'self.assertTrue('key' in d)self.assertEqual(d['key'], 'value')def test_keyerror(self):d = Dict()with self.assertRaises(KeyError):value = d['empty']def test_attrerror(self):d = Dict()with self.assertRaises(AttributeError):value = d.emptyif __name__ == '__main__':unittest.main()
复制代码
直接运行 mydict_test.py
Testing started at 22:54 ...
E:\py\venv\Scripts\python.exe "D:\JetBrains\PyCharm 2018.1.1\helpers\pycharm\_jb_unittest_runner.py" --target mydict_test.TestDict
Launching unittests with arguments python -m unittest mydict_test.TestDict in E:\pyplace\learn_python3\learn\two\测试Ran 4 tests in 0.012sOKProcess finished with exit code 0
复制代码
以上这就说明单元测试通过了
下面是测试不通过的示范(将注释的部分放开):
import unittestfrom learn.two.测试.mydict import Dictclass TestDict(unittest.TestCase):def test_init(self):d = Dict(a = 1, b = '测试')self.assertEqual(d.a, 1)self.assertEqual(d.b, '测试')self.assertTrue(isinstance(d, dict))def test_key(self): #这部分是测试用例通不过的例子d = Dict()d['key'] = 'value'self.assertSetEqual(d.key, 'value')def test_attr(self):d = Dict()d.key = 'value'self.assertTrue('key' in d)self.assertEqual(d['key'], 'value')def test_keyerror(self):d = Dict()with self.assertRaises(KeyError):value = d['empty']def test_attrerror(self):d = Dict()with self.assertRaises(AttributeError):value = d.emptyif __name__ == '__main__':unittest.main()
复制代码
运行 mydict_test.py 结果:
Testing started at 22:58 ...
E:\py\venv\Scripts\python.exe "D:\JetBrains\PyCharm 2018.1.1\helpers\pycharm\_jb_unittest_runner.py" --target mydict_test.TestDict
Launching unittests with arguments python -m unittest mydict_test.TestDict in E:\pyplace\learn_python3\learn\two\测试Ran 5 tests in 0.027sFAILED (failures=1)Failure
Traceback (most recent call last):File "D:\python\Python36\lib\unittest\case.py", line 1055, in assertSetEqualdifference1 = set1.difference(set2)
AttributeError: 'str' object has no attribute 'difference'File "D:\python\Python36\lib\unittest\case.py", line 670, in failraise self.failureException(msg)
AssertionError: first argument does not support set difference: 'str' object has no attribute 'difference'
复制代码
可以看到,控制台输入了红色的错误日志,意味着单元测试不通过
单元测试的写法
- 需要编写一个测试类,从 unittest.TestCase 继承
- 以 test 开头的就是测试方法,不是 test 开头的不被认为是测试方法,测试的时候不被执行
- 每个类测试都需要编写 test_xxx() 方法,由于 unittest.TestCase 提供了很多内置的条件判断,我们只需要调用就可以了
常用方法
- 常用的断言就是 assertEqual();
self.assertEqual(abs(-1), 1) # 断言返回的结果与1相等
复制代码
- 另一种是抛出指定类型的错误,比如 d['empty']访问不到存在的Key时,就抛出 KeyError
with self.assertRaises(KeyError):value = d['empty']
复制代码
如果通过 d.empty 访问不存在的 key 时,我们期待抛出 AttributeError:
with self.assertRaises(AttributeError):value = d.empty
复制代码
运行单元测试
- 在编写好的单元测试中,添加以下两行代码,我们就可以运行单元测试
if __name__ == '__main___':unittest.main()
复制代码
- 这样,我们就可以把 mydict_test.py 当作正常的 Python 脚本运行:
$ python mydict_test.py
复制代码
总结
- 写被测试的类
- 继承 unittest.TestCase 写单元测试类
- 通过会显示绿色 Tests passed,并在输出日志中显示 OK
- 不通过显示红色 Tests failed,并在输出日志中显示 FAILD
github地址: https://github.com/shenshizhong/learn_python3
转载于:https://juejin.im/post/5b0ec53df265da0928010bf4
Python 单元测试相关推荐
- Python单元测试--使用装饰器实现测试跳过和预期故障
Python单元测试unittest中提供了一下四种装饰器实现测试跳过和预期故障.(使用Python 2.7.13) 请查考Python手册中: https://docs.python.org/dev ...
- Python单元测试去哪儿了?
如果您正在编写库或应用程序,则单元测试文件会放在哪里? 将测试文件与主应用程序代码分开是很好的选择,但是将它们放在应用程序根目录内的" tests"子目录中是很尴尬的,因为这样会使 ...
- Python单元测试框架Pyunit 的使用
Python单元测试框架Pyunit 使用示例: 1 import unittest 2 3 class Person: 4 def age(self): 5 return 34 6 def name ...
- Python单元测试框架之pytest 3 -- fixtures
From: https://www.cnblogs.com/fnng/p/4769020.html Python单元测试框架之pytest -- fixtures 2015-08-29 13:05 b ...
- Python单元测试最佳实践
Are you ready? ↓↓↓ 今天的课程为< Python单元测试>,内容共分为三个部分:单元测试的概念.工具与方法.Coverage 统计单元测试覆盖率的工具和Mock 简化单元 ...
- python单元测试工具_Python的单元测试工具——unittest小结
简介 unittest是Python的内建模块,是Python单元测试的事实标准,也叫PyUnit.使用unittest之前,先了解如下几个概念: test case:测试用例,可以通过创建unite ...
- Python 单元测试详解
作者:yukkizhang,腾讯 CSIG 测试工程师 本文直接从常用的 Python 单元测试框架出发,分别对几种框架进行了简单的介绍和小结,然后介绍了 Mock 的框架,以及测试报告生成方式,并以 ...
- python单元测试mock_Python单元测试的Mock是怎么回事
单元测试 什么是单元测试, 维基百科上是这么定义的: unit testing is a method by which individual units of source code, sets o ...
- python单元测试示范卷_Python单元测试--Unittest
原标题:Python单元测试--Unittest 什么是单元测试 单元测试是用来对最小可测试单元(如一个函数.一个类或者一个模块)进行检查和验证.尤其是在对代码进行修改或重构后,可以快速准确的定位出现 ...
- python单元测试_python单元测试
http://pyunit.sourceforge.net/ 目录 Python 单元测试框架 .................................................... ...
最新文章
- 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁...
- bat输出log日志操作
- [How TO]-virtualbox下安装ubuntu14.04超详细
- jquery设置输入框为只读_将SQL中几张表设为只读,这是什么奇怪需求?
- .Net Core2.0下使用Dapper遇到的问题
- 洛谷 P1463 [SDOI2005]反素数ant P1820 寻找AP数
- pythonfor循环if中断怎么使用_如何在for循环中只运行一次if?
- setuptools find_packages
- 给已经做好的GHO文件添加密码
- wps html编辑表格,手机wps中怎么编辑表格图文教程
- Jenkins 持续集成CICD
- tp3.2 访问地址url大小写及控制器多个单词组成时url
- 基于单片机的智能交通灯控制系统的设计
- python梦幻西游辅助_GitHub - woshiliushan/mhxy_fz: 一个基于计算机视觉开发的梦幻西游辅助脚本...
- Java编程:将具有父子关系的数据库表数据转换为树形结构,支持无限层级
- 少儿编程--STEMA考试介绍转自STEMA (STEM 能力测试) 考 试 白 皮 书
- java中倒出pdf增加高宽_java – 如何扩展PDF的页面大小以添加水印...
- Jerry Ma:为什么我更喜欢做空?
- 智能密码锁语音提示芯片选型?
- 【英文分词】英文分词处理中遇到的问题
热门文章
- mysql中类型转换
- 在vsphere上迁移某台虚拟机的连锁步骤
- bootstrap今天的学习心得
- need to focus
- io读取一个文件再写入socket技术_Kafka必须掌握的核心技术--为什么吞吐量大、速度快?...
- 零售分析用vba还是python_数据分析?Excel、VBA和Python?营销套路还是大势所趋!...
- 基于Spring的包含特定注解bean的package扫描工具
- 【转】asp.net项目在IE11下出现“__doPostBack”未定义的解决办法
- android sdk 文档导读之一:android 如何绘制 Views
- 引用axiv文献的问题