如何使用 mock 测试 boto3 资源下载文件 404error 测试?
how to boto3 resource download file 404error test using mock?
我想测试 s3 资源 download_file :)
这是我的代码
def logfile_downloader():
s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket)
for object in bucket.objects.filter(Prefix='logs/access_2018'):
try:
bucket.download_file(object.key, 'logs/' + save_path + '/' + object.key.split('/')[-1])
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == "404":
click.echo(click.style("The object does not exist.", bg="white", fg="red"))
else:
raise
当我使用 python mock 进行测试时,测试通过了
@mock.patch('boto3.resource')
def test_log_downloader(mock_resource):
logfinder._log_downloader()
assert mock_resource.called
但是,覆盖率不是 100%,, 因为 botocore.exceptions.ClientError 没有测试
所以我创建了一个测试
@mock.patch('s3.Bucket.download_file')
def test_log_downloader_404(mock_download_file):
mock_download_file.return_value = 404
logfinder.log_downloader()
assert mock_download_file.called
但是失败了
ModuleNotFoundError: No module named 's3'
我认为 mock 在 运行 download_file
函数时会引发错误,
所以我找到 download_file 路径 http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html#more-info
但测试无法导入 s3 模块
请告诉我一些建议谢谢
s3
不是模块,boto3
是。我想和你一样,模拟一个 500 响应 botocore.exceptions.ClientError
对象。这是我的做法(我更新了我的代码以匹配您的代码,因为它们非常相似):
import botocore
def test_log_downloader_500():
with mock.patch('boto3.s3.transfer.S3Transfer.download_file') as download_file:
error_response = {'Error': {'Code': '500'}}
side_effect = botocore.errorfactory.ClientError(error_response, 'unexpected')
download_file.side_effect = side_effect
with pytest.raises(botocore.errorfactory.ClientError):
logfinder.log_downloader()
这将涵盖 else raise
部分。只需通过替换上述值对 404 错误执行相同的操作,您将涵盖 404 条件
我想测试 s3 资源 download_file :)
这是我的代码
def logfile_downloader():
s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket)
for object in bucket.objects.filter(Prefix='logs/access_2018'):
try:
bucket.download_file(object.key, 'logs/' + save_path + '/' + object.key.split('/')[-1])
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == "404":
click.echo(click.style("The object does not exist.", bg="white", fg="red"))
else:
raise
当我使用 python mock 进行测试时,测试通过了
@mock.patch('boto3.resource')
def test_log_downloader(mock_resource):
logfinder._log_downloader()
assert mock_resource.called
但是,覆盖率不是 100%,, 因为 botocore.exceptions.ClientError 没有测试
所以我创建了一个测试
@mock.patch('s3.Bucket.download_file')
def test_log_downloader_404(mock_download_file):
mock_download_file.return_value = 404
logfinder.log_downloader()
assert mock_download_file.called
但是失败了
ModuleNotFoundError: No module named 's3'
我认为 mock 在 运行 download_file
函数时会引发错误,
所以我找到 download_file 路径 http://boto3.readthedocs.io/en/latest/guide/s3-example-download-file.html#more-info
但测试无法导入 s3 模块
请告诉我一些建议谢谢
s3
不是模块,boto3
是。我想和你一样,模拟一个 500 响应 botocore.exceptions.ClientError
对象。这是我的做法(我更新了我的代码以匹配您的代码,因为它们非常相似):
import botocore
def test_log_downloader_500():
with mock.patch('boto3.s3.transfer.S3Transfer.download_file') as download_file:
error_response = {'Error': {'Code': '500'}}
side_effect = botocore.errorfactory.ClientError(error_response, 'unexpected')
download_file.side_effect = side_effect
with pytest.raises(botocore.errorfactory.ClientError):
logfinder.log_downloader()
这将涵盖 else raise
部分。只需通过替换上述值对 404 错误执行相同的操作,您将涵盖 404 条件