Pytest 学习指南-allure学习指南
pytest
基本介绍
pytest框架是一个成熟,全面的测试框架,具有非常丰富的第三方插件,并且可以自定义扩展
比如:pytest-selenium
, pytest-html
, pytest-rerunfailures(失败case重复执行)
, pytest-xdist(多cpu分发)
pytest还以其简单灵活,上手简单著称,能够支持简单的单元测试和复杂的功能测试,支持参数化操作。
安装指南
pip install pytest
验证安装:
pytest --version # 会展示当前已安装版本
文件基本命名格式
默认满足以下条件:
测试文件满足:test_xxx.py
或xxx_test.py
格式,即以test_为前缀或_test为后缀
测试类满足:以Test开头
,且不能含有init方法
(定义class
时,要以T开头,不然pytest
框架不会识别该类,自然就不会进入该类内部进行搜索)
因为测试类里进行前后置操作不能通过init
等魔法函数,而是通过特定的函数setup_class
和teardown_class
前面半段指定了是前置操作还是后置操作,后半段则是指定了该操作的重复级别:
class
:类重复级别:该类中只执行一次
method
:测试方法重复级别:该类中每个测试用例(方法)执行一次
执行:在命令行执行pytest
命令时,会自动从当前目录及子目录中寻找符合上述约束的测试函数来执行。
模板:
import pytest #导入pytest模块
def test_beifan(): #测试用例
pass
class TestBaili: #测试套件
def test_a(self): #测试用例,第一个测试方法
pass
def test_b(self): #测试用例,第二个测试方法
pass
pytest框架断言
常用断言:
- assert xx:判断 xx 为真
- assert not xx:判断 xx 不为真
- assert a in b:判断 b 包含 a
- assert a == b:判断 a 等于 b
- assert a !=b:判断 a 不等于 b
pytest命令行执行
指定文件:
pytest ./xxx.py
指定方法
pytest ./xxx.py::类名::方法名
pytest ./xxx.py::TestData::test_demo1
### 常用命令参数
-v 输出用例更加详细的执行信息,比如用例所在文件和用例名称
-k 执行用例中包含'关键字'的用例
-s 输出用例中的调试信息,比如print打印消息,不加参数则不输出待执行的用例
-m 执行标记的内容,执行特定的测试用例,执行有相同标记的测试用例
-x 执行失败则停止执行,后面的用例不会被执行
--maxfail=n 执行失败n次后停止执行,n为最大程度接收失败的次数
--count=n 执行用例n次,n=2则执行两次
--lf (last failed) 重新执行上传失败的用例,若没有失败,则会全部跑
--ff (failed first) 重新运行所有用例,但是首先运行上传失败的用例
### 测试结果的标志
. 代表一个测试用例通过,..代表两个测试用例通过
s 代表skip,即用例跳过执行
F 即failure一般是断言发生错误
E error,一般是用例执行过程中报错
pytest 标记测试用例以及测试用例的指向执行
pytest的标记机制与用例执行的方法
pytest标记是需要通过pytest.mark
来标记使用的,pytest
为了应对各种测试场景也内置了许多标记。
-
参数化标记:
pytest.mark.parametrize
通过parametrize
可以将用例数据和用例执行的逻辑代码分离,并实现根据用例,自动生成测试用例 -
@pytest.mark.parametrize('item',[11,22,33,44,55,66]) def test_demo(item) assert item >50 用法: 格式:pytest.mark.parametrize('每个用例包含的变量列表,以引号括住,变量间以,号隔开',实参列表,当每组变量数量只有一个时,使用一维数组即可,无特殊包裹要求,以逗号隔开,若存在多个变量则输入二维数组即可。)
-
跳过用例执行:
pytest.mark.skip
通过skip
装饰的用例,在执行时会无条件跳过。可选参数reason:跳过测试函数的原因 -
@pytest.mark.skip def test_demo(): assert item>50 @pytest.mark.skip(reason='不需要执行') def test_demo1(): assert item>50
-
根据条件跳过用例:
pytest.mark.skipif
:skipif
可以根据条件来决定是否跳过用例的执行,如果条件为True则跳过测试函数执行。 参数:condition
:跳过条件,reason
:跳过的原因 -
a =10 @pytest.mark.skipif(a>20,reason='条件不成立,不执行') def test_demo(): assert item >50
-
标记预期失败的用例:
pytest.mark.xfail
:xfail
可以将测试用例标记为预期执行失败的用例.- 参数
-
condition
:将测试函数标记为xfail
的条件(True/False
) -
reason
:测试函数被标记为xfail
的原因 -
raises
:预期失败的异常类型 -
run
:是否应该实际执行函数,如果False
,该函数将始终xfail
并且不会被执行 -
strict
:严格模式(True或False)
-
a=10 @pytest.mark.xfail(a>20,reason='条件不成立,不执行',raises = AssertionError) def test_demo(): assert item>50
allure
安装与下载
需要下载本地文件,并且添加到环境变量里
windows:下载,解压,并配置环境变量:Releases · allure-framework/allure2 · GitHub
mac:brew install allure
环境变量:将bin目录纳入path路径中
python安装第三方依赖
win:pip install allure-pytest
mac:pip3 install allure-pytest
allure-pytest
依赖会自动安装Allure-pytest和Allure-python-commons
包,以生成与Allure 2
兼容的报告数据
基本用法
命令行执行,在进行pytest测试时,生成allure数据:
pytest --allure=./allure-results
命令行执行,将生成的allure数据解析出来,展示在浏览器中:
allure serve ./allure-results
Allure 注解
使用方法 | 参数值 | 参数说明 |
---|---|---|
@allure.epic() |
epic描述 | 敏捷里面的概念,定义史诗,往下是feature |
@allure.feature() |
模块名称 | 功能点的描述,往下是story
|
@allure.story() |
用户故事 | 用户固戍,往下是title
|
@allure.title |
用例的标题 | 重命名HTML报告名称 |
@allure.testcase() |
测试用例的链接地址 | 对应功能测试用例系统里的case |
@allure.issue |
缺陷 | 对应缺陷管理系统里面的链接 |
@allure.description() |
用例描述 | 测试用例的描述 |
@allure.step() |
操作步骤 | 测试用例的步骤 |
@allure.severity() |
用例等级 | blocker,critical,normal,minor,trivial |
@allure.link() |
链接 | 定义一个链接在测试报告展示 |
@allure.attachment() |
附件 | 报告添加附件 |
import allure
import pytest
@allure.feature('test_success')
def test_success():
"""this test succeeds"""
assert True
@allure.feature('test_failure')
def test_failure():
"""this test fails"""
assert False
@allure.feature('test_skip')
def test_skip():
"""this test is skipped"""
pytest.skip('for a reason!')
@allure.feature('test_broken')
def test_broken():
raise Exception('oops')
if __name__ == '__main__':
# pytest.main(["-s","allure-test.py"])
'''
-q: 安静模式, 不输出环境信息
-v: 丰富信息模式, 输出更详细的用例执行信息
-s: 显示程序中的print/logging输出
'''
pytest.main(['-s', '-q','test_allure02.py','--clean-alluredir','--alluredir=allure-results'])
os.system(r"allure generate -c -o allure-report")
在报告中添加图片附件,文件附件
安装第三方依赖
pip install pytest-allure-adaptor
@allure.attach的用法
-
allure.attach(body,name,attachment_type,extension)
参数说明:
-
body:
要写入附件的内容 -
name:
附件名字 -
attachment_type:
附件类型,是allure.attachment_type
其中一种 -
extension:
附件的拓展名
-
-
allure.attach.file(source,name,attachment_type,extension)
参数说明:
-
source:
文件路径,相当于传一个文件 -
name:
附件名字 -
attachment_type:
附件类型,是allure.attachment_type
其中的一种 -
extension:
附件的拓展名
-
使用范例(添加文本文件)
# file_name: test_allure_attachments.py
import pytest
import allure
@pytest.fixture()
def attach_for_text():
allure.attach(body="这是一段文本,setUp", name="test文本01", attachment_type=allure.attachment_type.TEXT)
yield
allure.attach(body="这是一段文本,teardown", name="test文本02", attachment_type=allure.attachment_type.TEXT)
def test_attachment_text(attach_for_text):
pass
if __name__ == '__main__':
pytest.main(['-s', 'test_allure_attachments.py'])
使用范例(添加图片和html)
# file_name: test_allure_attachments.py
import pytest
import allure
def test_mutiple_attachments():
allure.attach.file("./pytest_study/image/pikaqiu.jpg", attachment_type=allure.attachment_type.JPG)
allure.attach("<html><body><font color='red'>这是一段html</font></body></html>",
attachment_type=allure.attachment_type.HTML)
if __name__ == '__main__':
pytest.main(['-s', 'test_allure_attachments.py'])