单元测试在保证开发效率、可维护性和软件质量等方面有很重要的地位,所谓的单元测试,就是对一个类,一个模块或者一个函数进行正确性检测的一种测试方式。

这里主要是就应用 python + unitest 做单元测试做的一些学习笔记。

Unittest 提供了test cases, test suites, test fixtures,test runner:

  • test case :通过继承TestCase类,我们可以创建一个test,或者一组tests
  • test suites : 测试套件, 使用时要将test case 装载到测试套件里
  • test fixtures : setup + test case + teardown,每个test case执行的时候都会运行setUp->test_case->tearDown ,因此setUp 和 tearDown 可以用来做环境的初始化。例如,写一个有关数据操作的类,setUp放连接数据库,tearDown 放关闭数据库连接。

一、unittest.main() 的使用

所有的test case 要以test开头,例如 def test_pass_case(self)

具体的单元测试例子如下:

  1. import unittest
  2. def calc(x,y):
  3. return x + y
  4.  
  5. class TestCalc(unittest.TestCase):
  6. def test_pass_case(self):
  7. '''这是通过的测试用例'''
  8. print('这个是通过用例')
  9. res = calc(1,2)
  10. self.assertEqual(3,res)
  11. self.assertNotEqual(2,3)
  12. def setUp(self):#每个用例执行前都会执行它
  13. print('我是setUp')
  14. def tearDown(self):#每个用例运行之后都会执行它
  15. print('我是tearDown')
  16.  
  17. @classmethod
  18. def setUpClass(cls):#所有的用例执行之前执行一次,setUp()前
  19. print('我是setupClass')#所有的用例都运行完之后执行一次,setDown
  20. @classmethod
  21. def tearDownClass(cls):#所有的用例执行之后执行一次,setDown()后
  22. print('我是teardownClass')
  23. def test_a(self):
  24. '''这是普通的测试用例'''
  25. print('a')
  26. def test_fail_case(self):
  27. '''这是失败的测试用例'''
  28. print('这个是失败的测试用例')
  29. res = calc(9,8)
  30. self.assertEqual(98,res)
  31. def test_haha(self):
  32. '''这是哈哈'''
  33. self.assertEqual(1,2)
  34.  
  35. if __name__ == '__main__':
  36. unittest.main()#它会帮你运行当前这个python里面所有的测试用例

由此可以看到,执行顺序是:静态方法 setUpClass()  -> setUp -> test case -> SetDown ->... -> SetUp -> testcase -> testDown -> 静态方法 setDownClass()。

所以可以用setUpClass、tearDownClass做所有用例的前置初始化和结束。

unittest.main()  #它会帮你运行当前这个python里面所有的测试用例

二、 应用 HTMLTestRunner 生成测试报告

  1. if __name__ == '__main__':
  2. suite = unittest.TestSuite()#定义一个测试套件
  3. suite.addTest(TestCalc('test_pass_case'))#测试套件中添加测试用例
  4. suite.addTest(TestCalc('test_a'))
  5. f = open('report.html','wb')#打开一个保存结果的html文件
  6. runner = HTMLTestRunner.HTMLTestRunner(stream=f,title='测试报告',description='测试情况')#生成执行用例的对象
  7. runner.run(suite)#运行

可以将某几个test case加入test suite ,这样生成的测试报告里只有这两个test case 的结果。

具体如下:

可以将类里所有的test case加入test suite,如下

  1. suite.addTests(unittest.makeSuite(TestCalc))#把类里面所有的测试用例加入测试套件

得到的测试报告结果为:

三、针对整个项目的test case,生成测试报告

例如有以下的结构:

test_buy 里关于购买的cases, test_login是关于login 的cases, test_reg是关于注册的cases, run_all_cases执行所有的cases

注意,在test_buy, test_login,test_reg里的case 需要以test 开头,这样才会被执行到,还有这三个文件不一定以test开头,这里只是为了方便才这么写的,但是必须得有相同的规则,比如这里的文件名都以test_ 开头。

run_all_cases.py代码如下所示:

  1. import unittest,HTMLTestRunner
  2. suite = unittest.TestSuite()
  3. all_cases = unittest.defaultTestLoader.discover('.','test_*.py')#第一个参数:从哪个目录,第二个参数:定义规则
  4. # for case in all_cases:
  5. # suite.addTests(case)
  6. [suite.addTests(case) for case in all_cases]#列表生成式,和上面的注释写法一样
  7. f = open('new_report.html','wb')#打开一个保存结果的html文件
  8. runner = HTMLTestRunner.HTMLTestRunner(stream=f,title='测试报告',description='测试情况')#生成执行用例的对象
  9. runner.run(suite)#运行

