python - unittest 单元测试学习

单元测试

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

比如对Python中的abs 的测试

输入正数: 比如 1, 2, 3, 返回值不变

输入负数: 比如 -1, -2, -3, 返回值是本身取反

输入0: 比如 0, 返回值0

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

如果单元测试通过,说明我们测试的这个函数能够正常工作。如果单元测试不通过,要么函数有bug,要么测试条件输入不正确,总之,需要修复使单元测试能够通过。

单元测试通过后有什么意义呢?如果我们对abs()函数代码做了修改,只需要再跑一遍单元测试,如果通过,说明我们的修改不会对abs()函数原有的行为造成影响,如果测试不通过,说明我们的修改与原有行为不一致,要么修改代码,要么修改测试。

这种以测试为驱动的开发模式最大的好处就是确保一个程序模块的行为符合我们设计的测试用例。在将来修改的时候,可以极大程度地保证该模块行为仍然是正确的。

我们来编写一个Dict类,这个类的行为和dict一致,但是可以通过属性来访问,用起来就像下面这样:

>>> d = Dict(a=1, b=2)
>>> d[‘a‘]
1
>>> d.a
1

Dict 类的具体实现:

 1 class Dict(dict):
 2     def __init__(self,**kw):
 3         super(Dict,self).__init__(**kw)
 4
 5     def __getattr__(self, key):
 6         try:
 7             return self[key]
 8         except KeyError:
 9             raise AttributeError(r"‘Dict‘ object has no attribute ‘%s‘" % key)
10
11     def __setattr__(self, key, value):
12         self[key] = value

unittest.TestCase

编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承。

以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行。

对每一类测试都需要编写一个test_xxx()方法。由于unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。最常用的断言就是assertEquals():

1 self.assertEquals(abs(-1), 1) # 断言函数返回的结果与1相等

另一种重要的断言就是期待抛出指定类型的Error,比如通过d[‘empty‘]访问不存在的key时,断言会抛出KeyError:

1 with self.assertRaises(KeyError):
2     value = d[‘empty‘]

而通过d.empty访问不存在的key时,我们期待抛出AttributeError:

1 with self.assertRaises(AttributeError):
2     value = d.empty

setUp与tearDown 可以在单元测试中编写两个特殊的setUp()和tearDown()方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。

setUp()和tearDown()方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码:

1 class TestDict(unittest.TestCase):
2
3     def setUp(self):
4         print ‘setUp...‘
5
6     def tearDown(self):
7         print ‘tearDown...‘

可以再次运行测试看看每个测试方法调用前后是否会打印出setUp...和tearDown...。

测试类的具体实现:

 1 import unittest
 2 from Dict import Dict
 3
 4 class TestDict(unittest.TestCase):
 5
 6     def setUp(self):
 7         print ‘setUp...‘
 8
 9     def tearDown(self):
10         print ‘tearDown...‘
11
12     def test_init(self):
13         d = Dict(a=1, b=‘test‘)
14         self.assertEquals(d.a, 1)
15         self.assertEquals(d.b, ‘test‘)
16         self.assertTrue(isinstance(d, dict))
17
18     def test_key(self):
19         d = Dict()
20         d[‘key‘] = ‘value‘
21         self.assertEquals(d.key, ‘value‘)
22
23     def test_attr(self):
24         d = Dict()
25         d.key = ‘value‘
26         self.assertTrue(‘key‘ in d)
27         self.assertEquals(d[‘key‘], ‘value‘)
28
29     def test_keyerror(self):
30         d = Dict()
31         with self.assertRaises(KeyError):
32             value = d[‘empty‘]
33
34     def test_attrerror(self):
35         d = Dict()
36         with self.assertRaises(AttributeError):
37             value = d.empty
38
39 if __name__ == ‘__main__‘:
40     unittest.main()

注意:

单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。

单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。

单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug。

单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug。

版权所有,文章来源:http://www.cnblogs.com/sagecheng/p/5960950.html

个人能力有限,本文内容仅供学习、探讨,欢迎指正、交流。

.NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引

参考资料:

