单元测试

单元测试

1. 为什么要单元测试?

1.1 案例
  1. 组装一台电脑,选购各种配件(CPU、主板、内存、硬盘、电源)等,组装完成后,电脑运行启动无反应。
  2. 编写一个程序,编写完成程序运行不起来(程序由N个不同功能函数和语句组成)
1.2 问题
  1. 无法确定各配件哪个有问题。
  2. 无法确定那个函数或语句出现问题。

2. 什么是单元测试

	概念:单元测试是针对程序的最小单元来进行正确性检验的过程。
	单元:一个单元可能是单个程序、类、对象、方法(函数)等。
2.1 优点:
  1. 减少BUG
  2. 快速定位BUG
  3. 提高代码质量
  4. 减少调试时间
2.2 缺点:
  1. 周期时间长
  2. 耗费资源
  3. 能力要求高

3.如何进行单元测试

单元测试流程
  1. 单元测试-计划
    1. 确定要测试代码范围
    2. 评估标准(确定被测代码的覆盖率)
  2. 测试策略-设计
    1. 拿到开发代码进行调整(可独立执行)
  3. 测试策略-实现
    1. 根据调整好的代码-画流程图
    2. 根据流程图画流图-确定复杂度、路径
    3. 根据复杂度和路径确定测试用例(测试数据)
  4. 单元测试-执行
    1. 使用测试框架(UnitTest)编写单元测试用例
    2. 测试用例(代码)和测试数据分离
    3. 生成测试报告
3.1 单元测试-计划
概念:对要测试代码的确定以及这些被测代码的评估标准、优先级等说明
  1. 确定单元测试范围(那些代码要做单元测试)
  2. 评估标准-(被测代码的逻辑覆盖率)
3.1.1 如何确定单元测试代码范围?
依据:二八原则(20%的代码中隐藏了80%的缺陷)
如何确定20%代码
  1. 频率:使用频率高的代码段;
  2. 复用性:(是否已被复用)
    1). 全新
    2). 部分复用
    3). 全部复用
  3. 开发人员:
    1). 技术
    2). 业务
  4. 复杂度:业务逻辑复杂度(一般认为圈复杂度在7级以上代码包括在20%的代码中)
3.1.2 评估标准
流程图
说明:使用统一规定标准图形,描述程序运行的具体步骤
目的:
1) 确定覆盖率
2) 根据流程图画流图        
语句覆盖率
语句:非分支非判断的代码
分支覆盖率
分支:判断语句的分支;如:if判断有两个分支
条件覆盖率
条件:结果为true或false
路径覆盖率
路径:从开始到结束的过程
分支-条件覆盖率
说明:分支和条件的组合  

3.2 测试策略-方式

3.2.1 策略 自上向下
方式:从最上层函数往下开始逐层测试
自上向下-总结:
  1. 方式
  2. 打桩(模拟调用的函数)
  3. 缺点(成本高)
打桩
概念:打桩就是模拟编写一个我们需要引用的函数

提示:一般我们只模拟写个函数名,直接返回相应的结果即可
示例:
 def fun_1(self):
     return true
3.2.2 策略 自下向上
方式:从最底层函数往上开始逐层测试
自下向上-总结:
  1. 方式
  2. 缺点(周期长)
3.2.3 策略 孤立策略
方式:选择需要进行测试的函数进行测试
孤立策略-总结:
1. 方式【推荐使用】
2. 优点:选择重要的代码进行测试

3.3 测试策略-实现

3.3.1 什么是测试策略实现?
概念:把我们选定的代码,转向流程图、流图及用例的过程
3.3.2 测试策略实现如何操作?
  1. 将测试代码转换成流程图
  2. 根据流程图转换为流图
流图
概念:表达程序业务逻辑的复杂度一种示意图
构成:   
	1) 圈:判断条件、语句块(一条或多条语句)两者都圈    
 	2) 线:箭头指向的线,用来连接圈和圈的指向    
流图的目的
  1) 确定单元的复杂度级别
  2) 确定测试用例

3.4 单元测试-执行

3.4.1 什么是单元测试执行
概念:通过单元测试框架对要进行测试代码的实践过程
3.4.2 参数化
概念:根据需求动态获取数据并进行赋值的过程
参数化-方式
  1. XML格式
  2. CSV格式
  3. JSON串
  4. TXT文本
