pytest测试框架系列 - Pytest 自定义mark标记筛选用例实战
## 为什么要自定义标记
自定义标记的目的主要为了解决运行用例时,可以根据不同场景运行不同用例。
问题:用例执行时可以按照级别、场景、功能、模块分类,应该如何设置呢?带着问题我们先看下面的。
## pytest 里面自定义标记 (建议掌握程度:☆☆☆☆☆)
用法:将@pytest.mark.标记名称 放到测试函数或者类上面
使用:
- 执行时加上 `-m 标记名` 进行用例筛选,例如加上 `-m app` ,就执行标记名为app的用例。
- 如果不运行app相关的用例,则加上 `-m "not app"`。
- 需要运行多个标记则加上`-m "app or web"`,代码运行标记为app或者web的用例。
- 需要运行多个标记的,则加上 `-m "app and web"`,代表用例需要同时包含app和web的标记。
示例:
```python
# !/usr/bin/python3
# _*_coding:utf-8 _*_
""""
# @Time :2021/7/5 23:24
# @Author : king
# @File :test_mark.py
# @Software :PyCharm
# @blog :https://blog.csdn.net/u010454117
# @WeChat Official Account: 【测试之路笔记】
"""
import pytest
@pytest.mark.web
def test_web():
assert "web" in "web test!"
@pytest.mark.app
class TestApp:
def test_h5(self):
assert 'h5' in "h5, test"
def test_wx(self):
assert 'wx' in 'wx ,hello'
if __name__ == '__main__':
pytest.main()
```
cmd命令窗口输入: `pytest -v -m app test_mark.py` 执行结果为:
![执行结果](https://www.icode9.com/i/ll/?i=20210705233422740.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA0NTQxMTc=,size_16,color_FFFFFF,t_70)
cmd命令窗口输入: `pytest -v -m "not app" test_mark.py` 执行结果为:
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210705234013683.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA0NTQxMTc=,size_16,color_FFFFFF,t_70)
通过上面例子,是不是已经解决上面的问题了。
发现执行结果里面是不是有提示warnings?如何解决呢?
```python
=========================================================================== warnings summary ===========================================================================
test_mark.py:14
E:\pytest_demo\class_03\test_mark.py:14: PytestUnknownMarkWarning: Unknown pytest.mark.web - is this a typo? You can register custom marks to avoid this warning - for
details, see https://docs.pytest.org/en/stable/mark.html
@pytest.mark.web
test_mark.py:19
E:\pytest_demo\class_03\test_mark.py:19: PytestUnknownMarkWarning: Unknown pytest.mark.app - is this a typo? You can register custom marks to avoid this warning - for
details, see https://docs.pytest.org/en/stable/mark.html
@pytest.mark.app
-- Docs: https://docs.pytest.org/en/stable/warnings.html
```
## 解决自定义标记 warnings信息
- 通过注册标记
- 通过框架配置文件pytest.ini
### 通过注册标记
说明:在`conftest.py`添加如下代码:
- 单个注册标记
```python
def pytest_configure(config):
config.addinivalue_line("markers", "web:web相关用例")
```
- 批量注册标记
```python
def pytest_configure(config):
marker_list = ["web", "app"] # 标签名集合
for markers in marker_list:
config.addinivalue_line("markers", markers)
```
示例:
`conftest.py` 文件放到case目录,添加内容
```python
# !/usr/bin/python3
# _*_coding:utf-8 _*_
""""
# @Time :2021/7/5 23:55
# @Author : king
# @File :conftest.py
# @Software :PyCharm
# @blog :https://blog.csdn.net/u010454117
# @WeChat Official Account: 【测试之路笔记】
"""
def pytest_configure(config):
marker_list = ["web", "app"] # 标签名集合
for markers in marker_list:
config.addinivalue_line("markers", markers)
```
再次cmd命令窗口输入: `pytest -v -m app test_mark.py` 执行结果为:
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210705235735527.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA0NTQxMTc=,size_16,color_FFFFFF,t_70)
### 通过框架配置文件pytest.ini
在项目根目录创建pytest.ini文件,内容添加为:
```python
[pytest]
markers=
web: web 测试用例
app: app测试用例
```
目录:
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210706000144792.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA0NTQxMTc=,size_16,color_FFFFFF,t_70)
再次cmd命令窗口输入: `pytest -v -m app test_mark.py` 执行结果为:
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210706000224407.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA0NTQxMTc=,size_16,color_FFFFFF,t_70)
## 总结
- 为什么要自定义标记,主要为了解决运行用例时,可以根据不同场景运行不同用例
- pytest 里面自定义标记定义和使用,将@pytest.mark.标记名称 放到测试函数或者类上面,使用在命令行加入 `-m` 参数
- 解决自定义标记 warnings信息,通过`conftest.py`文件注册标记或者pytest.ini配置文件配置标记
以上为内容纯属个人理解,如有不足,欢迎各位大神指正,转载请注明出处!
>**如果觉得文章不错,欢迎关注微信公众号,微信公众号每天推送相关测试技术文章**
>个人微信号:搜索 【测试之路笔记】