介绍单元测试的好文:https://mp.weixin.qq.com/s/njxc8GXSlc3z_RibK70ROg

  • setUpModule/tearDownModule:在整个模块的开始和结束时被执行。
  • setUpClass/tearDownClass: 在测试类的开始和结束时被执行。
  • setUp/tearDown:在测试用例的开始与结束时被执行
    注意:setUpClass/tearDownClass的写法稍有不同,首先通过@classmethod进行装饰,其次方法的参数为cls,也可以是别的。每一个上面都要进行装饰
  1. import unittest
  2.  
  3. class MyTest(unittest.TestCase): # 继承unittest.TestCase
  4. def tearDown(self):
  5. # 每个测试用例执行之后做操作
  6. print('')
  7.  
  8. def setUp(self):
  9. # 每个测试用例执行之前做操作
  10. print('')
  11.  
  12. @classmethod
  13. def tearDownClass(self):
  14. # 必须使用 @ classmethod装饰器, 所有test运行完后运行一次
  15. print('')
  16. @classmethod
  17. def setUpClass(self):
  18. # 必须使用@classmethod 装饰器,所有test运行前运行一次
  19. print('')
  20.  
  21. def test_a_run(self):
  22. self.assertEqual(, ) # 测试用例
  23.  
  24. def test_b_run(self):
  25. self.assertEqual(, ) # 测试用例
  26.  
  27. if __name__ == '__main__':
  28. unittest.main()#运行所有的测试用例

unittest框架默认根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以TestAdd会优于TestBdd类被执行,test_aaa()方法会优于test_ccc被执行,因而它并没有按照用例从上到下的顺序执行

如果要测试的函数里包含的函数会连接数据库,或者发起http请求。你不想出发真实的操作,或者你纯粹就是不行调用这个函数。那这时候就用到mock模块了。

==========常用的断言

assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b

assertIsInstance(obj,cls,msg=None)

assertNotIsInstance(obj,cls,msg=None)

