У меня есть эта функция, которая загружает архивный файл в корзину S3:

def upload_file_to_s3_bucket(self, bucket, file, key, log):
    if not os.path.exists(file):
        log.error("File '%s' does not exist." % file)
        tools.exit_gracefully(log)
    log.info("Uploading file '%s' to bucket '%s' ..." % (file, bucket))
    try:
        self._s3.upload_file(file, bucket, key)
    except botocore.exceptions.ClientError as e:
        log.error("Unexpected uploading error : %s" % e)
        tools.exit_gracefully(log)
    log.info("Uploading finished.")

Я хочу сделать для него модульный тест, и это то, что я мог бы написать до сих пор:

class TestUploadFilesToS3(unittest.TestCase):
    """ Tests unitaires upload_file_to_s3_bucket"""


    def setUp(self):
        conf.LOG_FILE = "/tmp/test.log"
        conf.BUCKET_OUTPUT="name.of.the.bucket"
        conf.Conf.get_level_log()
        self.log = logger(conf.LOG_FILE, conf.LEVEL_LOG).logger
        tools.create_workdir(self.log)
        conf.WORKDIR = os.path.join(conf.LOCAL_DIR, "files/output")
        archive = "file_archive.tar.gz"
        archivePath = "/tmp/clients/file_archive.tar.gz"
        _aws = None

    def tearDown(self):
        tools.delete_workdir(self.log)
        os.remove(conf.LOG_FILE)


    def test_upload_file_to_s3_bucket_success(self):
        self._aws.upload_file_to_s3_bucket(conf.BUCKET_OUTPUT, archivePath, archive, self._log)

Чтобы выполнить модульный тест, я не знаю, какую функцию Assert я должен использовать в тестовой функции test_upload_file_to_s3_bucket_success и что я должен точно сравнивать. Могу ли я, например, проверить, существует ли URL файла или нет ...? есть идеи? Спасибо

4
JavaQueen 10 Янв 2017 в 12:47

3 ответа

Лучший ответ

Вот клип из теста, который я написал для функции загрузки s3

    self.ti.uploadTemplate(contentsOfFile) # this is what is being tested
    # also supplied from elsewhere "contentsOfFile" and "nameOfFile"
    # bucket is assumed to be called "cloud-test-cf"

    s3 = boto3.resource('s3')
    mytname = nameOfFile
    obj = s3.Object(bucket_name='cloud-test-cf', key=mytname)
    response = obj.get()
    self.assertEqual(response['ContentLength'], len(contentsOfFile))
    remoteData = response['Body'].read()
    self.assertEqual(remoteData, contentsOfFile)

Как вы можете видеть, он получает файл сразу после использования «uploadTemplate». Если вы используете те же настройки региона / AZ, то он должен работать нормально, см. http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel

Метод unittest для этого теста использует такой декоратор

@unittest.skipIf(
         not(boto3.session.Config().region_name),
         "aws creds not loaded")
def testuploadTemplate(self):
    #....test code here

Этот декоратор означает, что если пакет unittest запущен, но ключи AWS недоступны, этот конкретный тест пропускается

0
Vorsprung 10 Янв 2017 в 12:59

Я бы порекомендовал использовать заглушку botocore. На этой странице документации есть несколько примеров, которые помогут вам начать работу.

1
Jordon Phillips 10 Янв 2017 в 16:48

Вы можете смоделировать взаимодействия с S3, используя эту библиотеку:

https://github.com/spulec/moto

2
Igor Pomaranskiy 10 Янв 2017 в 12:27