目录

一.unittest的四大组件

二.unittest常用类

三.unittest框架使用示范

三.TestResult

四.测试套件的用法

五.装饰器

六.参数化

七.使用HTMLTestRunner.py模块生成测试报告


一.unittest的四大组件

1.TestCase:

测试用例,通过继承unittest.TestCase,来实现用例的继承,在Unittest中,测试用例都是通过test来识别的。

2.TestSuite:

用来组装测试用例 - addTest

一个功能的验证往往需要多个测试用例

3.TestRunner:

运行器,通过TextTestRunner类提供的run()方法来执行test suite/test case,一般通过runner来调试unittest.main()运行所有内容。

4.TestFixture:

对一个测试用例环境的搭建和销毁,就是一个fixture,通过setUp()和tearDown()方法实现

二.unittest常用类

1.TestCase,测试用例的父类,测试类需要继承它才有执行测试的能力

2.TestSuite,该类用于创建测试套件,可以将多个测试用例加入一个测试套件中

3.unnitest.main()方法可以运行所有test开头的方法

4.TextTestRunner,用该类的run()方法来运行TestSuite添加好的方法

5.skip装饰器,有时在某些系统环境上运行时,某些测试用例是不能通过的,但这并不是我们的产品或用例导致,而是环境的不兼容性问题,这时可以用skip装饰器跳过这些测试用例

三.unittest框架使用示范

被测试代码是一个简单的加法代码,如图

class Function:def add(self,a,b):return a + b

测试代码如下

import unittest
from my_unittest.function import Functionclass TestFunction(unittest.TestCase):@classmethoddef setUpClass(cls):print("每个测试类执行之前调用该方法“)@classmethoddef tearDownClass(cls):print("每个测试类执行之后调用该方法“)def setUp(self):#重写父类的方法setUp(),对于当前的测试用例进行一些初始化工作self.func = Function()print("每个测试用例执行之前,均会调用该方法“)def tearDown(self):self.func = none #每个测试用例执行之后调用该方法,关闭对象,释放资源print("每个测试用例执行之后,均会调用该方法“)def test_1(self):result= self.func.add(2,5)self.assureEqual(result,7)def a(self): #运行后发现该测试用例没有被调用result= self.func.add(2,5)self.assureEqual(result,7)def test_01(self):result= self.func.add(2,8)self.assureEqual(result,10)def test_11(self):result= self.func.add(1,5)self.assureEqual(result,6)def test_a():result= self.func.add(7,5)self.assureEqual(result,12)def test_A():result= self.func.add(0,5)self.assureEqual(result,5)if __name__ == "__main__":unittest.main()

根据运行结果可以得出以下结论

1.测试用例想被运行器正常调用,必须以test关键字开头

2.所有的测试用例是按照ASCII表的排序进行调用的,而不是代码编写顺序或者数字大小,上述用例执行的顺序由先到后是test_01,test_1,test_11,test_A,test_a

三.TestResult

unnitest.TestResult()实例化的对象可以保存运行的结果,输出该对象的字典,结果显示出失败,错误,已运行,跳过等详细信息

import unittest
class TestDemo(unittest.TestCase):def test1(self):print("This is test0
1”)if __name__ == '__main__':r =  unnitest.TestResult()TestDemo("test01").run(result=r)print(r.__dict__)print(r.testsRun)  #获取key为testsRun的值,运行结果是1print(r.failures)  #获取key为failures的值,运行结果是[]

运行结果如图

四.测试套件的用法

假设有两个测试类UniTest01和UniTest02,UniTest01有测试用例test_a,test_1, test_22

UniTest02有测试用例test_22

import unittest
from unittest import TestLoadersuite =  unittest.TestSuite()#单独添加每一个测试用例
#suite.addTest(UniTest01('test_a'))
#suite.addTest(UniTest01('test_1'))
#suite.addTest(UniTest02('test_22'))#利用addTests方法批量添加用例
suite.addTests((Unitest01('test_a'),UniTest01('test_1'),UniTest02('test_22')))#直接调用整个测试类的测试用例
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(UniTest01))
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(UniTest02))
result = unittest.TestResult()
suite.run(result)
print(result.__dict__)

五.装饰器

@unittest.expectedFailure 期望出现异常或断言失败,即当测试用例失败的时候成功

@unittest.skip() 跳过测试用例

import unittest
from my_unittest.function import Functionclass TestFunction(unittest.TestCase):@classmethoddef setUpClass(cls):print("每个测试类执行之前调用该方法“)@classmethoddef tearDownClass(cls):print("每个测试类执行之后调用该方法“)def setUp(self):#重写父类的方法setUp(),对于当前的测试用例进行一些初始化工作self.func = Function()print("每个测试用例执行之前,均会调用该方法“)def tearDown(self):self.func = none #每个测试用例执行之后调用该方法,关闭对象,释放资源print("每个测试用例执行之后,均会调用该方法“)@unittest.skip('暂时不执行#不执行该用例def test_1(self):result= self.func.add(2,5)self.assureEqual(result,7)def a(self): #运行后发现该测试用例没有被调用result= self.func.add(2,5)self.assureEqual(result,7)@unittest.expectedFailure #期望出现异常或断言失败def test_01(self):self.fail('强制当前用例失败') #强制抛出错误def test_11(self):result= self.func.add(1,5)self.assureEqual(result,6)def test_a():result= self.func.add(7,5)self.assureEqual(result,12)def test_A():result= self.func.add(0,5)self.assureEqual(result,5)if __name__ == "__main__":unittest.main()

