pytest是python自带的单元测试框架,是unitest的升级版本

使用框架的目的是“提高效率”,可以实现:

  1. 环境初始化和数据清除
  2. 定制化执行测试用例
  3. 配置--分布式执行
  4. 自带html报告(可根据需要使用allure报告)

 

安装:

pip install pytest

pip install pytest-html    原生态报告模版

查看安装结果:pip show pytest

注意事项:

使用pytest框架,默认识别“test”,所以:

1.测试用例必须以test开头,例如:test_A

2.测试类必须以Test开头(第一个字母大写)

3.对应的py文件必须以test_开头,或者_test结尾的;

4.断言必须使用assert

5.方法必须使用test开头

import pytest  
def test_A():
    print('开始执行测试用例A')
    assert 1+2==3
if __name__=='__main__':
    pytest.main(['test_func.py',‘-s’])   #test_func.py是当前的文件,-s为输出信息,否则不会打印出print信息

pytest参数化

数据驱动:pytest有自带的装饰器可以实现参数化

1.  单个参数写法:@pytest.mark.parametrize('inData',[10,20])  #第一个参数为变量名称,第二个为参数值。不需要设置循环读取参数值,因为pytest的装饰器会自动循环读取

2.多个参数写法:(参数值以元组形式写)@pytest.mark.parametrize('第一个参数名称,第二个参数名称'),[(参数1值,参数2值),(参数1值,参数2值)]

import pytest
@pytest.mark.parametrize('a,b',[(1,2),(4,5)])
def test_a(a,b):
    print("开始执行测试用例")
    assert a+b==3
    print(“测试用例执行结束”)
if __name__=="__main__"
    pytest.main(['test.py','-v','-s'])

pytest运行指定测试用例

pytest可指定运行测试用例:

1.运行当前文件夹内的所有测试用例:pytest.main([文件夹名称/])

2.运行当前文件内的测试用例:pytest.main(['test.py'])

3.运行当前文件内的指定测试用例:pytest.main(['test.py::test_case'])

3.运行当前文件内指定类下的所有测试用例:pytest.main(['test.py::Test_class'])

4.运行当前文件内指定类下的指定测试用例:pytest.main(['test.py::Test_class::test_case'])

问题:

pycharm运行脚本时,python自动识别pytest框架,此时运行时会出现“run pytest in xxx.py",此时默认执行当前文件内的所有test用例。

pytest.maini()设置不生效

解决办法:

设置pytest.main([])后,点击pycharm的顶部菜单栏run-选择run xxx.py。这个时候就是按照pytest.main设置的模式执行指定测试用例

扩展:

在代码页面选中其中一条测试用例-就会出现:run pytest xxx.testcaseA,此时仅运行选中的测试用例(xxx为py文件名称)

 

pytest运行命令

常用参数说明 

     -v:说明:可以输出用例更加详细的执行信息,比如用例所在的文件及用例名称等

      -S:说明:输入我们用例中的调式信息,比如print的打印信息等

     -m :说明:执行特定的测试用例,”标记“

     -k: 说明:执行用例包含“关键字”的用例 ,"关键字"

     -q: 说明:简化控制台的输出

     --lf:当一次用例执行完成后,如果其中存在失败的测试用例,那么我们可以使用此命令重新运行失败的测试用例

     --ff:如果上次测试用例出现失败的用例,当使用--ff后,失败的测试用例会首先执行,剩余的用例也会再次执行一次

--html:生成原生态的测试报告

练习:

执行测试用例时,同步打印出脚本内的print信息:pytest.main(['-s test.py::test_caseA','--html=../report/xt.html'])

 

接口实战

测试用例一般来自:excel、yaml文件

1.从excel读取body,并形成一个列表list_data=[{第一个用例内容},{第二个用例内容}]

2.使用pytest装饰器,自动循环读取用例@pytest.mark.parametrize('data',list_data)

3.通过bat文件一件执行

4.allure展示报告