单元测试

  unittest单元测试是基于java的JUnit思想框架开发出来的测试框架

使用示例1

  1. import unittest
  2. class Mytest1(unittest.TestCase):
  3. def test_a(self):#用例必须已test开头
  4. self.assertEqual(1,1,msg='错误提示信息,如果校验失败,出现这个')
  5. print('a')
  6. def test_c(self):
  7. self.assertEqual(1,2,msg='失败')#如果校验结果不正确,不会执行后面的代码
  8. print('c')#这条代码不会执行
  9. def test_z(self):#函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z
  10. self.assertEqual(4,4)
  11. print('z')
  12. def test_G(self):
  13. self.assertEqual(3,3)
  14. print('G')
  15. if __name__ == "__main__":
  16. suite = unittest.TestSuite()
  17. #suite.addTest(Mytest1('test_a')) #添加一个测试类中的一个方法
  18. testlist = [Mytest1('test_c'),Mytest1('test_d')]
  19. suite.addTests(testlist) #加载多个测试类的方法
  20. unittest.TextTestRunner().run(suite)

使用示例2

  1. import unittest
  2. class Mytest1(unittest.TestCase):
  3. def test_a(self):#用例必须已test开头
  4. self.assertEqual(1,1,msg='错误提示信息,如果校验失败,出现这个')
  5. print('a')
  6. def test_c(self):
  7. self.assertEqual(1,2,msg='失败')#如果校验结果不正确,不会执行后面的代码
  8. print('c')#这条代码不会执行
  9. def test_z(self):#函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z
  10. self.assertEqual(4,4)
  11. print('z')
  12. def test_G(self):
  13. self.assertEqual(3,3)
  14. print('G')
  15. if __name__ == "__main__":
  16. #suite = unittest.TestLoader().loadTestsFromTestCase(Mytest1) #指定类的加载
  17. #suite = unittest.TestLoader().loadTestsFromName('a') #导入模块名
  18. #suite = unittest.TestLoader().loadTestsFromName('a.Mytest1.test_a') #也可以这样导入
  19.  
  20. test_list = ['a.Mytest1.test_a','a.Mytest1.test_z']
  21. suite = unittest.TestLoader().loadTestsFromNames(test_list) #导入多个模块
  22. unittest.TextTestRunner().run(suite)

跳过skip的使用

  1. import unittest
  2. a = 1
  3. b = 2
  4. class Mytest1(unittest.TestCase):
  5. @unittest.skip('该函数已经弃用,跳过该方法') #表示跳过test_a函数,不会被执行
  6. def test_a(self):#用例必须已test开头
  7. self.assertEqual(1,1,msg='错误提示信息,如果校验失败,出现这个')
  8. print('a')
  9. @unittest.skipIf(b>a,'判断后执行') #如果b大于a,跳过执行,反之执行, skipUnless是skip相反的方法
  10. def test_c(self):
  11. self.assertEqual(1,2,msg='失败')#如果校验结果不正确,不会执行后面的代码
  12. print('c')#这条代码不会执行
  13. @unittest.expectedFailure #不用执行,直接为false
  14. def test_z(self):#函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z
  15. self.assertEqual(4,4)
  16. print('z')
  17. def test_G(self):
  18. self.assertEqual(3,3)
  19. print('G')
  20. if __name__ == "__main__":
  21. unittest.main() #运行所有测试用例
  22.  
  23. #unittest命令行方式
  24. #python -m unittest a b 执行多个单元测试模块
  25. #python -m unitest a.test_a b.test_b 执行模块类或者方法