四、集成jenkins,生成jenkins能识别的测试报告

这里就要用到  xmlrunner 模块,jenkins能识别xml格式。

  1. runner = xmlrunner.XMLTestRunner('.')#当前目录

以上就是对Unittest的简单总结,后续会持续更新。

python + unittest 做单元测试之学习笔记的更多相关文章

  1. postman 做接口测试之学习笔记

    Postman 之前是作为Chrome 的一个插件,现在要下载应用才能使用. 以下是postman 的界面: 各个功能区的使用如下: 快捷区: 快捷区提供常用的操作入口,包括运行收藏夹的一组测试数据, ...

  2. Python 日期时间处理模块学习笔记

    来自:标点符的<Python 日期时间处理模块学习笔记> Python的时间处理模块在日常的使用中用的不是非常的多,但是使用的时候基本上都是要查资料,还是有些麻烦的,梳理下,便于以后方便的 ...

  3. 《Think Python》第16章学习笔记

    目录 <Think Python>第16章学习笔记 16.1 Time 16.2 纯函数(Pure functions) 16.3 修改器(Modifiers) 16.4 原型 vs. 方 ...

  4. 《Think Python》第17章学习笔记

    目录 <Think Python>第17章学习笔记 17.1 面向对象的特性(Object-oriented features) 17.2 打印对象(Printing objects) 1 ...

  5. 《Think Python》第15章学习笔记

    目录 <Think Python>第15章学习笔记 15.1 程序员定义的类型(Programmer-defined types) 15.2 属性(Attributes) 15.3 矩形( ...

  6. Python 图片转字符画 学习笔记

    Python 图片转字符画 学习笔记 标签(空格分隔): Python 声明:此文章和所有代码是学习笔记,非原创,原文教程地址:https://www.shiyanlou.com/courses/37 ...

  7. python cookbook第三版学习笔记十:类和对象(一)

    类和对象: 我们经常会对打印一个对象来得到对象的某些信息. class pair:     def __init__(self,x,y):         self.x=x         self. ...

  8. python 面向对象(类)--学习笔记

    面向对象是一种编程方式, 主要集中在类和对象的两个概念 python 中的类符合封装, 继承, 多态的特征 类 是一个模板, 是n多函数的集成 对象 是类的实例化 类的成员分为三大类:字段.方法.属性 ...

  9. python的运维交流学习笔记

    #!/usr/bin/env | #!/usr/bin/python#coding:gbk #python 运维练习 #需求: #1.利用python实现自动监控服务器性能 #2.并将监控到的数据进行 ...

随机推荐

  1. socket小实例

    服务端 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...

  2. DUBBO功能使用说明

    DUBBO功能使用说明 1 DUBBO概述 DUBBO是阿里巴巴公司的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 相比于其他服务框架,DUBBO有如 ...

  3. 实例教程Unity3D单例模式(二)自我包括法

    unity3d 里的单例模式自我包括法 有一次玩Trench Run game,我意识到我的场景类里存在很多的GameObject.所以,我开发了自我包括的单例.假设没找找到实例,就会创建它自己的Ga ...

  4. 如何才能知道外线是FSK还是DTMF制式?

    在直线上接上来电显示话机,然后用手机或其他电话拨接电话的外线号码. 1.如果是先振铃后来显,就是FSK制式. 2.如果先送来显,再振铃或来显和振铃同时响应,就是DTMF制式 交换机默认配置是FSK制式 ...

  5. js 对象引用传值

    1)当变量是一个对象(例如:{}或[]),使用 a = b = {} 这种形式传值的话,会变成会用传值,修改 a 时 b 会相应变化,修改 b 时 a 也一样会相应变化 var a = b = {}; ...

  6. Windows版Nginx启动失败之1113: No mapping for the Unicode character exists in the target multi-byte code page

    Windows版Nginx启动一闪,进程中未发现nginx进程,查看nginx日志,提示错误为1113: No mapping for the Unicode character exists in ...

  7. Vitamio视频播放器

    前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的And ...

  8. oracle 字段自增 两段代码搞定

    (这几天做了个小小课程设计时用的是oracle数据库,第一次用,发现oracle和我们以前用的sql server .mysql是有如此多不同的地方,下面是遇到的问题之一和解决方法,和大家分享下) 用 ...

  9. nohop以及后台运行的相关集合

    本文参考:https://blog.csdn.net/u011095110/article/details/78666833 1. 后台运行一个命令: & tar -czvf /mnt/aa. ...

  10. SSH配置优化和慢的解决方法

    author: headsen chen date: 2018-08-18  00:28:37 ssh配置优化 vim  /etc/ssh/sshd_config 1,修改root端口 2,不允许ro ...