python+pytest+allure接口测试框架(不断完善中)

一、环境搭建

本地安装相关依赖包,pytest、requests、allure-pytest、pytest-ordering等

二、编写脚本

1、测试文件以test_开头(以_test结尾也可以),注意必须有下划线_
2、测试类以Test开头,并且不能带init方法
3、测试方法以test_开头
4、断言使用基本的assert即可

常见断言: 
assert xx:判断xx为真
   assert not xx:判断xx不为真
   assert a in b:判断b包含a
   assert a == b:判断a等于b
  assert a !=b:判断a不等于b

三、yaml文件编写&读取

yaml文件编写

user:
  password:123456’
  username: vivi

文件读取

# coding=utf-8
import yaml
import os

filename = os.getcwd() + "\data\config.yaml"
print (filename)

def read_yaml(filename):
    with open(filename,encoding='utf-8') as f:
        data = yaml.load(f.read(),Loader=yaml.FullLoader)
    print (type(data))
    print(data)

if __name__ == "__main__":
    read_yaml(filename)

四、pytest标记【参考博客:https://blog.csdn.net/qq_42610167/article/details/101204066】

1、@pytest.mark.xfail :标记失败,如果用例失败,则执行后显示xfail;若用例成功,则执行后显示xpath。如下图
使用场景,功能未完成,或者测试实际失败的情况
python+pytest+allure接口测试框架(不断完善中)_第1张图片
2、@pytest.mark.skip:跳过执行该用例
使用场景:跳过执行;某些平台无法执行;依赖的外部资源不可用;某些版本中执行,其他版本跳过

五、confest&fixture

新建conftest.py,文件内写入公共的函数,如下:(这个文件会找其同级以及文件内的下一级以test_xx.py或者xx_test.py的文件,根据公共函数适用范围执行公共函数代码)

#coding = utf-8
import pytest

@pytest.fixture(scope="module")
def open_url():
    print ("打开url")
    yield "lallaa"
    print ("关闭浏览器")

test_xx.py文件编写方式1,使用usefixtures,如下:

#coding=utf-8
import pytest

@pytest.mark.usefixtures("open_url")
class Test_Pytest():
	def test_get_page(self,):
	        print("----start------")
	        print("test_get_page方法执行" )
	        assert 1==1
                
if __name__=="__main__":
    pytest.main(['-s','-r','test_xx.py'])

test_xx.py文件编写方式2,直接传参,如下:

def test_passport(open_url):
    data = open_url
	print(data)

注:
1、如果一个方法或者一个class用例想要同时调用多个fixture,可以使用@pytest.mark.usefixture()进行叠加。注意叠加顺序,先执行的放底层,后执行的放上层。
2、如果fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。

方法三:fixture自动使用autouse=True

@pytest.fixture(autouse=True)
def get_page(login):

六、装饰器

1、装饰函数

def use_logging(func):
  def _deco(*args,**kwargs):
    print("%s is running" % func.__name__)
    a = func(*args,**kwargs)
    print (a)
    # return  a["kk"]
  return _deco

@use_logging
def set_value(a,b):
   print('i am bar:%s' % (a + b))
   return 3
   
if __name__ == "__main__":
  set_value(1, 2)

输出结果

set_value is running
i am bar:3
3

2、装饰类

def use_logging(func):
  def _deco(*args,**kwargs):
    print("%s is running" % func.__name__)
    a = func(*args,**kwargs)
    print (a)
    return  a
  return _deco

@use_logging
class ValuePool():
  def set_value(self,a,b):
    print('i am bar:%s' % (a + b))
    return 3

if __name__ == "__main__":
  kk = ValuePool().set_value(1, 2)
  print (kk)

输出结果

ValuePool is running
<__main__.ValuePool object at 0x000002229060C820>
i am bar:3
3

七、运行和生成报告

1.进入项目目录(和case在同一层级),执行 执行命令:pytest
2.allure serve {报告路径} 如 “allure serve report”
3.在python代码中实现
# pytest.main([‘-s’, ‘-q’, ‘–html=…/result//report.html’,‘test_all.py’])
pytest.main([‘-q’, ‘-s’, ‘–alluredir=…/reports/allure’,‘test_all.py’])
os.system(“allure generate …/reports/allure/ -o …/reports/html --clean”)
# 自动打开生成的测试报告
# os.system(‘allure serve allure’)
遇到的问题,打开报告页面空白:
原因:1、allure版本过低更新版本;2、pycharm中运行,需要修改运行工具位unittests。(File | Settings | Tools | Python Integrated Tools-Default test runner)

八、jenkins集成

你可能感兴趣的:(python)