python之单元测试框架—unittest
一. 什么是单元测试?单元测试的对象是什么?
1: 什么是单元测试?
按照定义,单元测试就是对单个模块或者单个类或者单个函数进行测试,一般是开发做的,按照阶段分,一般就是单元测试、集成测试、系统测试、验收测试
2: 为什么要做单元测试?
1) 单元测试之后,才是集成测试,单个单个的功能模块测试通过之后,才能把单个功能模块集成起来做集成测试,为了从底层发现bug,减少合成后出现的问题
2) 越早发现bug越好,这样可以早点发现问题,不然问题累计到后面,如果做错了就要推倒重来,对于时间和经费来说,是非常浪费的!
3) 对我们测试来说,我们做单元测试是为了执行测试用例
二. 单元测试的语法介绍
1: 引入自带的单元测试类: import unittest
创建一个测试类,来测试你要测试的目标对象: class TestMath(unittest.TestCase)
2: 引入你要测试的代码模块或者是类名: from class_4_test import add
3: 创建单元测试用例来对测试目标进行测试: def test_add(self)
语法:函数用test开头,然后拼接下划线,再加函数名,里面的内容就是创建实例来调用方法
4: 引入断言,对测试结果进行判断处理
self.assertEqual(实际结果,期望结果,如果出错出错处理)
self.assertEqual(result_add, 6, "答案不等于6,所以答案是错误的!")
5: 引入异常判断,对测试用例进行异常判断处理: try...except
错误基类:AssertionError
6: 引入测试集,方便批量进行单元测试
完整的单元测试很少只执行一个测试用例,开发人员通常需要编写多个测试用例才能对某一软件功能进行比较完全的测试,这些相关的测试用例称为一个测试用例集,用TestSuite类来表示,用到的是TestSuite(),用addTest执行测试集,用到的是TextTestRunner(),用runner.run(suite)
7: 单元测试参数化(少量数据,十组以内)
安装:pip install parameterized #通过pip安装,记得先装好pip和setuptools这两个,才能用pip命令
使用:引入parameterized
from parameterized import parameterized
使用范例:
class TestMath(unittest.TestCase):
@parameterized.expand([
(", 1, 1, 2),
(", 2, 2, 4),
(", 3, 3, 6),
])
def test_add(self.name, a, b, c):
self.assertEqual(Math(a, b).add(), c)
print("测试数据是: ", name)
有关parameterized详细内容请查看https://github.com/wolever/parameterized
8: 测试报告,引入htmlreport模板
1. 单元测试后生成测试报告。前提条件,把测试报告模板HTMLTestRunner.py放在python Lib目录下
import htmlreport
import time
#关键代码
suite = unittest.TestSuite() #一个对象,集合所有的单元测试用例
suite.addTest(TestMathFunc("test_add"))
...
#执行测试集合
now = time.strftime("%Y-%m-%d_%H_%M_%S")
filepath = "pyResult" + now + ".html" #在文件名中加入时间
fp = open(filepath, "wb") #wb表示二进制文件的写操作
#生成报告的Title,描述
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title="Python Test Report", description="This is Python Report")
runner.run(suite)
9: 举例
import unittest
from ... import ... #引入你要测试的模块或者是类,打个比方,这里写了一个Math类,里面有加法add,减法sub函数
class TestMath(unittest.TestCase):
def setUp(self):
#初始化工作,这里面做初始操作
pass
def test_add(self): #注意这里必须以test_开头
#写测试代码
t = Math() #先实例化Math类
result = t.add(5, 6)
self.assertEqual(result, "期望值", "加法运行出错,期望值不等于实际值") #断言
def tearDown(self):
#扫尾工作,这里面做单元测试结束后的工作
pass
三. 代码部分
1: 我们先定义一个需要测试的目标类Math,它的文件名是mathfunc.py
class Math:
def add(self, a, b):
return a + b
def minus(self, a, b):
return a - b
def multi(self, a, b):
return a * b
def divide(self, a, b):
return a / b
2: 创建测试类,它的文件名是test_mathfunc.py
import unittest
from mathfunc import Math #引入你要测试的模块或者是类,打个比方,这里写了一个Math类,里面有加法add,减法sub函数
class TestMath(unittest.TestCase):
def setUp(self):
#初始化工作,这里面做初始操作
pass
def test_add(self): #注意这里必须以test_开头
try:
t = Math() #先实例化Math类
self.assertEqual(t.add(5, 6), 11, "加法运行出错,实际值不等于期望值") #断言
except AssertionError as e:
print(e)
def test_minus(self):
try:
t = Math()
self.assertEqual(t.minus(6, 3), 3, "减法运行出错,实际值不等于期望值")
except AssertionError as e:
print(e)
def test_multi(self):
try:
t = Math()
self.assertEqual(t.multi(3, 3), 9, "乘法运行出错,实际值不等于期望值")
except AssertionError as e:
print(e)
def test_divide(self):
try:
t = Math()
self.assertEqual(t.divide(6, 3), 2.0, "除法运行出错,实际值不等于期望值")
except AssertionError as e:
print(e)
def tearDown(self):
#扫尾工作,这里面做单元测试结束后的工作
pass
3: 创建测试集,它的文件名为test_suite.py
import unittest
from test_mathfunc import TestMath
#创建测试集合
suite = unittest.TestSuite() #一个对象,集合所有的单元测试用例
suite.addTest(TestMath("test_add"))
suite.addTest(TestMath("test_minus"))
suite.addTest(TestMath("test_multi"))
suite.addTest(TestMath("test_divide"))
#创建一个对象来调用测试集合
runner = unittest.TextTestRunner()
runner.run(suite)
4: 参数化@parameterized,传递一组数据,我们修改之前的test_mathfunc.py文件
import unittest
from mathfunc import Math
from parameterized import parameterized
class TestMath(unittest.TestCase):
def setUp(self):
pass
@parameterized.expand([
(", 1, 1, 2),
(", 2, 2, 4),
(", 3, 3, 6),
])
def test_add(self, name, a, b, c):
try:
m = Math()
self.assertEqual(m.add(a, b), c, "加法计算错误")
except AssertionError as e:
print(e)
else:
print("测试数据是: ", name)
@parameterized.expand([
(", 3, 1, 2),
(", 6, 3, 3),
(", 5, 1, 2),
]
)
def test_minus(self, name, a, b, c):
try:
m = Math()
self.assertEqual(m.minus(a, b), c, "减法计算错误")
except AssertionError as e:
print(e)
else:
print("测试数据是: ", name)
@parameterized.expand([
(", 3, 3, 9),
(", 3, 2, 6),
(", 1, 5, 5),
])
def test_multi(self, name, a, b, c):
try:
m = Math()
self.assertEqual(m.multi(a, b), c, "乘法计算错误")
except AssertionError as e:
print(e)
else:
print("测试数据是: ", name)
@parameterized.expand([
(", 5, 2, 2.5),
(", 4, 1, 4.0),
(", 10, 5, 2.5),
])
def test_divide(self, name, a, b, c):
try:
m = Math()
self.assertEqual(m.divide(a, b), c, "除法计算错误")
except AssertionError as e:
print(e)
else:
print("测试数据是: ", name)
def tearDown(self):
pass
5: 引入htmlreport模板,生成测试报告
import unittest
from test_mathfunc import TestMathFunc
import HTMLTestRunner
import time
#创建测试集合
suite.addTest(TestMathFunc("test_minus"))
suite.addTest(TestMathFunc("test_multi"))
suite.addTest(TestMathFunc("test_divide"))
now = time.strftime("%Y-%m-%d_%H_%M_%S")
#执行测试用例集合
filepath = "pyResult" + now + ".html"
fp = open(filepath, "wb")
#生成测试报告的title, 描述
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title="Python Test Report", description="This is Python Report")
runner.run(suite)
python之单元测试框架—unittest的更多相关文章
- Appium+python的单元测试框架unittest(1)(转)
unittest为python语言自带的单元测试框架,python把unittest封装为一个标准模块封装在python开发包中.unittest中常用的类有:unittest.TestCase.un ...
- Appium+python的单元测试框架unittest(4)——断言(转)
(原文:https://www.cnblogs.com/fancy0158/p/10051576.html) 在我们编写的测试用例中,测试步骤和预期结果是必不可少的.当我们运行测试用例时,得到一个运行 ...
- Python之单元测试框架unittest
创建class继承unittest,每一个测试用例是以test开头的函数,先执行setup,然后用例按照字母的顺序执行,然后执行teardown import unittest class demo( ...
- python之单元测试框架—unittest(补充)
一. unittest最核心的四个概念 unittest中最核心的四个概念是:test case,test suite,test runner,test fixture TestCase:一个test ...
- Appium+python的单元测试框架unittest(3)——discover(转)
(原文:https://www.cnblogs.com/fancy0158/p/10047906.html) TestSuite套件可以添加很多个用例后运行,但是每个用例都需要调用addTest()函 ...
- Appium+python的单元测试框架unittest(2)——fixtures(转)
(原文:https://www.cnblogs.com/fancy0158/p/10046333.html) unittest提供的Fixtures用以在测试执行前和执行后进行必要的准备和清理工作,可 ...
- Python单元测试框架unittest之单用例管理(一)
一.概述 本文介绍python的单元测试框架unittest,unittest原名为PyUnit,是由java的JUnit衍生而来,这是Python自带的标准模块unittest.unittest是基 ...
- 单元测试框架unittest
单元测试:单元测试,是指对软件中的最小可测试单元进行检查和验证,对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义如:c语言中单元指一个函数,java里单元指一个类,图形化的软件中可以 ...
- Python单元测试框架unittest使用方法讲解
这篇文章主要介绍了Python单元测试框架unittest使用方法讲解,本文讲解了unittest概述.命令行接口.测试案例自动搜索.创建测试代码.构建测试套件方法等内容,需要的朋友可以参考下 概 ...
随机推荐
- ArcGIS Server Q&A
持续更新.. 一. AGS Server10发布mobile data access 出现错误 问题描述: "ArcGIS Server: Configuration <name> ...
- MYSQL中case when then else end 用法
条件语句 delimiter \\CREATE PROCEDURE proc_if ()BEGIN declare i int default 0; if i = 1 THEN ...
- 获取JDBC响应做接口关联
1:从sql表中将需要取的数据查出来 2:我们需要把这个id为4451的数据从sql里面取出来,传到下一个sql里面,执行删除 3:写一个接口的传参有些不同,变成了var_id_1.var_id是之前 ...
- Java基础—抽象类和接口
1.抽象类 在Java语言中使用abstrac关键字来定义抽象类和抽象方法,抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号. public abstract class Employee { ...
- JDK版本更改,修改环境变量不生效解决办法
问题: 当使用安装版本JDK后,想要更改系统环境变量时,直接更改JAVA_HOME无效. 原因: 当使用安装版本的JDK程序时(一般是1.7版本以上),在安装结束后安装程序会自动将java.exe.j ...
- 001infor record 计划时间取值增强-20150622
ZMD_MRP_PARAMETERS 3000公司下工厂跑MRP时,如果为外购则通过外挂表取infor record计划交期. METHOD if_ex_md_mrp_parameters~adjus ...
- 1.6 使用电脑测试MC20的读取带中文短信功能
需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...
- MVC4 中使用 Area 和 注意的地方
在MVC项目中经常会使用到Area来分开不同的模块让项目结构更加的清晰. 步骤如下: 项目 –> 添加 -> 区域 (Area) 输入 Admin 添加成功后 Area包含:创建一个空 ...
- 使用新浪IP库获取IP详细地址
使用新浪IP库获取IP详细地址 <?php class Tool{ /** * 获取IP的归属地( 新浪IP库 ) * * @param $ip String IP地址:112.65.102.1 ...
- The Maximum Unreachable Node Set 【17南宁区域赛】 【二分匹配】
题目链接 https://nanti.jisuanke.com/t/19979 题意 给出n个点 m 条边 求选出最大的点数使得这个点集之间 任意两点不可达 题目中给的边是有向边 思路 这道题 实际上 ...