gpt4 book ai didi

python - `pytest` : Downloading a test file once, 并将其用于多个测试

转载 作者:行者123 更新时间:2023-12-04 13:12:40 26 4
gpt4 key购买 nike

我正在使用 pytest 为我正在开发的包运行测试用例。测试使用我已保存为 github Assets 的小图像文件。下面的代码工作得很好,但我认为 pytest 每次运行新测试时都会下载图像,这会占用不必要的时间和资源。我试图弄清楚如何下载文件一次,然后在测试用例之间共享它

这是一些示例代码。

# -- in conftest.py --
import sys
import pytest
import os
import shutil
import requests

@pytest.fixture(scope="function")
def small_image(tmpdir):
url = 'https://github.com/.../sample_image_small.tif'

r = requests.get(url)

with open(os.path.join(str(tmpdir), 'sample_image_small.tif'), 'wb') as f:
f.write(r.content)

return os.path.join(str(tmpdir), 'sample_image_small.tif')

然后这里有一些非常简单的测试用例,应该能够共享相同的图像。

# -- test_package.py --
import pytest
import os

@pytest.mark.usefixtures('small_image')


def test_ispath(small_image, compression):

assert os.path.exists(small_image)

def test_isfile(small_image, compression):

assert os.path.isfile(small_image)

现在我相信 pytest 会尝试自行隔离每个测试,这就是导致文件重复下载的原因。我试图设置 @pytest.fixture(scope="module") 而不是 function 但这会产生奇怪的错误:

ScopeMismatch: You tried to access the 'function' scoped fixture 'tmpdir' with a 'module' scoped request object, involved factories

有没有更好的方法来设置测试,这样我就不会一遍又一遍地下载文件?

最佳答案

首先,事先说明:旧的 tmpdir/tmpdir_factory fixture 对的更好替代方案是 tmp_path/tmp_path_factory 处理 pathlib 对象而不是弃用的 py.path,参见 Temporary directories and files .

其次,如果你想处理 session 范围(或模块范围)的文件,tmp*_factory fixture 就是为此而设计的。示例:

@pytest.fixture(scope='session')
def small_image(tmp_path_factory):
img = tmp_path_factory.getbasetemp() / 'sample_image_small.tif'
img.write_bytes(b'spam')
return img

sample_image_small.tif 现在将在每次测试运行时写入一次。


当然,正如@MrBean Bremen 在他的回答中所建议的,使用 tempfile 没有任何问题,这只是做同样事情的替代方法,但仅使用标准 pytest固定装置。

关于python - `pytest` : Downloading a test file once, 并将其用于多个测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63417661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com