- ã¯ããã«
- åæç¥è
- å°å ¥
- pytest
- moto
- ç¶æ³è¨å®
- ãã¹ã対象ã®ã³ã¼ã
- ãã¹ãã¡ã½ãããæ¸ã
- ãã£ã¯ã¹ãã£ã¼ãæ¸ã
- ãã¹ããå®è¡ãã¦ã¿ã
- ãã¾ã
- ã¾ã¨ã
- åè
ã¯ããã«
ããã«ã¡ã¯ãæè¡4課ã®ä¿ç°ï¼ã»ã ï¼ã§ãã
çæ§ã¯ç¾å¨è©±é¡æ²¸é¨°ä¸ã®æ ç» TENET ï¼ããããï¼ããã観ã«è¡ããã¾ããã§ããããï¼æé«ã«æé«ã§ãã®ã§ãçæ§ãä¸å¯ã«ã注æã®ããæ¯éã¨ã観ã¦ããã ãããã§ããããã¦èå¯ãèªãåãã¾ãããã
ã¨ããããã§ä»æ¥ã¯ pytest 㨠moto ã§åªåãã¦ããããã¨æãã¾ãã
å ·ä½çã«ã¯ DynamoDB ã¸ã®æä½ã moto ã§ã¢ãã¯ãã¦ã pytest ã§åä½ãã¹ããããµã³ãã«ããç´¹ä»ãã¾ãã
åæç¥è
æç« ãç¡éã«å¢ãããã¨ã¯é¿ãããããã以ä¸ã®ç¥èããæã¡ã®ãã¨ãåæã¨ããã¦ããã ãã¾ãã
- Python ï¼ã®åºæ¬çãªæ¸ãæ¹ï¼
- boto3
- åä½ãã¹ãã®æ¦å¿µ
å°å ¥
AWS Lambda ã使ããéã«ãã¹ãã³ã¼ããæ¸ããã¨ã¯ã¨ã¦ã大äºã§ãããã Lambda ã§ã¯å¾ã ã«ã㦠boto3 ã§æ§ã 㪠AWS ãªã½ã¼ã¹ãæä½ããå¦çï¼ã¤ã¾ãå¤é¨ã® API ãå©ãå¦çï¼ãç»å ´ãã¾ãã ãã®ãããªã³ã¼ãã«å¯¾ãã¦åä½ãã¹ãã宿½ããéã«ã¯ãåºæ¬çã«å¤é¨ã® API ã mock ãããã¨ã«ãªãã¾ãã
ä»å㯠DynamoDB ã«ã¯ã¨ãªãçºè¡ãã¦ã¢ã¤ãã ãåå¾ããã·ã³ãã«ãªå¦çã mock ãã¦ã¿ã¾ãã
pytest
Python ã®æ¨æºã©ã¤ãã©ãªã« unittest ã¨ãããã®ããããããèªä½å²ã¨é«æ©è½ã§åºæ¬çãªãã¨ã¯ã ãããã§ããã®ã§ããããã以å¤ã«ã¤ã«ãããã¼ã«ã¨ã㦠pytest ã¨ãããã®ãããã¾ãã ããã£ã¡ãã£ã«é«æ©è½ãªã®ã§æ £ããã¾ã§ã¯ä½ããã£ã¦ãããåãããªãã¦å°ãè¦å´ãã¾ãããããã«æ £ãã¾ãã®ã§ä»å㯠pytest ã使ã£ã¦ããã¾ãã
Lambda ã®åä½ãã¹ãã§å©ç¨ããå ´åã¯ãããã¤ããã±ã¼ã¸ã«å«ããå¿
è¦ã¯ãªãã®ã§ãä¾ãã° Pipenv ã使ã£ã¦ããé㯠--dev
ãªãã·ã§ã³ãä»ãã¦ä¸ç·ã«ãããã¤ããã©ã¤ãã©ãªã¨åºå¥ãã¾ãããã
$ pipenv install pytest --dev
å®è¡ããã¨ãã¯ãããªæãã§ãï¼ #
以éã¯ã³ã¡ã³ãã§ãï¼
$ pytest # test_... ã¨åã®ã¤ããã¢ã¸ã¥ã¼ã«å ã® test_... ã¨åã®ã¤ãããã¹ãã¡ã½ãããå ¨é¨å®è¡ $ pytest tests/test_main.py # ã¢ã¸ã¥ã¼ã«åãæå®ãã $ pytest tests/test_main.py::test_get_item # ã¢ã¸ã¥ã¼ã«ã¨é¢æ°åãæå®
moto
moto ã¨ããã©ã¤ãã©ãªã使ãã° boto3 ã®ããããªæä½ãã¾ãã£ã¨ mock ãããã¨ãåºæ¥ã¾ãã AWS ã®ãµã¼ãã¹ã boto3 ã®ã¡ã½ããããã¹ã¦ãµãã¼ããã¦ããããã§ã¯ãªãã®ã§ããã¤ã使ããã¨ãã訳ã§ã¯ãªãã§ãããã ãããã¯ãµãã¼ãããã¦ãã¾ãã
åºæ¬çãªä½¿ãæ¹ã¯ GitHub ã®README ã«ãããéãã boto3 ã®ã¡ã½ããã使ç¨ãã¦ãã颿°ã« @mock_s3
ã @mock_sns
ã®ããã«ãã³ã¬ã¼ã¿ããã£ã¤ããã ãã§ã API æä½ã®åãå
ã mock ã®æ¹ã«åãæ¿ãã¦ããã¾ãã
ã§ãããä»åã¯å®è£
ä¸ã®é½åã§ãã³ã¬ã¼ã¿ã§ã¯ãªã with
æã使ã£ã¦æ¸ãã¾ãã
ãã¡ããã¤ã³ã¹ãã¼ã«ããé㯠--dev
ãªãã·ã§ã³ãä»ãã¦ã¤ã³ã¹ãã¼ã«ãã¾ãã
$ pipenv install moto --dev
ç¶æ³è¨å®
次ã®ãããªãã£ã¬ã¯ããªæ§æãæ³å®ãã¾ãã
- src/ - main.py - tests/ - __init__.py - test_main.py - test_data.yml
åè¿°ã®ç¨ã« Pipenv ã使ç¨ãã¦ä»®æ³ç°å¢ãåã£ãå ´å㯠Pipfile ã Pipfile.lock ã使ããã¦ãããã Serverless Framework ã§ãããã¤ãããããã¸ã§ã¯ãã®å ´å㯠serverless.yml ã使ããã¦ãããã¨ããããã¨æãã¾ããã䏿¦çãã¾ãã
ãã¹ã対象ã®ã³ã¼ã
ææãã®æ¥µã¿ã§ããã以ä¸ã®ã³ã¼ãããã¹ããããã¨ãã¾ãã
import boto3 import os from boto3.dynamodb.conditions import Key dynamodb = boto3.resource('dynamodb') table = dynamodb.Table(os.environ['TABLE_NAME']) def handler(event, context): id = event['body']['id'] response = table.query( KeyConditionExpression=Key('id').eq(id) ) return response.get('Items')
id
ã¨ãã夿°ã event
ã®å¼æ°ããåãåºãã¦ãã¾ããããã㯠API Gateway ã® Lambda ãããã·çµ±åã使ãã¨ãããªæãã«ãªãã®ã§ãã®ã¤ã¡ã¼ã¸ã§æ¸ãã¦ãã¾ããã¨ã¯è¨ãããã¾ã§é©å½ãªã®ã§ãã¾ãæ°ã«ããªãã§ãã ããã
ãã¹ãã¡ã½ãããæ¸ã
test_main.py
ã«ãã¹ãã¡ã½ãããæ¸ãã¦ããã¾ãã
import pytest @pytest.mark.parametrize( "event, expected", [ ( {'body': {'id': '0001'}}, [ { 'id': '0001', 'name': 'Tanaka', 'age': 100, 'profile': 'human' } ] ), ( {'body': {'id': '0005'}}, [] ) ] ) def test_handler(table, event, expected): from src.main import handler assert expected == handler(event, context=None)
ã´ããã®ãã³ã¬ã¼ã¿ãä»å±ãã¦ããã®ã§ã¤ã«ãããããã¾ããããã¹ãã¡ã½ããå ã§ãã£ã¦ãããã¨ã¯åç´ã§ãã
def test_handler(table, event, expected): from src.main import handler assert expected == handler(event, context=None)
table, event, expected
ã¨ãã弿°ã渡ããã¦ãã¾ãã
event
ã handler 颿°ã«æ¸¡ã弿°ã§ã expected
ã handler 颿°ã®æå¾
ããæ»ãå¤ã§ãã
table
ã¨ãã弿°ã¯ãã®ãã¨ã説æãã¾ããããã£ã¯ã¹ãã£ã¼ã¨ãã¦å®ç¾©ãã DynamoDB ã® mock ãªãã¸ã§ã¯ãã§ãã
æ°ã«ãªããã³ã¬ã¼ã¿ã§ããããããã¾ãã« pytest ã§è¿½å ãããæ©è½ã¨ãªãã¾ãã
@pytest.mark.parametrize( "event, expected", [ ( {'body': {'id': '0001'}}, [ { 'id': '0001', 'name': 'Tanaka', 'age': 100, 'profile': 'human' } ] ), ( {'body': {'id': '0005'}}, [] ) ] )
æå³ã¯ãã®ããã«ãªã£ã¦ãã¾ãã
@pytest.mark.parametrize( "夿°åä¸è¦§", [ (夿°ã®å ·ä½çãªå¤ä¸è¦§), (夿°ã®å ·ä½çãªå¤ä¸è¦§) ] ) def test_hoge(夿°åä¸è¦§): do_something()
ãããå®è¡ããã¨ å¤æ°ã®å
·ä½çãªå¤ä¸è¦§
ããªã¹ãã®è¦ç´ åã ã代å
¥ããã¾ãã
ä»®ã«ãã®ãªã¹ãã®ä¸ã¤ç®ã®è¦ç´ ã代å
¥ãããã¹ãã«å¤±æããã¨ãã¦ããããã§ãã¹ãã®å®è¡ã¯ç¶ç¶ããã¾ãã
å
·ä½ä¾ããªãã¨åããã¥ããå¯è½æ§ãããã®ã§ãããå°ã詳ããã説æãã¾ãã
ä¾ãã°ä¸ã®ããã«æ¸ãã¦ãã¾ã㨠arg_list
ã®ä¸ã¤ç®ã®è¦ç´ ã§ãã¹ãã失æããã¨ãããã§å¦çãæ¢ã¾ã£ã¦ãã¾ãã¾ãã
ããããã¨ãäºã¤ç®ã®è¦ç´ ã«ã¤ãã¦ã¯å®è¡ãããªãã®ã§ããã¹ããéãã®éããªãã®ããåãããªããªã£ã¦ãã¾ãã¾ãã
def test_hoge(夿°åä¸è¦§): arg_list = [ (夿°ã®å ·ä½çãªå¤ä¸è¦§), (夿°ã®å ·ä½çãªå¤ä¸è¦§) ] for item in arg_list: do_something(item)
å
ã»ã©ã説æãã @pytest.mark.parametrize()
ã§ã¯ããã®è¾ºããã¡ããã¨èæ
®ãã¦ããã¦ãã¦ãä¸ã¤ã®ãã¹ãã±ã¼ã¹ã§äºæããªãçµæãèµ·ãã¦ãå
¨ã±ã¼ã¹å®è¡ãã¦ããã¾ããå¬ããã§ããã
ã§ãã®ã§ãä»åã®ä¾ã§è¨ãã¾ãã¨ã次ã®äºã¤ã®ã±ã¼ã¹ãå®è¡ããã¾ãã
event = {'body': {'id': '0001'}} expected = [ { 'id': '0001', 'name': 'Tanaka', 'age': 100, 'profile': 'human' } ]
event = {'body': {'id': '0005'}} expected = []
ãã£ã¯ã¹ãã£ã¼ãæ¸ã
ä»åã¯é常ã«ã·ã³ãã«ãªãã¹ããªã®ã§ããã¾ãèæ ®ããªãã¦ãåé¡ãªãã§ãããããç¨åº¦ã®è¦æ¨¡ã«ãªã£ã¦ããéã«ãã¹ãç¨ã® AWS ãªã½ã¼ã¹ï¼ããã§ã¯ mock ï¼ã®ä½æãããã«ãã¹ããã¼ã¿ãæå ¥ãããããå¦çã¯æ¯åãã¹ãã¡ã½ããã®ä¸ã§æ¸ãã®ã§ã¯ãªããå ±éåã»åãåºãããã¦ãã£ã¯ã¹ãã£ã¼ã¨ãã¦å®ç¾©ãã¦ããã®ã便å©ã§ãã
pytest ã§ã¯çµã¿è¾¼ã¿ã®ãã£ã¯ã¹ãã£ã¼ãããããç¨æããã¦ããã使°ãªã pytest ãå®è¡ãã¦ããã¨ãã«è£ã§èªã¿è¾¼ãã§ããã¦ãã¾ãã ããã¦ãã¡ãããã£ã¯ã¹ãã£ã¼ã¯ã¦ã¼ã¶ã¼ã好ãã«è¿½å ã§ãã¾ãã®ã§ãä»åã®ã±ã¼ã¹ã§ã¯ DynamoDB ã® mock ãç¨æããå¦çãããã¾ãã®ã§ãããããã£ã¯ã¹ãã£ã¼åãã¦ã¿ã¾ãã
å
ã»ã©ã® test_main.py
ã«è¿½è¨ãã¾ãã
import boto3 import pytest import os import yaml from moto import mock_dynamodb2 @pytest.fixture(autouse=True) def set_envs(monkeypatch): with open('tests/test_data.yml', 'r', encoding='utf-8') as fp: envs = yaml.safe_load(fp)['environment'] for k, v in envs.items(): monkeypatch.setenv(k, str(v)) @pytest.fixture() def table(): with mock_dynamodb2(): with open('tests/test_data.yml', 'r', encoding='utf-8') as fp: test_data = yaml.safe_load(fp)['DynamoDB'] table_config = test_data['Table'] dynamodb = boto3.resource('dynamodb') # ãã¹ãç¨ãã¼ãã«ã®ä½æ dynamodb.create_table( TableName=os.environ['TABLE_NAME'], AttributeDefinitions=table_config['AttributeDefinitions'], KeySchema=table_config['KeySchema'] ) # ãã¹ãç¨ãã¼ã¿ã®æ ¼ç´ table = dynamodb.Table(os.environ['TABLE_NAME']) with table.batch_writer() as batch: for item in test_data['Items']: batch.put_item(Item=item) yield table
å®ç¾©ãã颿°ã« @pytest.fixture()
ã¨ãããã³ã¬ã¼ã¿ãä»ä¸ããã°ããããã£ã¯ã¹ãã£ã¼ã¨ãã¦æ±ããããã«ãªãã¾ãã
å°ãå¾ã§ã説æãã¾ãã¨è¨ã£ãããã¹ãã¡ã½ããã® table
ã¨ãã弿°ã¯ãã®ãã£ã¯ã¹ãã£ã¼ããã¹ãå®è¡æã«å¼ã³åºãã¨ããæå³ã«ãªãã¾ãã
set_envs
ã®ã¨ãã®ããã« @pytest.fixture(autouse=True)
ã¨æ¸ãã°ããã¹ãã¡ã½ããå´ã§æç¤ºçã«å¼æ°ã«æå®ããªãã¦ãèªåçã«ãã£ã¯ã¹ãã£ã¼ãå®è¡ãã¦ããããã«ãªãã¾ãã
Lambda ã§ã¯ããã¦ãç°å¢å¤æ°ãèªã¿è¾¼ãå¦çãçºçãã¾ãããããã®åæºåã set_envs()
颿°ã§å®è¡ãã¦ãã¾ãã
ã¾ãã弿°ã«æå®ãã¦ãã monkeypatch
ã¯çµã¿è¾¼ã¿ã®ãã£ã¯ã¹ãã£ã¼ã§ãããåä½ã§ãããªãéã¹ã¾ãããä»å㯠setenv
ã¨ãã䏿çã«ç°å¢å¤æ°ãã»ããããã¡ã½ããã使ã£ã¦ãã¾ãã
ãã£ã¦ãããã¨ã¨ãã¦ã¯ test_data.yml
ã¨ãããã¡ã¤ã«ã«ãããããæ¸ãã¦ããããã¹ãç¨ã®ç°å¢å¤æ°ä¸è¦§ã for æã§ã¢ãªã¢ãªæ¸ãåºãã¦ãã¾ãã
ã¡ãªã¿ã«èªã¿è¾¼ãã§ãã test_data.yml
ã®ä¸èº«ã¯ä»¥ä¸ã®ããã«ãªã£ã¦ãã¾ããï¼ãã® test_data.yml ãä½¿ãæ¸ãæ¹èªä½ã¯ pytest ã®æ¨æºçãªæ¸ãæ¹ãã¨ãã訳ã§ã¯ãªãã§ãï¼
environment: TABLE_NAME: sample-table DynamoDB: Table: AttributeDefinitions: - AttributeName: id AttributeType: S KeySchema: - AttributeName: id KeyType: HASH Items: - id: '0001' name: Tanaka age: 100 profile: human - id: '0002' name: Suzuki age: 1000 profile: god
environment
ã¨ãããã¼ã« TABLE_NAME
ã¨ãã夿°ãå®ç¾©ããã¦ãã¾ãã®ã§ãããã set_envs()
ã§ç°å¢å¤æ°ã«ã»ãããã¾ãã
moto ã â¦ï¼
ããã¦ããã§ãããã moto ãç»å ´ãã¾ãã
ã³ã³ããã¹ãããã¼ã¸ã£ã¨ã㦠moto ã®ã¡ã½ãã mock_dynamodb2()
ãå¼ã³åºãã¦ãã¾ãã
ãã¹ã対象ã®ã¡ã½ããã«ãã® mock_dynamodb2()
ããã¶ãããã¨ã§ããã¹ãã¡ã½ããå
ã® DynamoDB ã¸ã® API æä½ã®åãå
ã mock ã«åãã¦ãããããªã¤ã¡ã¼ã¸ã§ãã
@pytest.fixture() def table(): with mock_dynamodb2(): with open('tests/test_data.yml', 'r', encoding='utf-8') as fp: test_data = yaml.safe_load(fp)['DynamoDB'] table_config = test_data['Table'] dynamodb = boto3.resource('dynamodb') # ãã¹ãç¨ãã¼ãã«ã®ä½æ dynamodb.create_table( TableName=os.environ['TABLE_NAME'], AttributeDefinitions=table_config['AttributeDefinitions'], KeySchema=table_config['KeySchema'] ) # ãã¹ãç¨ãã¼ã¿ã®æ ¼ç´ table = dynamodb.Table(os.environ['TABLE_NAME']) with table.batch_writer() as batch: for item in test_data['Items']: batch.put_item(Item=item) yield table
ã¾ããå
ã»ã©ã® test_data.yml
ãããã¼ãã«å®ç¾©ã«å¿
è¦ãªãã©ã¡ã¼ã¿ã®ä¸è¦§ãèªã¿è¾¼ã¿ã¾ãã
ãã㦠DynamoDB ã®ãªã½ã¼ã¹ãçæãèªã¿è¾¼ãã ãã©ã¡ã¼ã¿ã§ãã£ã¦ create_table()
ã¡ã½ãããå®è¡ãã¦ãã¼ãã«ã使ãã¾ãããå®éã«ã¯ãªã½ã¼ã¹ã¯ä½æãããã moto ã®æ¹ã§ããæãã«ãããããã¼ãã«ãåå¨ãããã®ãããªç¶æ³ãç¨æãã¦ããã¾ãã
ãã¼ãã«ã使ããããæ¬¡ã¯ boto3 ã® batch_writer
ã使ã£ã¦ test_data.yml
ã«å®ç¾©ãããã¹ãç¨ãã¼ã¿ããã¤ãã¤æ ¼ç´ãã¦ãã¾ãã
ãªã®ã§ããã®ãã£ã¯ã¹ãã£ã¼ãå®è¡ããããã¨ã§ãããªæãã®ãã¼ã¿ãæ ¼ç´ããããã¨ã«ãªãã¾ãã
[ { "id": "0001", "name": "Tanaka", "age": 100, "profile": "human" }, { "id": "0002", "name": "Suzuki", "age": 1000, "profile": "god" } ]
åé ã§ããã¹ãã¡ã½ããã« @mock_dynamodb2()
ã®ããã«ãã³ã¬ã¼ã¿ãä»ããå½¢ããããã©å®è£
ä¸ã®é½åã§ with æã使ãã¨è¨ã£ã¦ããã®ã¯ãã®è¾ºãã®äºæ
ãããã¾ãã
å¥ã®é¢æ°ã¨ãã¦åãåºãããã£ããããã¨ããããã§ãã
ãã¹ããå®è¡ãã¦ã¿ã
ä»åã¯ãã¹ã対象ã®ã³ã¼ããåç´ããããããã«ããã¹ããã¼ã¿ã¨ã㦠moto ã§ç¨æãããã¼ã¿ã¨æå¾ å¤ãä¸è´ãããã©ããã¨ããã¡ãã£ã¨è¶£æ¨ããããæãã«ãªã£ã¦ãã¾ãã¾ããããã¾ãæ°ã«ããåä½ç¢ºèªãã¦ã¿ã¾ãã
ããã¸ã§ã¯ãã®ã«ã¼ããã£ã¬ã¯ããªã§ãã¹ããå®è¡ãã¾ãã
$ pytest ==================================================== test session starts ==================================================== platform win32 -- Python 3.8.2, pytest-6.1.0, py-1.9.0, pluggy-0.13.1 rootdir: C:\Users\aaa\moto-sample collected 2 items tests\test_main.py .. [100%] ===================================================== 2 passed in 1.24s =====================================================
æåãã¾ããï¼
ãã£ãããªã®ã§å¤±æãããã¿ã¼ã³ã試ãã¦ã¿ã¾ãã ãã³ã¬ã¼ã¿ã«æ¸ãã弿°ã¨æå¾ å¤ãå°ãå¤ãã¾ãã
{'body': {'id': '0002'}}, # 0001 â 0002 ã«ãã [ { 'id': '0001', 'name': 'Tanaka', 'age': 100, 'profile': 'human' } ]
ãã¹ããã¼ã¿ã¨ãã¦ç¨æãããã®ã§ã¯ id
ã 0002
ã®ä»¥ä¸ã®ãã¼ã¿ã§ãã®ã§ãã£ã¨æå¾
ããçµæã¨åããªããã¨ãããã¨ã«ãªãã¯ãã§ãã
{ "id": "0002", "name": "Suzuki", "age": 1000, "profile": "god" }
å®è¡ãã¾ãã
$ pytest ==================================================== test session starts ==================================================== platform win32 -- Python 3.8.2, pytest-6.1.0, py-1.9.0, pluggy-0.13.1 rootdir: C:\Users\aaa\moto-sample collected 2 items tests\test_main.py F. [100%] ========================================================= FAILURES ========================================================== ______________________________________________ test_handler[event0-expected0] _______________________________________________ table = dynamodb.Table(name='sample-table'), event = {'body': {'id': '0002'}} expected = [{'age': 100, 'id': '0001', 'name': 'Tanaka', 'profile': 'human'}] @pytest.mark.parametrize( "event, expected", [ ( { 'body': {'id': '0002'} }, [ { 'id': '0001', 'name': 'Tanaka', 'age': 100, 'profile': 'human' } ] ), ( { 'body': {'id': '0005'} }, [] ) ] ) def test_handler(table, event, expected): from src.main import handler > assert expected == handler(event, context=None) E AssertionError: assert [{'age': 100,...le': 'human'}] == [{'age': Deci...file': 'god'}] E At index 0 diff: {'id': '0001', 'name': 'Tanaka', 'age': 100, 'profile': 'human'} != {'id': '0002', 'name': 'Suzuki', 'age': Decimal('1000'), 'profile': 'god'} E Use -v to get the full diff tests\test_main.py:67: AssertionError ================================================== short test summary info ================================================== FAILED tests/test_main.py::test_handler[event0-expected0] - AssertionError: assert [{'age': 100,...le': 'human'}] == [{'age... ================================================ 1 failed, 1 passed in 1.35s ================================================
æå¾
å¤ã¨åããªããã¨ãã AssertionError ãçºçãã¦ãã¾ãã
å®éã«ã¯è²ãã¤ãã¦ããå°ãè¦ãããã¨ã¯ããå°ãåºåãããã£ãããã¦ãã¾ããã pytest
ã³ãã³ãã«ã¯ããããªãªãã·ã§ã³ããããã¤ã¤æãã«é¸ã¹ã°ãã£ã¨ãªã·ã£ã¬ã«ã§ãã¾ãã
ã¡ãªã¿ã« conftest.py
ã¨ããååã®ã¢ã¸ã¥ã¼ã«ãä½ã£ã¦ããã«ãã£ã¯ã¹ãã£ã¼ãæ¸ãã¦ããã°ã pytest
ã³ãã³ãå®è¡æã«ãã¢ã¸ã¥ã¼ã«å
ã«ãã£ã¯ã¹ãã£ã¼ãå®ç¾©ããã¦ããªãå ´åã§ conftest.py
ã¨åã®ã¤ããã¢ã¸ã¥ã¼ã«ãèªåã§æ¢ãã¦èªã¿è¾¼ãã§ããã¾ãã
ãããè¾ºã®æé»ï¼ï¼ï¼ã®æåãè²ã
ããã®ãæ
£ããªãã¨å°ãç¿»å¼ããã¦ãã¾ã£ã¦é£ããã¨ããã§ãããã¾ããâ¦ã
ãã¾ã
æè¿ç¥ã£ãã®ã§ãããç°å¢å¤æ°ã®èªã¿è¾¼ã¿æã« Pipenv ã§ã¤ã¤æãã«ã§ãããã¨ãç¥ãã¾ããã
.env
ãã¡ã¤ã«ã 使ãã¦ããã°ã pipenv shell
ãå®è¡ããã¨ãã«èªåã§æ¤åºãã¦èªã¿è¾¼ãã§ç°å¢å¤æ°ã«æ¸ãåºãã¦ãããããã§ãã
$ pipenv shell Loading .env environment variables⦠Launching subshell in virtual environmentâ¦
ã§ãã®ã§ãä»åã®ãã£ã¯ã¹ãã£ã¼ã®ä¸ã¤ set_envs()
ãç¡ãã¦ã .env
ãã¡ã¤ã«ã«ä»¥ä¸ã®å
å®¹ãæ¸ãã¦ããã°ãç°å¢å¤æ°ã® TABLE_NAME
ãã»ããããã¾ãã
TABLE_NAME=sample-table
.env
ã¯ããã¦ãå人ã®ç°å¢ã«ä¾åããã GitHub ãªã©ã®ãªãã¸ããªã«ã¯å
¬éããããªãå¤ãªã©ãæ¸ãåºãã¦ããããã«ä½¿ããã¨ãå¤ãã®ã§ä½¿ãæ¹ã¨ãã¦ã¯å°ãå¾®å¦ããããã¾ããããåä½ã§è¨äºã«ããã»ã©ã®åéã§ãç¡ãã£ãã®ã§ããã«ãã¾ãã¨ãã¦æ¸ããã¦ããã ãã¾ããã
ã¾ã¨ã
ãã¹ãã³ã¼ãã£ã¦ãããããæ ãæ´åããã¦ããã°ãã¨ã¯ããç¨åº¦æ©æ¢°çã«è¿½å ãã¦ããã¾ãããä¸ããæ¸ãã¨ãªãã¨çµæ§å¤§å¤ã ã£ãããã¾ãã ãã®è¨äºã誰ãã®åèã«ãªãã°å¹¸ãã§ãã
åè
ä¿ç° å馬 (è¨äºä¸è¦§)
ã¢ããªã±ã¼ã·ã§ã³ãµã¼ãã¹é¨
ãã¼ã«ãã³ã§åãæ¸ããã¨ãããã¾ããï¼æ¸ããªããã¨ãããï¼