一、定义

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

unittest通过建立类并继承父类unittest.TestCase将用例组织起来,统一执行

示例:

import unittest
class Testcase(unittest.TestCase):#类继承unittest.TestCase
def setUp(self):#每条用例运行前,运行。一般可用来做些准备工作
print('我是setup,什么时候运行') def tearDown(self):#每条用例结束后,运行,一般可用来做些收尾工作
print('teardown什么时候运行')
def testa(self):
print('测试用例a')
self.assertEqual(1,2,'计算结果不正确')
#assertEqual是父类unittest.TestCase的函数,用来验证实际结果是否与预期结果相等
#第一个参数是预期结果,第二个参数是实际结果,第三个参数是当前面两个不相等时,回显示的提示信息。第三个参数是非必填的
def testb(self):
'''这里是测试用例的描述,会最终显示在测试报告中的,必须用三个单引号括起来才可以,用#d不行'''
print('测试用例b')
self.assertEqual(1,1)
def c(self):
print('c函数不是以test开头的,所以不会当做用例被执行')
# self.assertIn('a','abc')
@classmethod
def setUpClass(cls):#所有的用例运行前,运行setupClass
print('什么时候运行setupClass')
def tearDownClass(cls):#所有用例运行后,执行tearDownClass
print('什么时候运行tearDownClass') unittest.main()#执行当前python文件中的所有用例,会在控制台显示运行结果,不会产生测试报告
#运行的时候不要右键运行run unittest for...,这个是pycharm自己给运行的unittest,不会产生测试报告
# 应点击菜单栏中Run--run,弹出提示框后,选择自己要运行的文件进行run
#函数名用例必须以test开头,才会被执行

二、用例集suite+HTMLTestRunner/BeautifulReport

用例集即测试套件,可以吧所有的用例放入用例集当中执行,并结合HTMLTestRunner或者BeautifulReport产生出直观的漂亮的测试报告

#-------------------------------------------------------------------HTMLTestRunner写报告(丑)
#将下载好的HTMLTestRunner.py 放到 pycharm的External Libraries目录下的lib目录下,然后导入:import HTMLTestRunner,紧接着上面的代码:(把unittest.main注释掉)

suite=unittest.TestSuite()#定义用例集,是个list
suite.addTest(unittest.makeSuite(Testcase))#将类TestCase先变成一个用例集合,然后再加入到suite中
f=open('测试报告.html','wb')#建立一个测试报告文件
runner=HTMLTestRunner.HTMLTestRunner(f,title='测试报告标题',description='测试报告描述')#title和decription都是非必填。将用例结果写入测试报告.html
runner.run(suite)#运行用例集,用例执行的顺序是按照字母排序的

然后通过run-run选中要执行的当前文件,运行后,就会产生一个html格式的报告,可用浏览器打开,如下:

#--------------------------------------------------------BeautifulReport 报告(美)

#下载BeautifulReport ,解压后运行setup.py。可以将解压后的文件拷贝到pycharm中,然后运行setup.py也可。然后要导入:

from BeautifulReport import BeautifulReport as bf #bf就是个别名,方便使用

suite=unittest.TestSuite()#定义用例集,是个list
suite.addTest(unittest.makeSuite(Testcase))#将类TestCase先变成一个用例集合,然后再加入到suite中
report=bf(suite)##先实例化这个类
report.report(description='用例描述',filename='用例文件名字')
#description必填参数,log_path是非必写的,默认在当前目录下。也可以定义别的目录
#filename可写可不写,回自动生成个名字。名字后缀默认就是html。可写上也可不写

执行后,生成html格式报告:打开:

三、用unittest测接口示例

1、接口数据:yaml格式文件,存有3条用例数据

2、用ddt自动读取用例数据并传递给测试类中的测试用例函数

3、执行用例

4、写报告

用例数据

- #用减号-区分不同的用例。最终是个list,然后每个list是个字典:  [{}{}]
url: /api/user/login
detail: 正常登录
method: post
data:
username: aaa
passwd: aA123456
check:
- userId
- error_code -
url: /api/user/login
detail: 密码错误
method: post
data:
username: aaa
passwd: aA1234
check:
- 密码错误 -
url: /api/user/login
detail: 必填参数未填,用户名不传
method: post
data:
passwd: aA1234
check:
- 必填参数未填

接口测试代码:获取数据,执行测试用例并发送测试结果报告

import unittest
import ddt#自动读取文件内容,该模块需要先安装pip install ddt
import requests
from BeautifulReport import BeautifulReport as bf
from urllib import parse @ddt.ddt #声明这个类要用ddt
class Login(unittest.TestCase):
base_url='http://100.20.20.40'
@ddt.file_data('login1.yaml')#ddt自动读取文件,并获取内容传给下面的函数,循环调用.运行如果出现字符编码问题,就直接打开file_data源文件,搜索open,将打开文件的代码中,加上encoding=utf-8
def test_request(self,**kwargs):#**kwargs可以传入字典参数,不限个数.此处用来接收从login1.yaml中读出来的用例,是字典
detail=kwargs.get('detail','没写用例描述')#如果没有定义detail,默认给个值’没写用例描述‘
self._testMethodDoc=detail#设置用例描述 url=kwargs.get('url')
url=parse.urljoin(self.base_url,url)#自动拼接url,
method=kwargs.get('method','get')#method默认给个get方法
data=kwargs.get('data',{})#如果没给data,默认给个空字典
header=kwargs.get('header',{})#如果没有header参数,默认给个空字典
cookie=kwargs.get('cookie',{})
check=kwargs.get('check')#获取login1.yaml中的预期结果check,是list
method=method.lower()#
try:
if method=='get':
res=requests.get(url,params=data,cookies=cookie,headers=header).text
#因为实际结果失败的话,不会返回json串,所以不能转成字典
else:
res=requests.post(url,data,cookies=cookie,headers=header).text
except Exception as e:
print('接口请求出错')
res=e
for c in check:#循环遍历check中的所有预期结果,判断是否包含在实际结果中
self.assertIn(c,res,msg='预期结果不符,预期结果%s,实际结果%s'%(c,res))#断言,如果预期结果在实际结果中,pass.否则断言失败并给出错误信息msg suite=unittest.TestSuite()
suite.addTest(unittest.makeSuite(Login))
run=bf(suite)
run.report('login_test','登录测试用例')#第一个是描述,第二个是文件名
print(run.success_count)#通过的次数
print(run.failure_count)#失败次数)

