Skip to content

Commit 61948db

Browse files
authored
Merge pull request #134 from matsumatsu20/tuning-local-test
Tuning local test
2 parents e805e31 + 889edbd commit 61948db

File tree

5 files changed

+76
-31
lines changed

5 files changed

+76
-31
lines changed

.circleci/config.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ jobs:
1111
docker:
1212
- image: circleci/python:3.6.1
1313
- image: bluszcz/bflocalstack-dynamodb-s3
14+
- image: alismedia/dynamodb-local
15+
environment:
16+
MAX_HEAP_SIZE: 2048m
17+
HEAP_NEWSIZE: 512m
1418
- image: docker.elastic.co/elasticsearch/elasticsearch:6.2.0
1519
environment:
1620
discovery.type: single-node

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ vendor-package
77
# for tests
88
tmp_tests
99
tests/**/database.yaml
10+
tests/**/__pycache__
1011

1112
# editor
1213
.idea

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,21 @@ direnv allow
3535
```
3636

3737
# Test
38+
## Set up dynamoDB local
39+
Download and unzip the [dynamoDB local zip](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.html) in any directory
40+
41+
For example
42+
```
43+
$ curl -O https://s3-ap-northeast-1.amazonaws.com/dynamodb-local-tokyo/dynamodb_local_latest.tar.gz
44+
$ tar xf ./dynamodb_local_latest.tar.gz
45+
$ rm ./dynamodb_local_latest.tar.gz
46+
```
47+
48+
## Execute Test
3849
```bash
50+
# Start dynamoDB local
51+
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb
52+
3953
# lunch docker for localstack(for MAC OS)
4054
TMPDIR=/private$TMPDIR docker-compose up -d
4155

exec_test.py

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,64 @@
66
import re
77
from distutils.dir_util import copy_tree
88

9-
# テスト事前準備
9+
TEST_DIR = 'tests'
10+
TEST_TMP_DIR = './tmp_tests'
1011

11-
# テスト実行のためのtmpディレクトリを作成し、testsをコピーする
12-
os.mkdir('./tmp_tests')
13-
copy_tree('./tests/', './tmp_tests')
14-
execute_dir = []
15-
exit_status = 0
1612

17-
# 各テストファイル毎に、テスト対象ソースと共通ライブラリをテストファイルと同一のディレクトリに複製する。
18-
for name in glob.iglob('tmp_tests/**/test_*.py', recursive=True):
13+
def exec_test(target_dir):
14+
print(target_dir)
15+
exit_status = 0
16+
try:
17+
subprocess.check_call(['green', '-vv', '--processes', '1', target_dir])
18+
except subprocess.CalledProcessError:
19+
exit_status = 1
20+
21+
return exit_status
22+
23+
24+
def copy_required_files(path):
1925
# テストの実行ディレクトリパスを取得
20-
test_dir = './' + name[:name.rfind('/')]
21-
# テストの実行ディレクトリを追加
22-
execute_dir.append(test_dir)
26+
test_dir = path[:path.rfind('/')]
27+
2328
# テスト対象ソースを複製(対象ソースは tests 配下と同一構造の src ディレクトリ配下が対象)
2429
copy_tree(re.sub(r'^\./tmp_tests', './src', test_dir), test_dir)
30+
2531
# 共通ライブラリを複製
2632
copy_tree('./src/common', test_dir)
33+
2734
# 共通ライブラリを複製
2835
copy_tree('./tests/tests_common', test_dir)
2936

30-
for name in execute_dir:
31-
try:
32-
subprocess.check_call(['green', name])
33-
except subprocess.CalledProcessError:
34-
exit_status = 1
3537

36-
# tmpディレクトリは削除
37-
shutil.rmtree('./tmp_tests')
38+
def main():
39+
# テスト事前準備
40+
if os.path.isdir(TEST_TMP_DIR):
41+
shutil.rmtree(TEST_TMP_DIR)
42+
43+
# テスト実行のためのtmpディレクトリを作成し、testsをコピーする
44+
os.mkdir(TEST_TMP_DIR)
45+
copy_tree(TEST_DIR, TEST_TMP_DIR)
46+
47+
# 引数でファイル名を受け取っている場合は変数にセットする
48+
target_file_path = sys.argv[1] if len(sys.argv) == 2 else None
49+
50+
if target_file_path:
51+
# tmpフォルダ上の指定されたファイルのパスを取得
52+
exec_file = TEST_TMP_DIR + target_file_path[(target_file_path.find(TEST_DIR) + len(TEST_DIR)):]
53+
exec_dir = exec_file[:exec_file.rfind('/')]
54+
copy_required_files(exec_file)
55+
else:
56+
exec_dir = TEST_TMP_DIR
57+
58+
for name in glob.iglob(TEST_TMP_DIR + '/**/test_*.py', recursive=True):
59+
copy_required_files(name)
60+
61+
result = exec_test(exec_dir)
62+
63+
# tmpディレクトリは削除
64+
65+
shutil.rmtree(TEST_TMP_DIR)
66+
sys.exit(result)
67+
3868

39-
sys.exit(exit_status)
69+
main()

tests/tests_common/tests_util.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import os
22
import yaml
33
import boto3
4-
from botocore.exceptions import ClientError
54

65

76
class TestsUtil:
@@ -23,14 +22,15 @@ def create_table(dynamodb, table_name, table_items):
2322
create_table.meta.client.get_waiter('table_exists').wait(TableName=table_name)
2423
# put item
2524
table = dynamodb.Table(table_name)
26-
for item in table_items:
27-
table.put_item(Item=item)
25+
with table.batch_writer() as batch:
26+
for item in table_items:
27+
batch.put_item(Item=item)
2828

2929
@staticmethod
3030
def get_dynamodb_client():
3131
if os.environ.get('IS_DYNAMODB_ENDPOINT_OF_AWS') is not None:
3232
return boto3.resource('dynamodb')
33-
return boto3.resource('dynamodb', endpoint_url='http://localhost:4569/')
33+
return boto3.resource('dynamodb', endpoint_url='http://localhost:8000/')
3434

3535
@classmethod
3636
def create_all_s3_buckets(cls, s3):
@@ -56,14 +56,10 @@ def get_all_s3_buckets(cls):
5656

5757
@classmethod
5858
def delete_all_tables(cls, dynamodb):
59-
for table in cls.get_all_tables():
60-
try:
61-
del_table = dynamodb.Table(table['table_name'])
62-
del_table.delete()
63-
del_table.meta.client.get_waiter('table_not_exists').wait(TableName=table['table_name'])
64-
except ClientError as e:
65-
if e.response['Error']['Code'] != 'ResourceNotFoundException':
66-
raise
59+
for table in dynamodb.tables.all():
60+
del_table = dynamodb.Table(table.table_name)
61+
del_table.delete()
62+
del_table.meta.client.get_waiter('table_not_exists').wait(TableName=table.table_name)
6763

6864
@classmethod
6965
def get_all_tables(cls):

0 commit comments

Comments
 (0)