在 Pytest 中测试 AWS s3 PUT 和下载
Test AWS s3 PUT and Download in Pytest
我有以下功能。
def test_download(test_args):
mock = mock_s3()
mock.start()
conn = boto3.resource('s3', region_name='us-west-2')
conn.create_bucket(Bucket=test_args.source_bucket)
s3.Object(test_args.source_bucket, 'testing.txt').put(
Body=open("testing.txt", 'rb'))
handler_client = HandlerClient(test_args)
handler_client.get_s3_file()
使用from moto import mock_s3
我去测试的时候报错了。
def add_auth(self, request):
if self.credentials is None:
> raise NoCredentialsError
E botocore.exceptions.NoCredentialsError: Unable to locate credentials at line
> `conn.create_bucket(Bucket=test_args.source_bucket)`
我试过装饰器
以及
with moto.mock_s3():
所有人都得到同样的错误。我如何解决这个问题来创建一个假的桶,将一个项目放入其中。
不幸的是,moto
没有模拟 boto3
的授权部分。因此,您需要设置 AWS 授权链的某些部分,例如导出 AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
。我们通常会在每次测试前设置一个fixture来更新环境:
@pytest.fixture(scope='function')
def context():
context = attrdict.AttrMap()
orig_env = os.environ.copy()
os.environ['AWS_ACCESS_KEY_ID'] = 'foo'
os.environ['AWS_SECRET_ACCESS_KEY'] = 'bar'
context.os = {'environ': os.environ}
yield context
os.environ = orig_env
导入部分正在设置AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
,然后yield
ing,然后将os.environ
恢复到原来的状态。您不必使用 context = attrdict.AttrMap
部分,我们喜欢这样,因此使用此夹具的测试函数可以访问测试 os.environ
(和其他测试)属性。
我有以下功能。
def test_download(test_args):
mock = mock_s3()
mock.start()
conn = boto3.resource('s3', region_name='us-west-2')
conn.create_bucket(Bucket=test_args.source_bucket)
s3.Object(test_args.source_bucket, 'testing.txt').put(
Body=open("testing.txt", 'rb'))
handler_client = HandlerClient(test_args)
handler_client.get_s3_file()
使用from moto import mock_s3
我去测试的时候报错了。
def add_auth(self, request):
if self.credentials is None:
> raise NoCredentialsError
E botocore.exceptions.NoCredentialsError: Unable to locate credentials at line
> `conn.create_bucket(Bucket=test_args.source_bucket)`
我试过装饰器 以及
with moto.mock_s3():
所有人都得到同样的错误。我如何解决这个问题来创建一个假的桶,将一个项目放入其中。
moto
没有模拟 boto3
的授权部分。因此,您需要设置 AWS 授权链的某些部分,例如导出 AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
。我们通常会在每次测试前设置一个fixture来更新环境:
@pytest.fixture(scope='function')
def context():
context = attrdict.AttrMap()
orig_env = os.environ.copy()
os.environ['AWS_ACCESS_KEY_ID'] = 'foo'
os.environ['AWS_SECRET_ACCESS_KEY'] = 'bar'
context.os = {'environ': os.environ}
yield context
os.environ = orig_env
导入部分正在设置AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
,然后yield
ing,然后将os.environ
恢复到原来的状态。您不必使用 context = attrdict.AttrMap
部分,我们喜欢这样,因此使用此夹具的测试函数可以访问测试 os.environ
(和其他测试)属性。