单元测试unittest(基于数据驱动的框架:unittest+HTMLTestRunner/BeautifulReport+yaml+ddt)的更多相关文章

  1. unittest使用数据驱动ddt

    简介 ddt(data driven test)数据驱动测试:由外部数据集合来驱动测试用例,适用于测试方法不变,但需要大量变化的数据进行测试的情况,目的就是为了数据和测试步骤的分离 由于unittes ...

  2. Python必会的单元测试框架 —— unittest

    用Python搭建自动化测试框架,我们需要组织用例以及测试执行,这里博主推荐Python的标准库——unittest. unittest是xUnit系列框架中的一员,如果你了解xUnit的其他成员,那 ...

  3. 单元测试框架unittest

    单元测试:单元测试,是指对软件中的最小可测试单元进行检查和验证,对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义如:c语言中单元指一个函数,java里单元指一个类,图形化的软件中可以 ...

  4. Python单元测试框架——unittest

    测试的常用规则 一个测试单元必须关注一个很小的功能函数,证明它是正确的: 每个测试单元必须是完全独立的,必须能单独运行.这样意味着每一个测试方法必须重新加载数据,执行完毕后做一些清理工作.通常通过se ...

  5. 广深小龙-基于unittest、pytest自动化测试框架之demo来学习啦!!!

    基于unittest.pytest自动化测试框架之demo,赶紧用起来,一起学习吧! demo分为两个框架:①pytest    ②unittest demo 中 包含 web.api 自动化测试框架 ...

  6. Python单元测试框架unittest之深入学习

    前言 前几篇文章该要地介绍了python单元测试框架unittest的使用,本篇文章系统介绍unittest框架. 一.unittest核心工作原理 unittest中最核心的四个概念是:test c ...

  7. Python单元测试框架unittest之单用例管理(一)

    一.概述 本文介绍python的单元测试框架unittest,unittest原名为PyUnit,是由java的JUnit衍生而来,这是Python自带的标准模块unittest.unittest是基 ...

  8. Python单元测试框架 unittest详解

    一 整体结构概览 unittest原名为PyUnit,是由java的JUnit衍生而来.对于单元测试,需要设置预先条件,对比预期结果和实际结果. TestCase :通过继承TestCase类,我们可 ...

  9. django的单元测试框架unittest、覆盖率

    django的单元测试 指定测试范围: 指定运行某些测试文件./manage.py test --pattern="tests_*.py" -v 2 运行所有测试文件./manag ...

随机推荐

  1. Android 开发学习进程0.11 pageview relativelayout 沉浸式标题栏

    fragment与pageView fragment fragment不可以侧滑切换相关界面,但多数代码位于fragment中,易于维护,同时不会受到多个手势滑动的影响 pageView pageVi ...

  2. JavaScript基础-03

    1. 条件判断语句 若条件成立才会执行,条件不成立则语句不执行: if语句 语法一: if(条件表达式) {语句}          :true就执行,false不执行: 语法二: if(条件表达式) ...

  3. JVM的方法执行引擎-模板表

    Java的模板解析执行需要模板表与转发表的支持,而这2个表中的数据在HotSpot虚拟机启动时就会初始化.这一篇首先介绍模板表. 在启动虚拟机阶段会调用init_globals()方法初始化全局模块, ...

  4. java文件的写入和读取(按行)

    https://blog.csdn.net/Alexwym/article/details/81078417 https://blog.csdn.net/nickwong_/article/detai ...

  5. mysql查看死锁及解锁方法

    解除正在死锁的状态有两种方法: 第一种: 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程(如果您有SUPER权限,您可以看到所有线程.否则, ...

  6. java基础-04:标识符与关键字

    在Java中,标识符是代表你对程序中某个方法或变量赋予的一个名称,而这个名称不能是关键字 关键字:

  7. 第2章 RDD编程(2.3)

    第2章 RDD编程(2.3) 2.3 TransFormation 基本RDD Pair类型RDD (伪集合操作  交.并.补.笛卡尔积都支持) 2.3.1 map(func) 返回一个新的RDD,该 ...

  8. 结对项目 实现自动生成四则运算题目的程序 (C++)

    本次作业由 陈余 与 郭奕材 结对完成 零.github地址: https://github.com/King-Authur/-Automatically-generate-four-arithmet ...

  9. LR与LR?

    目录 逻辑回归与线性回归 逻辑回归 1.建立目标函数 2. 梯度求解 3. 实现 线性回归 1. 建立目标函数 2. 求解 3. 实现 逻辑回归与交叉熵 逻辑回归与线性回归 逻辑回归 线性回归 目标函 ...

  10. CSS 选择器及优先级

    CSS 选择器及优先级 1.根据权值计算 div .class1 #people的权值等于1+10+100=111 .class2 li #age的权值等于10+1+100=111 2.权值相同,那么 ...