可能有人会好奇,为什么不使用内置断言语句 assert,而要额外提供这么多断言方法并使用呢?原因是通过使用 unittest 提供的断言方法,测试框架在运行结束后,能够聚合所有的测试结果并产生信息丰富的测试报告。而直接使用 assert 虽然也可以达到验证被测对象是否符合预期的目的,但在用例出错时,报错信息不够丰富

  1. unittest 支持用例自动(递归)发现:
  2.  
  3. 默认发现当前目录下所有符合 test*.py 测试用例
  4.  
  5. 使用 python -m unittest python -m unittest discover
  6.  
  7. 通过 -s 参数指定要自动发现的目录, -p 参数指定用例文件的名称模式
  8.  
  9. python -m unittest discover -s project_directory -p "test_*.py"
  10.  
  11. 通过位置参数指定自动发现的目录和用例文件的名称模式
  12.  
  13. python -m unittest discover project_directory "test_*.py"
  14.  
  15. unittest 支持执行指定用例:
  16.  
  17. 指定测试模块
  18.  
  19. python -m unittest test_module1 test_module2
  20.  
  21. 指定测试类
  22.  
  23. python -m unittest test_module.TestClass
  24.  
  25. 指定测试方法
  26.  
  27. python -m unittest test_module.TestClass.test_method
  28.  
  29. 指定测试文件路径(仅 Python
  30.  
  31. python -m unittest tests/test_something.py

如果我们希望每个测试方法之前前后分别执行测试前置和清理方法,那么需要在测试类中定义好 setUp()[11] 和 tearDown()[12]

如果我们希望单个测试类中只执行一次前置方法,再执行该测试类中的所有测试,最后执行一次清理方法,那么需要在测试类中定义好 setUpClass()[13] 和 tearDownClass()[14]

如果我们希望单个测试模块中只执行一次前置方法,再执行该模块中所有测试类的所有测试,最后执行一次清理方法,那么需要在测试模块中定义好 setUpModule()[15] 和 tearDownModule()[16]

==============

安装 HTMLTestRunner,使用执行测试用例就会生成一个html的测试报告,里面会有每个测试用例的执行结果

  1. import HtmlTestRunner
  2. import unittest
  3. class MyTest(unittest.TestCase):#继承unittest.TestCase
  4. def tearDown(self):
  5. #每个测试用例执行之后做操作
  6. print('')
  7. def setUp(self):
  8. #每个测试用例执行之前做操作
  9. print()
  10. def test_run(self):
  11. # self.assertEqual(,)
  12. self.assertIs(,)
  13. #测试用例
  14. def test_run2(self):
  15. # self.assertEqual(,)
  16. self.assertIs(,)
  17. #测试用例
  18. def test_run3(self):
  19. # self.assertEqual(,)
  20. self.assertIs(,)
  21. #测试用例
  22. def test_run1(self):
  23. # self.assertEqual(,)
  24. self.assertIs(,)
  25. #测试用例
  26. if __name__ == '__main__':
  27. test_suite = unittest.TestSuite()#创建一个测试集合
  28. test_suite.addTest(MyTest('test_run1'))#测试套件中添加测试用例
  29. #test_suite.addTest(unittest.makeSuite(MyTest))#使用makeSuite方法添加所有的测试方法
  30. fp = open('res.html','wb')#打开一个保存结果的html文件
  31. runner =HtmlTestRunner.HTMLTestRunner()#生成执行用例的对象
    runner.run(test_suite) #执行测试套件

==============找到当前目录下所有测试用例

  1. import unittest
    import HtmlTestRunner
    if __name__ == '__main__':
    suite = unittest.TestSuite()#创建测试套件
    all_cases = unittest.defaultTestLoader.discover('.','test_*.py')
    #找到某个目录下所有的以test开头的Python文件里面的测试用例
    for case in all_cases:
    suite.addTests(case)#把所有的测试用例添加进来
    myrunner = HtmlTestRunner.HTMLTestRunner()
    myrunner.run(suite)
    print 'over'

discover()方法中的start_dir只能加载当前目录下的.py文件,如果加载子目录下的.py文件,需在每个子目录下放一个_init_.py文件。

  • discover(start_dir,pattern='test*.py',top_level_dir=None)
  • start_dir:要测试的模块名或测试用例的目录
  • pattern='test.py':表示用例文件名的匹配原则,此处文件名以“test”开头的“.py”类型的文件,“”表示任意多个字符。
  • top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为None.

===================

python 杂记-unittest的更多相关文章

  1. python单元测试unittest

    单元测试作为任何语言的开发者都应该是必要的,因为时隔数月后再回来调试自己的复杂程序时,其实也是很崩溃的事情.虽然会很快熟悉内容,但是修改和 调试将是一件痛苦的事情,如果你在修改了代码后出现问题的话,而 ...

  2. Python中unittest采用不同的参数组合产生独立的test case

    我们在使用Python的unittest做自动化或者单元测试时,有时需要一个测试用例根据不同的输入.输出组合而执行多次,但是,unittest中一个用例只能有一组参数组合执行,如果采用循环的方式,在生 ...

  3. 老李分享:开发python的unittest结果输出样式

    老李分享:开发python的unittest结果输出样式   Python的unittest结果命令行输出,格式比较乱.为了提高格式输出的可读性,实现可以不同的颜色标识.所以准备扩展Python的un ...

  4. [转]python单元测试unittest

    单元测试作为任何语言的开发者都应该是必要的,因为时隔数月后再回来调试自己的复杂程序时,其实也是很崩溃的事情.虽然会很快熟悉内容,但是修改和调试将是一件痛苦的事情,如果你在修改了代码后出现问题的话,而单 ...

  5. python:unittest之跳过测试和预期失败的用例

    在利用单元测试框架执行测试用例的过程中,有时只需要执行一部分用例,或者跳过某些暂不需要执行的用例,python的unittest框架就内置这样的功能. 前面的博客介绍了unittest框架的测试用例加 ...

  6. 常见的python的unittest用法

    python的unittest好处是通过python脚本编写用例,每个用例可以单独调试初始化和清理动作,因为都是用例都是代码所以调试起来也很方便:它的缺点是得先学会python,难易程度见仁见智吧,对 ...

  7. Python之unittest测试代码

    前言 编写函数或者类时,还可以为其编写测试.通过测试,可确定代码面对各种输入都能够按要求的那样工作. 本次我将介绍如何使用Python模块unittest中的工具来测试代码. 测试函数 首先我们先编写 ...

  8. Python单元测试unittest - 单元测试框架

    一.unittest简介 unitest单元测试框架最初是有JUnit的启发,它支持测试自动化,共享测试的设置和关闭代码,将测试聚合到集合中,以及测试与报告框架的独立性. 二.unittest相关概念 ...

  9. Python+Selenium+Unittest+Ddt+HTMLReport分布式数据驱动自动化测试框架结构

    1.Business:公共业务模块,如登录模块,可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_pa ...

随机推荐

  1. Image Perimeters

    Description 给出一张由"x"和"."组成的矩阵.每个"x"可以向上下左右及两个斜对角进行连通,请问由某个点开始的"x& ...

  2. CSS float属性

    表示向左浮动,比如多个div在一个页面上,默认情况是:一行一个div,但是只要在div的css中使用float:left,可以使一行有多个div,这样可以把网页划分成很多块,但是使用该属性会影响后面的 ...

  3. Node.js安装windows环境

    一.安装环境 1.本机系统:Windows 10 Pro(64位)2.Node.js:v6.9.2LTS(64位) 二.安装Node.js步骤 1.下载对应你系统的Node.js版本:https:// ...

  4. Tp5.1 管理后台开发纪要

    1. tp5.1 对网页是有缓存机制的 E:\phpStudy\PHPTutorial\WWW\NewAdmin\thinkphp\library\think\Template.php 下displa ...

  5. QT加载自带字体

    #include <QCoreApplication> #include <QStringList> #include <QFontDatabase> #inclu ...

  6. Mybatis整合(Redis、Ehcache)实现二级缓存

    目的: Mybatis整合Ehcache实现二级缓存 Mybatis整合Redis实现二级缓存 Mybatis整合ehcache实现二级缓存 ssm中整合ehcache 在POM中导入相关依赖 < ...

  7. 论坛中的问题:47(等待类型为MSSEARCH的进程被KILL之后,一直处于回滚状态)

    原文:论坛中的问题:47(等待类型为MSSEARCH的进程被KILL之后,一直处于回滚状态) 求助:等待类型为MSSEARCH的进程被KILL之后,一直处于回滚状态 http://bbs.csdn.n ...

  8. 在论坛中出现的比较难的sql问题:12(递归问题2 拆分字符串)

    原文:在论坛中出现的比较难的sql问题:12(递归问题2 拆分字符串) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  9. mybatis获取刚刚插入到数据库的数据的id(转载)

    原文地址:https://blog.csdn.net/hehuihh/article/details/82800739 我用的是第一种写法,直接把代码copy到insert标签里(id要是自增id) ...

  10. centos安装rocketMQ

    1.下载安装包 http://rocketmq.apache.org/release_notes/ 这里选择 4.4.0 版本,点击进去 可以选择源码包或者二进制文件,这里选择二进制文件(ps:如果选 ...