HTMLTestRunner以及美化报告

  1. import unittest
  2. import HTMLTestRunner
  3. class Mytest1(unittest.TestCase):
  4. def test_a(self):#用例必须已test开头
  5. self.assertEqual(1,1,msg='错误提示信息,如果校验失败,出现这个')
  6. print('a')
  7. def test_c(self):
  8. self.assertEqual(1,2,msg='失败')#如果校验结果不正确,不会执行后面的代码
  9. print('c')#这条代码不会执行
  10. def test_z(self):#函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z
  11. self.assertEqual(4,4)
  12. print('z')
  13. def test_G(self):
  14. self.assertEqual(3,3)
  15. print('G')
  16. #unittest.main()#运行所有函数
  17. #unittest.defaultTestLoader.discover()#可以指定一个文件夹,在指定目录下找到测试用例
  18. f = open('a.html','wb')#创建文件
  19. runner = HTMLTestRunner.HTMLTestRunner(f,title='rainbol_test',description='这是一个接口测试用例')#实例化用例报告,并传入文件,title标题,description描述
  20. suite = unittest.makeSuite(Mytest1)#把要生成报告的类变成一个测试集合,
  21. runner.run(suite)#运行测试用例
  22.  
  23. import BeautifulReport
  24. #美化报告
  25. class Mytest2(unittest.TestCase):
  26. def test_a(self):
  27. '''test_a用例'''#添加用例描述,可以在测试报告中显示
  28. self.assertEqual(1,1,msg='错误提示信息,如果校验失败,出现这个')
  29. def test_c(self):
  30. '''test_c用例'''
  31. self.assertEqual(1,2,msg='失败')
  32. print('c')
  33. def test_z(self):
  34. '''test_z用例'''
  35. self.assertEqual(4,4)
  36. print('z')
  37.  
  38. new_suite= unittest.makeSuite(Mytest2)
  39. report = BeautifulReport.BeautifulReport(new_suite)
  40. report.report(filename='new_report.html',description='这个是新接口测试报告')
  41.  
  42. class Mytest3(unittest.TestCase):
  43. def setUp(self):#每条用例前执行,比如检测接口连接是否正常
  44. print('setUp')
  45. def tearDown(self):#每条用例后执行,比如清理缓存,cookie,redis的信息
  46. print('tearDown')
  47. @classmethod  #注意加入装饰器
  48. def setUpClass(cls):#这个类里面的用例先执行,比如连接数据库
  49. print('setUpClass')
  50. @classmethod  #注意加入装饰器
  51. def tearDownClass(cls):#这个类里面的用例最后执行,比如关闭数据库
  52. print('tearDownClass')

  53.   def test_c(self):
  54. '''test_c用例'''
  55. self.assertEqual(1, 2, msg='失败')
  56. print('c')
  57. def test_z(self):
  58. '''test_z用例'''
  59. self.assertEqual(4,4)
  60. print('z')
  61. unittest.main()
  62. #执行顺序 setUpClass→setUp→test_c→tearDown→setUp→test_z→tearDown→tearDownClass

 

注意点

  1. import unittest
  2.  
  3. #python不支持多函数传参的方式用在unittest上
  4. class Mytest2(unittest.TestCase):
  5. def test_a(self):
  6. self.a = 2
  7. self.assertEqual(1, 1, msg='错误提示信息,如果校验失败,出现这个')
  8. print('')
  9.  
  10. def test_c(self):
  11. print(self.a)
  12. self.assertEqual(1, 2, msg='失败')
  13. print('')
  14. #这样写运行就会报找不到self.a
  1.   @classmethod
      def setUpClass(cls):
      cls.res = '1'
      print('setUpClass')
  1.   def test_d(self):
        print(self.res) #但是这些除外,可以找到

数据驱动ddt  pip install ddt

  1. #数据驱动ddt
  2. import ddt
  3. import unittest
  4. @ddt.ddt
  5. class Mytest1(unittest.TestCase):
  6. @ddt.data(*[x for x in range(2)])
  7. def test_a(self,value):
  8. self.assertEqual(10,value,'xx')
  9. #如上执行我们可以看到只要几行代码就可以把重复的测试用例,只是参数不同,把参数传递给一个方法中执行,运行的结果实现了多个用例的单元测试
  10.  
  11. @ddt.data([1,2,3],[2,4,6])
  12. @ddt.unpack #一条以上数据要用unpack
  13. def test_b(self,value1,value2,value3):
  14. self.assertEqual(value1+value2,value3)
  15. if __name__ == "__main__":
  16. unittest.main()

单元测试覆盖率

  度量的方式

    1.语句覆盖:被度量的代码中每个都执行到

    2.判定覆盖:被称为分支覆盖,即每个分支都会被测到

    3.条件覆盖:如果在判断覆盖中又存在多个表达式的情况,也要被测试到,如 if a = 1 and b = 2

    其他等等...

  coverage的使用(语句覆盖)

    下载

      pip install coverage

    帮助

      coverage help

    运行

      coverage run

    demo实例

  1. #demo.py
  2.  
  3. import unittest
  4.  
  5. class Mytest1(unittest.TestCase):
  6. def test_a(self): # 用例必须已test开头
  7. self.assertEqual(1, 1, msg='错误提示信息,如果校验失败,出现这个')
  8. print('a')
  9.  
  10. def test_c(self):
  11. self.assertEqual(1, 1, msg='失败') # 如果校验结果不正确,不会执行后面的代码
  12. print('c') # 这条代码不会执行
  13.  
  14. def test_z(self): # 函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z
  15. self.assertEqual(4, 4)
  16. print('z')
  17.  
  18. def test_G(self):
  19. self.assertEqual(3, 3)
  20. print('G')
  21.  
  22. def other1(self):
  23. print('其他的方法')
  24.  
  25. def other2(self):
  26. print('其他的方法')
  27.  
  28. def other3(self):
  29. print('其他的方法')
  30.  
  31. def other4(self):
  32. print('其他的方法')
  33.  
  34. class Mytest2(unittest.TestCase):
  35. def test_a(self): # 用例必须已test开头
  36. self.assertEqual(1, 1, msg='错误提示信息,如果校验失败,出现这个')
  37. print('a')
  38.  
  39. def test_c(self):
  40. self.assertEqual(1, 1, msg='失败') # 如果校验结果不正确,不会执行后面的代码
  41. print('c') # 这条代码不会执行
  42.  
  43. def test_z(self): # 函数执行优先级:按照函数的首字母顺序依次执行A-Z-a-z
  44. self.assertEqual(4, 4)
  45. print('z')
  46.  
  47. def test_G(self):
  48. self.assertEqual(3, 3)
  49. print('G')
  50.  
  51. if __name__ == '__main__':
  52. unittest.main()

    coverage run demo.py #运行单测代码

    coverage report #生成命令行结果

    coverage html -d xxx.html        #生成html文件   -d 指定html名称

