最近利用 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