3.4.3 XML
概念:XML是一种标记语句,很类似HTML标记语言;后缀 .xml
XML与HTML的区别
XML是传输和存储数据,焦点在数据;HTML是显示数据,焦点在外观;
XML的格式
<?xml version="1.0" encoding="UTF-8"?>
<book category="面授">
      <title>单元测试</title> 
      <author>XST</author> 
      <year>2008</year> 
      <price>39.95</price> 
</book>

1. 必须有XML声明语句:<?xml version="1.0" encoding="UTF-8"?>
2. 必须要有一个根元素,如:<book>
3. 标签大小写敏感
4. 属性值用双引号
5. 标签成对
6. 元素正确嵌套
7. 标签名可随意命名,但有以下限制
    1) 不能以数字或者标点符号开始参
    2)不能以字符 “xml”(或者 XML、Xml)开始
    3) 名称不能包含空格
需求
对三角形案例单元测试使用XML格式进行参数化
操作步骤
1. 编写XML数据文件
2. 编写读取XML模块函数
3. 单元测试模块中引用XML读取函数
4. 执行
重点分析
1. 导入XML包 from xml.dom import minidom
2. 加载解析 dom=minidom.parse(filename)
3. 获取对象  root=dom.documentElement
4. 获取子元素 aas=root.getElementsByTagName(one)[0]
5. 获取子元素值 aas.getElementsByTagName(two)[0].firstChild.data
3.4.4 CSV格式
概念:CSV是一种以逗号做分割的表格格式; 后缀 .csv
使用CSV实现三角形案例参数化-操作步骤
  1. 创建CSV文件
  2. 编写CSV读取模块函数
  3. 单元测试-引用CSV读取函数
  4. 执行
重点分析
	1. 导包 import csv
	2. 打开csv文件 
       		 with open("../Data/sjx.csv","r",encoding="utf-8") as f:
         		   lines=csv.reader(f)
3.4.5 JSON
概念:一种轻量级数据交换格式;后缀名 .json
提示:
    接口测试一般使用JSON为接口传递数据规范格式,所以我们有必要对如何获取JSON数据做个了解;   
JSON格式
格式:{"name":"张三","age":28}
提示:由键值对组成,健名和值之间使用分号(:)分割,多个键值对之间使用逗号(,)分割
使用JSON实现三角形案例参数化-操作步骤
  1. 编写JSON文件
  2. 编写JSON读取模块函数
  3. 单元测试-引用JSON读取函数
  4. 执行
难点分析
	1. 导入JSON包(import JSON2. 打开JSON文件并解析
   		 with open('../DataXML/sjx.json','r',encoding='utf-8') as f:
      		  file=json.load(f)
3.4.6 TXT文本
概念:一种纯文本格式; 后缀名 .txt
TXT文本优点:
1. 编写测试数据方便
2. 使用模块函数读取时便捷
使用TXT实现三角形案例参数化-操作步骤
  1. 创建txt文本并写入测试数据
  2. 编写读取txt模块函数
  3. 单元测试-引用JSON读取函数
  4. 执行
难点分析
1. 如何读取txt文本?
    with open(r'../DataXML/三角形.txt','r',encoding='utf-8') as f:
2. 如何去除行尾/n换行符?
    line.strip()

4.HTML报告生成

4.1 如何生成HTML报告
4.1.1 导入HTML报告模板模板
HTMLTestRunner.py
4.1.2 编写生成HTML模块
 # 导入unittest包
 import unittest
 # 导入 HTMLTestRunner模板包
 from UnitTest.Day02.ReadData.HTMLTestRunner import HTMLTestRunner
 #导入时间包
 import time
 # 定义测试模块路径
 dirpath='.'
 disconver=unittest.defaultTestLoader.discover(dirpath,pattern='test*.py')
 if __name__=='__main__':
     #存放报告的文件夹
     report_dir='../TestReport'
     #报告名称含时间,时间格式
     now=time.strftime("%Y-%m-%d %H_%M_%S")
     #报告完整路径+名称
     report_name=report_dir+'/'+now+'result.html'
     #打开报告写入结果
     with open(report_name,'wb')as f:
         runner=HTMLTestRunner(stream=f,title="UnitTest Report-SJX",description='Test Case Report')
         runner.run(disconver)

1.3 生成报告示例图
HTML报告
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值