六.参数化

(1)需要先在cmd黑窗口中pip install parameterized安装第三方库parameterized

(2)参数化示范代码如下

import unittest
from parameterized import parameterizedclass Unittest03(unittest.TestCase):def setUp(self):self.func =Funtion()@parameterized.expand([(2,3,5),(1,2,3),(3,6,9)])def test_01(self,x,y,expect):actual = self.func.add()self.assertEqual(actual,expect)if __name__ == '__main__':unittest.main()

七.使用HTMLTestRunner.py模块生成测试报告

在网上下载HTMLTestRunner.py,将文件放在Python安装路径的lib目录下

如果是用的Python3版本,要对HTMLTestRunner.py做如下修改才能使用

示范代码如下

import unittest
from unittest import TestLoader
from HTMLTestRunner import HTMLTestRunner
import timesuite =  unittest.TestSuite()
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(UniTest01))
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(UniTest02))now = time.strftime('%Y-%m-%d %H_%M_%S') #获取当前时间
filename = 'E:\' + now + 'report.html'
f= open(filename,'wb') runner = HTMLTestRunner(stream=f,title=u'测试报告',description=u'执行情况‘)
runner.run(suite)
f.close

执行完上述代码后在E盘下会生成一个report.html文件,用浏览器打开即可查看报告

unittest框架用法相关推荐

  1. Python单元测试及unittest框架用法实例解析

    例题取用登录模块:代码如下 def login_check(username,password):''' 登录校验的函数:param username:账号:param password: 密码:re ...

  2. selenium自动化测试、Python单元测试unittest框架以及测试报告和日志输出

    部分内容来自:https://www.cnblogs.com/klb561/p/8858122.html 一.基础介绍 核心概念:test case, testsuite, TestLoder,Tex ...

  3. unittest框架学习笔记

    目录 1.unittest全部属性 2.用例基本类:unittest.TestCase 2.1.前置条件:setUp() 2.2.后置条件:tearDown() 2.3.断言:assert*() 3. ...

  4. Python 测试驱动开发读书笔记(二)使用unittest框架扩展功能测试

    使用功能测试驱动开发一个最简可用的应用 上一节,我们启用了Django,并且用Selenium驱动浏览器,测试了本地地址http://127.0.0.1,因为只是启动了首页,并没有做任何的页面内容,所 ...

  5. Unittest框架介绍

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

  6. Unittest框架介绍及常用组件

    1.unittest框架介绍 unittest是Python自带单元测试框架,提供丰富的用例管理.执行和断言操作. 2.unittest框架常用组件 (1)TestCase,测试用例,继承于TestC ...

  7. unittest 框架学习

    为什么80%的码农都做不了架构师?>>>    今天我学习了,怎么把testcase分到不同的文件中,然后在集中到一个testsuite中一起跑,我还学会了怎么打包,怎么引用. 打包 ...

  8. unittest框架执行用例

    pycharm中运行脚本的方式总共有三种,分别为:unittest模式,pytest模式,普通模式,今天主要来聊一聊unittest模式执行与普通执行(因为最近在学习unittest框架,所以pyte ...

  9. selenium-webdriver(python) (十六) --unittest 框架

    学习unittest 很好的一个切入点就是从selenium IDE 录制导出脚本.相信不少新手学习selenium 也是从IED 开始的. IDE学习参考: 菜鸟学自动化测试(一)----selen ...

最新文章

  1. linux lvm 镜像,LVM实现逻辑卷镜像
  2. 利用二级指针删除单向链表
  3. 排错-tcpreplay回放错误:send() [218] Message too long (errno = 90)
  4. Spark SQL 中UDF的讲解
  5. elementUI的container布局设置全屏宽度
  6. Weblogic 节点启动
  7. Struts2源码阅读(五)_FilterDispatcher核心控制器
  8. JS关键字和保留字汇总
  9. TCP四次握手断开连接(图解)
  10. android webview 跳转系统浏览器,webview 调用系统浏览器怎么解决
  11. ## 编写一个从1到150的循环,并在每行打印一个值,另外在每个3的倍数行打印“foo“,在5的倍数行打印“biz“,在10的倍数行打印“baz“;
  12. Numpy用法详细总结:学习numpy如何使用,看这一篇文章就足够了
  13. ComputerVision会议+领先研究室+专家+代码网址(转载)
  14. 写作三件套(VScode Miktex Latex Workshop)入门三大坑
  15. 360 冰刃实验室研究员获得微软史上最高漏洞赏金
  16. C++11 的 运行时类型识别type_info
  17. C# 发送邮件方法2
  18. 转载:Java语言学习
  19. 【视频格式】m3u8格式视频下载
  20. 第一周:JavaEE——课程目标

热门文章

  1. 学习微信小程序第二天-登录态学习
  2. 【50个最受网友欢迎的HTML5资源下载列表】(转)
  3. 软件测试标准升级|新版25000标准解读
  4. 如何提高测试用例的编写效率?
  5. android购物车代码简述,Android实现简单购物车功能
  6. 瑞吉外卖项目笔记+踩坑1——基础功能
  7. AutoHotKey 常用命令及示例
  8. CBRS详解和band 48模组接入网络测试
  9. 杜洋视频入门PCB设计 软件AD09 淘宝上买的全套超清教程
  10. 精通linux内核年薪,最新IT人才薪酬体系一览表