我们在做接口测试时,有时会遇到涉及用例特别多的时候,每个用例都去手动调一遍,很费时费力,也是不现实的,这篇文章我们就解决下这种费时费力的情况.
一、业务需求
某所大学通信系共2个班级,刚考完某一门课程,想通过“性别”、“班级”和“成绩”这三个查询条件对通信系这门课程的成绩分布,男女比例或班级比例进行人员查询:
根据“性别”=“男,女”进行查询
根据“班级”=“一班,二班”查询
根据“成绩”=“及格,不及格”查询
按照传统设计——全部测试
分析上述测试需求,有3个被测元素,被测元素我们称为因素,每个因素有两个取值,我们称之为水平值,所以全部测试用例个数是2*2*2=8,参见下表
序号 | 性别 | 班级 | 成绩 |
1 | 女 | 1班 | 及格 |
2 | 女 | 1班 | 不及格 |
3 | 女 | 2班 | 及格 |
4 | 女 | 2班 | 不及格 |
5 | 男 | 1班 | 及格 |
6 | 男 | 1班 | 不及格 |
7 | 男 | 2班 | 及格 |
8 | 男 | 2班 | 不及格 |
如果有10个因素,每个因素有2个水平取值,那么我们需要组合2*2*2*2*2*2*2*2*2*2=1024个用例,这样去实现是不可能的,大家是如何处理这种情况的?
二、利用pytest装饰器@pytest.mark.parametrize实现快速生成所有正交测试用例可以解决这种问题,我们看到脚本生成的用例和上面手动列的用例完全一样,这样我们就可以根据需求中因数和因数水平值,快速生成所有正交测试用例
@pytest.mark.parametrize('因数1字段',['因数1的水平值1','因数1的水平值2'])
@pytest.mark.parametrize('因数2字段',['因数2的水平值1','因数2的水平值2'])
……
这样有几个因素就写几个装饰器,然后每个装饰器里分别放入对应因数的水平值,组成不同的测试用例data,一次调用可出所有测试用例结果,可实现快速接口测试,是不是很方便呢。
import pytestclass Test(object):@pytest.mark.parametrize('sex',['男','女'])@pytest.mark.parametrize('classes ', ['一班','二班'])@pytest.mark.parametrize('score', ['及格', '不及格'])def test(self,sex,classes,score):data={'sex':'','classes':'','score':''}data['sex']=sexdata['classes'] = classesdata['score'] = scoreprint(data)
if __name__=="__main__":pytest.main(["-s","test02.py"])"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test02.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
plugins: allure-pytest-2.8.5, html-1.22.0, metadata-1.8.0
collected 8 itemstest02.py {'classes': '一班', 'score': '及格', 'sex': '男'}
.{'classes': '一班', 'score': '及格', 'sex': '女'}
.{'classes': '二班', 'score': '及格', 'sex': '男'}
.{'classes': '二班', 'score': '及格', 'sex': '女'}
.{'classes': '一班', 'score': '不及格', 'sex': '男'}
.{'classes': '一班', 'score': '不及格', 'sex': '女'}
.{'classes': '二班', 'score': '不及格', 'sex': '男'}
.{'classes': '二班', 'score': '不及格', 'sex': '女'}
.============================== 8 passed in 0.26s ==============================Process finished with exit code 0