pytest命令行传参的方法有哪些,哪种好
Admin 2022-06-21 群英技术资讯 356 次浏览
{ {}}
的方式来进行调用。但是如果是使用自己写的测试框架中要如何实现呢?我想到的是如下三种方法。首先说明一下,以下三种方式均是通过python + pytest来实现的
conftest.py文件是pytest框架中很有用的一个东西,首先看下官方文档中的解释:
大概意思就是说,conftest.py文件供整个用例目录(conftest.py文件可以有多个,并且只在当前package下生效)使用而无需导入,也就是说在用例目录是conftest中的信息是公用的,例如:
a/conftest.py: def pytest_runtest_setup(item): # called for running each test in 'a' directory print("setting up", item) a/test_sub.py: def test_sub(): pass test_flat.py: def test_flat(): pass
运行后的结果:
pytest test_flat.py --capture=no # will not show "setting up"
pytest a/test_sub.py --capture=no # will show "setting up"
而我们就可以通过conftest + fixture函数来实现我们想要的效果了,具体代码如下:
# conftest.py # 定义一个全局变量,用于存储内容 global_data = {} @pytest.fixture def set_global_data(): """ 设置全局变量,用于关联参数 :return: """ def _set_global_data(key, value): global_data[key] = value return _set_global_data @pytest.fixture def get_global_data(): """ 从全局变量global_data中取值 :return: """ def _get_global_data(key): return global_data.get(key) return _get_global_data
简单说一下实现逻辑:
方法实现了,具体应该怎么使用呢?如下:
# test_get_set.py import requests import pytest def test_set(set_global_data): res = requests.get("http://www.baidu.com") status_code = res.status_code logger.info(f"请求返回状态码:{status_code}") set_global_data("status_code", status_code) def test_get(get_global_data): data = get_global_data("status_code") logger.info(f'通过get_global_data方法获取的值:{data}') if __name__ == '__main__': pytest.main(['-sv', 'test_get_set.py'])
返回结果:
test_get_set.py::test_set PASSED
2021-12-24 17:58:37.642 | INFO | cases.test_get_set:test_set:19 - 请求返回状态码:200
2021-12-24 17:58:37.643 | INFO | cases.test_get_set:test_get:25 - 通过get_global_data方法获取的值:200
test_get_set.py::test_get PASSED
============================== 2 passed in 0.06s ===============================
通过这种方式,便实现了用例间的参数传递问题。
在实际工作中,因为涉及到的接口、用例会很多,所以可以根据需要使用不同的conftest进行管理。并且存储的数据结构也需要进行规范区分,如使用方法名作为字典的key。
第二种方法,是使用pytest的tmpdir和tmpdir_factory两个夹具函数,同样是通过conftest文件来实现。仍然是先来看下官方文档针对这两个方法的说明:
简单来说,这两个方法的作用就是为每个测试方法创建一个临时目录用于存储自定义的文件,这个临时目录会默认保存3个sessions,之后就会按照创建的顺序删除旧的目录。看下官方的例子:
# content of test_tmpdir.py def test_create_file(tmpdir): p = tmpdir.mkdir("sub").join("hello.txt") p.write("content") assert p.read() == "content" assert len(tmpdir.listdir()) == 1 assert 0
# contents of conftest.py import pytest @pytest.fixture(scope="session") def image_file(tmpdir_factory): img = compute_expensive_image() fn = tmpdir_factory.mktemp("data").join("img.png") img.save(str(fn)) return fn # contents of test_image.py def test_histogram(image_file): img = load_image(image_file) # compute and test histogram
我在实际项目中的使用:
仍是在conftest.py文件中自定义一个夹具函数,返回结果是一个元组,p是tmpdir_factory方法返回的对象,转为字符串之后就是文件存储的路径。
自定义一个名为“apitest-tmp-dir”的文件夹用于存储文件
# conftest.py @pytest.fixture def tmp_factory(tmpdir_factory): """ 生成临时目录 """ p = tmpdir_factory.mktemp('apitest-tmp-dir') logger.info("当前临时文件的目录为:" + str(p)) return p, str(p)
在测试方法中的使用
# test_get_set.py import requests import pytest import json def test_set(tmp_factory): res = requests.get("http://www.baidu.com") status_code = res.status_code logger.info(f"返回状态码:{status_code}") logger.debug(tmp_factory) # 创建test_set.txt文件 a = tmp_factory[0].join("test_set.txt") # 将需要的内容写入到文件中 a.write({"status_code": status_code}) # 使用read()方法获取文件中的内容 logger.debug(a.read()) if __name__ == '__main__': pytest.main(['-sv', 'test_get_set.py'])
返回结果:
test_get_set.py::test_set 2021-12-24 18:24:39.292 | INFO | cases.conftest:tmp_factory:150 - 当前临时文件的目录为:/private/var/folders/_f/1d0lt83x1599bf6mcfppbwp40000gn/T/pytest-of-j/pytest-19/apitest-tmp-dir0
2021-12-24 18:24:39.347 | INFO | cases.test_get_set:test_set:32 - 返回状态码:200
2021-12-24 18:24:39.347 | DEBUG | cases.test_get_set:test_set:34 - (local('/private/var/folders/_f/1d0lt83x1599bf6mcfppbwp40000gn/T/pytest-of-j/pytest-19/apitest-tmp-dir0'), '/private/var/folders/_f/1d0lt83x1599bf6mcfppbwp40000gn/T/pytest-of-j/pytest-19/apitest-tmp-dir0')
2021-12-24 18:24:39.348 | DEBUG | cases.test_get_set:test_set:38 - {'status_code': 200}
PASSED
============================== 1 passed in 0.07s ===============================
创建的文件:
可以看到,tmpdir_factory会自动为我们创建一个目录,名字是`tmp_factory`方法中自定义的名称后面加0,同时它的上级目录会自动从pytest-0递增
说下这个办法的优缺点:
话说回来,都需要我自己去封装一个读取文件的方法了,为啥不干脆把读、写都自己来做呢?这样是否删除文件、删除几个、什么时候删除就完全由自己定义了啊,貌似会更方便。。。。。三、总结
综上所述,大家应该对这两种方法都有了一些了解,核心都是通过pytest的conftes.py文件来实现的。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
最近在整理我磁盘上的照片,发现不少猫照,突然觉得若能把这些猫照都挑出来,观察它们的成长轨迹也是一件不错的事情。一张一张的找实在是太费劲了,能不能自动化地找出来呢?本文将详细为大家讲讲,需要的可以参考一下
这篇文章主要介绍了Python和java 如何相互调用,下面文章见到那的对Python和java 相互调用的方法做了个小总结,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你有所帮助
题目[1]:格式输出练习。在交互式状态下完成以下练习。运行结果截图:题目[2]:格式输出练习。在.py的文件中完成以下练习代码:num=100print('%dtohexis%x'%(
这篇文章主要介绍了Python使用描述符实现属性类型检查,实例属性就是在一个类中将另一个类的实例作为该类的一个数属性,本文通过代码演示给大家介绍的非常详细,需要的朋友可以参考下
最近使用Python的过程中遇到了一些坑,例如用datetime datetime now()这个可变对象作为函数的默认参数,模块循环依赖等等。在此记录一下,
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008