Boto3 利用 Pytest + Moto 測試 AWS API

2020-05-03 AWS, Python

最近利用 Boto3 開發 AWS API 遇到了一個窘境,這個開發專案是用於實現 AWS Organizations 建立 Linked-Account 的自動化 Lambda,但是在開發過程中,尤其是在寫 create_account() 時,總不能測試一次就建一個 AWS Account …

後來找了一下社群,發現了 Moto 這個 AWS 測試的框架,可以讓你在 Unit Testing 模擬 AWS API 情境,多數的 API 完成度都還算高,尤其是我想測試的 create_account() 相關 API 都有支援。

因為是測試,所以搭配 Pytest + Moto 作為我的 Unit Testing 框架,依然可以透過 Pypi 安裝 Moto:

pip install moto

就拿我的案例來說,範例程式碼:

# account_manager.py
import boto3

def create_account(accountName='new_account', mail='admin@shazi.info'):
    org = boto3.client('organizations')
    org.create_account(
            Email=mail,
            AccountName=accountName
        )

moto 的測試程式碼:

# tests/test_account_manager.py
import boto3
import sure
from moto import mock_organizations
import account_manager

@mock_organizations
def test_create_account():
    client = boto3.client("organizations", region_name=default_region)
    client.create_organization(FeatureSet="ALL")

    response = account_manager.create_account(
                   accountName='new_account',
                   mail='admin@shazi.info')["CreateAccountStatus"]

    response["AccountName"].should.equal('new_account')
    response["State"].should.equal('SUCCEEDED')
    response['AccountId'].should.have.length_of(12)
  • @mock_organizations 模擬出 organizations 的環境
  • test case 中驗證了 create_account() 返回的值

透過 moto 就可以先對 API 先進行開發,而不是還在開發中就一直對 AWS API 執行,減少許多執行後要收尾的困擾 … 當然上線後仍然要對 AWS API 執行動作。

Reference

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