测试

测试用例

对函数 abs(),这个函数的作用就是取绝对值,我们可以编写以下几个测试用例:

  1. 输入正数,比如 1、 1.5、 0.99,期待返回值与输入相同
  2. 输入负数,比如 -1、 -1.5、 -0.99, 期待返回值与输入值相反
  3. 输入0, 期待返回0;
  4. 输入非数值类型,比如 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
复制代码

总结

  1. 写被测试的类
  2. 继承 unittest.TestCase 写单元测试类
  3. 通过会显示绿色 Tests passed,并在输出日志中显示 OK
  4. 不通过显示红色 Tests failed,并在输出日志中显示 FAILD

github地址: https://github.com/shenshizhong/learn_python3

转载于:https://juejin.im/post/5b0ec53df265da0928010bf4

Python 单元测试相关推荐

  1. Python单元测试--使用装饰器实现测试跳过和预期故障

    Python单元测试unittest中提供了一下四种装饰器实现测试跳过和预期故障.(使用Python 2.7.13) 请查考Python手册中: https://docs.python.org/dev ...

  2. Python单元测试去哪儿了?

    如果您正在编写库或应用程序,则单元测试文件会放在哪里? 将测试文件与主应用程序代码分开是很好的选择,但是将它们放在应用程序根目录内的" tests"子目录中是很尴尬的,因为这样会使 ...

  3. Python单元测试框架Pyunit 的使用

    Python单元测试框架Pyunit 使用示例: 1 import unittest 2 3 class Person: 4 def age(self): 5 return 34 6 def name ...

  4. Python单元测试框架之pytest 3 -- fixtures

    From: https://www.cnblogs.com/fnng/p/4769020.html Python单元测试框架之pytest -- fixtures 2015-08-29 13:05 b ...

  5. Python单元测试最佳实践

    Are you ready? ↓↓↓ 今天的课程为< Python单元测试>,内容共分为三个部分:单元测试的概念.工具与方法.Coverage 统计单元测试覆盖率的工具和Mock 简化单元 ...

  6. python单元测试工具_Python的单元测试工具——unittest小结

    简介 unittest是Python的内建模块,是Python单元测试的事实标准,也叫PyUnit.使用unittest之前,先了解如下几个概念: test case:测试用例,可以通过创建unite ...

  7. Python 单元测试详解

    作者:yukkizhang,腾讯 CSIG 测试工程师 本文直接从常用的 Python 单元测试框架出发,分别对几种框架进行了简单的介绍和小结,然后介绍了 Mock 的框架,以及测试报告生成方式,并以 ...

  8. python单元测试mock_Python单元测试的Mock是怎么回事

    单元测试 什么是单元测试, 维基百科上是这么定义的: unit testing is a method by which individual units of source code, sets o ...

  9. python单元测试示范卷_Python单元测试--Unittest

    原标题:Python单元测试--Unittest 什么是单元测试 单元测试是用来对最小可测试单元(如一个函数.一个类或者一个模块)进行检查和验证.尤其是在对代码进行修改或重构后,可以快速准确的定位出现 ...

  10. python单元测试_python单元测试

    http://pyunit.sourceforge.net/ 目录 Python 单元测试框架 .................................................... ...

最新文章

  1. 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁...
  2. bat输出log日志操作
  3. [How TO]-virtualbox下安装ubuntu14.04超详细
  4. jquery设置输入框为只读_将SQL中几张表设为只读,这是什么奇怪需求?
  5. .Net Core2.0下使用Dapper遇到的问题
  6. 洛谷 P1463 [SDOI2005]反素数ant P1820 寻找AP数
  7. pythonfor循环if中断怎么使用_如何在for循环中只运行一次if?
  8. setuptools find_packages
  9. 给已经做好的GHO文件添加密码
  10. wps html编辑表格,手机wps中怎么编辑表格图文教程
  11. Jenkins 持续集成CICD
  12. tp3.2 访问地址url大小写及控制器多个单词组成时url
  13. 基于单片机的智能交通灯控制系统的设计
  14. python梦幻西游辅助_GitHub - woshiliushan/mhxy_fz: 一个基于计算机视觉开发的梦幻西游辅助脚本...
  15. Java编程:将具有父子关系的数据库表数据转换为树形结构,支持无限层级
  16. 少儿编程--STEMA考试介绍转自STEMA (STEM 能力测试) 考 试 白 皮 书
  17. java中倒出pdf增加高宽_java – 如何扩展PDF的页面大小以添加水印...
  18. Jerry Ma:为什么我更喜欢做空?
  19. 智能密码锁语音提示芯片选型?
  20. 【英文分词】英文分词处理中遇到的问题

热门文章

  1. mysql中类型转换
  2. 在vsphere上迁移某台虚拟机的连锁步骤
  3. bootstrap今天的学习心得
  4. need to focus
  5. io读取一个文件再写入socket技术_Kafka必须掌握的核心技术--为什么吞吐量大、速度快?...
  6. 零售分析用vba还是python_数据分析?Excel、VBA和Python?营销套路还是大势所趋!...
  7. 基于Spring的包含特定注解bean的package扫描工具
  8. 【转】asp.net项目在IE11下出现“__doPostBack”未定义的解决办法
  9. android sdk 文档导读之一:android 如何绘制 Views
  10. 引用axiv文献的问题