目录
2、方式二:在Pycharm中安装parameterized
一、参数化环境准备
-
unittest测试框架,本身不支持参数化,但是可以通过安装unittest扩展插件parameterized来实现参数化
-
Python中插件(包/模块)的安装,使用pip工具,PIP是一个python包管理工具,提供了对python包的查找、下载、安装、卸载等功能
1、方式一:在终端(cmd)安装parameterized
-
安装命令:pip install parameterized
-
通过pip list查看python中的所有包,包含parameterized即说明安装成功;或通过File->Setting->Project:pythonproject->Python Interpreter查看parameterized是否安装成功;或直接在文件中导parameterized查看是否安装成功(有时需重启Pycharm才能导包)
2、方式二:在Pycharm中安装parameterized
二、参数化
1、什么事参数化?
-
将测试数据定义到json文件使用
-
写在用例脚本中
2、参数化引入案例
(1)需求
-
定义一个实现加法操作的函数,并对该函数进行测试
-
要求对多组测试数据进行测试
(2)代码实现
(3)发现问题
-
一条测试数据就需要定义一个测试函数,代码冗余度太高
-
如果一个测试函数中测试多条数据,最终只会有一个测试结果
3、参数化的作用
-
通过参数的方式来传递测试数据,从而实现测试数据和用例脚本分离,并实现用例的重复执行
-
其实就是在书写用例方法时,用变量代替测试数据,在执行时再将测试数据传递给变量
4、参数化的使用方式
-
导包 ---> from parameterized import parameterizd
-
修改测试方法,将测试方法中的测试数据使用 变量表示
-
组织测试数据,格式[(),(),()],一个元组就是一组测试数据
-
参数化,在测试方法上使用装饰器@parameterized.expand(测试数据)
-
运行(直接在TestCase使用右键执行、或使用suite运行)
下面是组织测试数据的3种方式
5、案例:参数化+断言实现测试多组数据
# add.py中定义的add函数
def add(x,y):
return x+y
'''
1、导包
2、将测试方法中的测试数据用变量表示
3、组织测试数据,格式[(),(),()],一个元组就是一组测试数据
4、参数化,在测试方法上用装饰器@parameterized。expand(测试数据)
5、运行(直接在测试类或测试方法上运行,使用suite运行,使用unittest.main运行)
'''
import unittest
from unittest_csh.add import add
from parameterized import parameterized
data = [(1, 0, 1), (2, 0, 2), (3, 0, 4)]
class TestAdd(unittest.TestCase):
@parameterized.expand(data)
def test_add01(self, x, y, expected):
print('x={} y={} expected={}'.format(x, y, expected))
result = add(x, y)
self.assertEqual(result, expected)
if __name__ == '__main__':
unittest.main()
三、练习1
需求:
将测试数据定义为json文件,读取json文件,完成参数化
实现思路:
从json文件中读取数据,通过参数化的方式传到用例方法中,实现一个用例测试多组数 据,通过suite执行用例
- 定义add函数
# 定义在add.py文件中的函数
def add(x,y):
return x+y
- 定义json文件
[
{
"x": 1,
"y": 0,
"expected": 1
},
{
"x": 2,
"y": 0,
"expected": 2
},
{
"x": 3,
"y": 0,
"expected": 4
}
]
- 读取json文件,编写测试用例
import unittest
from unittest_csh.add import add
from parameterized import parameterized
import json
# 读取json文件中的测试数据
def data_link():
with open('add_data.json',encoding='utf-8') as f:
data_list = json.load(f)
#print(type(data_list)) #<class 'list'>
#print(data_list) #[{'x': 1, 'y': 0, 'expected': 1},{}]
new_list = []
for data in data_list: #data 字典
x = data.get('x')
y = data.get('y')
expect = data.get('expect')
new_list.append((x,y,expect))
#简单写法:new_list.append(tuple(data.values()))
#字典.values():可快速取到字典中所有的值
return new_list # new_list = [(1,0,1),(),()]
class TestAdd01(unittest.TestCase):
@parameterized.expand(data_link())
def test_add001(self,x,y,expect):
result = add(x,y)
print('x={} y={} expected={}'.format(x,y,expect))
self.assertEqual(expect,result)
- 执行测试用例
import unittest
from unittest_csh.addtest_adddata import TestAdd01
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestAdd01))
runner = unittest.TextTestRunner()
runner.run(suite)