可以看到没有执行的代码被高亮出来

    coverage xml #生成xml文件

  1. # 封装api的方式
  2. import unittest
  3. import coverage
  4.  
  5. cover = coverage.coverage(source=['test_demo'])
  6. cover.start()
  7. suite = unittest.defaultTestLoader.discover(start_dir='.', pattern='test_*.py')
  8. unittest.TextTestRunner().run(suite)
  9.  
  10. cover.stop()
  11. cover.report()
  12. cover.html_report(directory='report')

版权声明:本文原创发表于 博客园,作者为 RainBol本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。

unittest单元测试笔记的更多相关文章

  1. Python+Selenium学习笔记16 - unittest单元测试框架

    unittest单元测试框架包括 Test Case,  Test Suite, Test Runner, Test Fixture Test Cases 组成Test Suite, Test Run ...

  2. python学习笔记(十五)-unittest单元测试的一个框架

    unittest 单元测试的一个框架什么框架 一堆工具的集合. TestCase TestSuite 测试套件,多个用例在一起 TestLoader是用来加载TestCase到TestSuite中的 ...

  3. Node.js的UnitTest单元测试

    body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; } 在专业化的软件开发过程中,无论什么平台语言,现在都需要UnitTes ...

  4. 我的TDD实践---UnitTest单元测试

    我的TDD实践---UnitTest单元测试 “我的TDD实践”系列之UnitTest单元测试 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则 ...

  5. unittest单元测试框架总结

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...

  6. unittest单元测试框架详解

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...

  7. Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型

    1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...

  8. unittest单元测试框架

    unittest单元测试框架 概述: 单元测试框架主要用来完成以下三件事: 提供用例组织与执行:当测试用例只有几条时,可以不必考虑用例的组织,但是当用例达到成百上千条时,大量的用例堆砌在一起,就产生了 ...

  9. python unittest单元测试

    unittest单元测试框架:包含测试用例编写.测试收集\测试用例加载.执行测试用例.生成测试用例报告,同时,更提供了添加断言,异常处理等. 第一:创建测试类,创建测试用例 第二:收集测试用例,加载测 ...

随机推荐

  1. QT学习之usb摄像头采集(Opencv+QT)[cvCapture,IplImage,QImage]

    参考自:http://blog.chinaunix.net/uid-23381466-id-3826748.html 将Opencv中的cvCaptureFromCAM不断获得摄像头采集到的图像数据, ...

  2. 如何在Java中编写一个线程安全的方法?

    线程安全总是与多线程有关的,即一个线程访问或维护数据时遭到了其它线程的“破坏”,为了不被破坏,就要保持所维护变量的原子性: 1 局部变量总是线程安全的,因为每个线程都有自己的栈,而在方法中声明的变量都 ...

  3. js复制json对象

    var newJson = JSON.parse(JSON.stringify(json对象));

  4. JIRA+JIRA Agile敏捷项目管理工具

    jira插件下载地址 http://www.confluence.cn/pages/viewpage.action?pageId=1671327 下载GreenHopper插件 安装Jira-agil ...

  5. C++ 中三种继承方式的理解

    一.公有继承(public inheritance) 1.概念:当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可以直接访问. 实验一下:   我们用代 ...

  6. 如何创建etcd双向通信证书

    # 安装证书生成软件 wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/bin/cfssl wget https://pkg.cfss ...

  7. vue 等比例截图组件,支持缩放和旋转

    <template> <div class="crop-image" :style="wrapStyle"> <img :src= ...

  8. 利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4

    利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4 以前看视频的时候,直接找到 video标签,查看视频地址,然后下载下来.. 后来发现,好多 video 标签打开元素审查,如下 ...

  9. hdu 2586 欧拉序+rmq 求lca

    题意:求树上任意两点的距离 先说下欧拉序 对这颗树来说 欧拉序为 ABDBEGBACFHFCA 那欧拉序有啥用 这里先说第一个作用 求lca 对于一个欧拉序列,我们要求的两个点在欧拉序中的第一个位置之 ...

  10. Mybatis的实现原理

    在spring启动的时候,spring会根据我们配置的有关mapper.xml的路径加载此路径下的xml文件,得到一个List<Resource>的集合,然后将这个集合转化成Resourc ...