python 基础教程:http://www.runoob.com/python/python-tutorial.html

 
时间: 2024-10-12 02:40:44

python - unittest 单元测试学习的相关文章

26 Python - unittest单元测试

unittest单元测试 01单元测试概述 02 测试代码组织 略 03常见的断言方法 04类与测试装置 定义一个计算器类 测试类 改进后的测试类 测试类经常使用setup方法和tearDown方法一个用于测试前使用,一个用于测试后使用 如setUp可以用于测试类的实例化,tearDown可以用于关闭文件或数据库的内容 原文地址:https://www.cnblogs.com/yijiexi/p/11140588.html

python unittest单元测试

单元测试作为任何语言的开发者都应该是必要的,因为时隔数月后再回来调试自己的复杂程序时,其实也是很崩溃的事情.虽然会很快熟悉内容,但是修改和调试将是一件痛苦的事情,如果你在修改了代码后出现问题的话,而单元测试可以帮助我们很快准确的定位到问题的位置,出现问题的模块和单元.所以这是一件很愉快的事情,因为我们知道其它修改或没有修改的地方仍然是正常工作的,而我们目前的唯一问题就是搞定眼前这个有点问题的“家伙”.所以工作会在轻松中开始,并且很快将会结束,因为你已经知道很多信息了. 单元测试自然是对程序中最小

python - unittest - 单元测试

# -*- coding:utf-8 -*- '''@project: jiaxy@author: Jimmy@file: study_unittest.py@ide: PyCharm Community Edition@time: 2018-11-24 09:00@blog: https://www.cnblogs.com/gotesting/ ''' ''' 单元测试框架:unittest . pytest 单元测试谁做的? --- 开发单元测试是干嘛? --- 对单个模块进行的测试,直到没

python unittest单元测试框架-2discover

基于TestLoader提供的discover方法实现用例执行 当用例达达到数十条后,在runtest.py文件中通过addTest()添加/删除测试用例就非常麻烦.此时可以使用discover方法找到目录下所有测试模块,并可以递归查到子目录下的测试模块,只有匹配到文件名才能被加载.如果启动的不是顶层目录,那么顶层目录必须单独指定. discover(start_dir, pattern="test*.py", top_level_dir=None) #start_dir:要测试的模块

Python+Selenium ----unittest单元测试框架

unittest是一个单元测试框架,是Python编程的单元测试框架.有时候,也做叫做"PyUnit",是Junit的Python语言版本.这里了解下,Junit是Java语言的单元测试框架,Java还有一个很好用的单元测试框架叫TestNG,本系列只学习Python,所以只需要unittest是Python里的一个单元测试框架就可以了.       unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是test,也就是一个测试用例.要了解

selenium + python自动化测试unittest框架学习(二)

1.unittest单元测试框架文件结构 unittest是python单元测试框架之一,unittest测试框架的主要文件结构: File >report >all_case.py >test_case >__init__.py >test_case1..... >public >__init__.py >login.py >loginout.py test_case文件夹主要存放测试用例,且测试用例命名以test_开头 public文件夹是test

selenium + python自动化测试unittest框架学习(一)selenium原理及应用

unittest框架的学习得益于虫师的<selenium+python自动化实践>这一书,该书讲得很详细,大家可以去看下,我也只学到一点点用于工作中,闲暇时记录下自己所学才能更加印象深刻.unittest框架学习需要掌握以下知识点: (1)Selenium原理及工具使用 (2)webdriver元素定位,id,name,class name,css seletor,xpath (3)python语言基础,模块,参数化,语言,装饰器 (4)unittest框架认识及学习:模块化,断言,参数化,数

python unittest 测试所有相关单元测试

python unittest 测试所有相关单元测试 python -m unittest discover project_directory "ut_*.py" 原文地址:https://www.cnblogs.com/bingwork/p/9714318.html

Selenium基于Python web自动化基础二 -- 免登录、等待及unittest单元测试框架

一.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去掉验证码 1.手动在请求中添加cookies信息 1 url = "http://www.baidu.com" 2 driver = webdriver.Firefox() 3 driver.get(url) 4 time.sleep(3) 5 #添加cookies的方式 6 7 c1 =