Posted at

Python 事始め 2019 for mac

令和になって人生で初めての負荷試験担当になりました(予定)。

今から死ぬことになるんだろうな、と戦々恐々としながら AWS の負荷試験入門の本(アフェリンクじゃないよ) 読んでます。

どうせなら保守 & 保守が辛い jMeter よりも、保守しやすく柔軟性の高いと言われてる Locust を使うことを目標に python 始めました。

python (もとい自分の知らない言語)を始めるにあたり必要になるのは開発環境。

開発環境といえば docker ですよね。

大体下になりました。


  • vscode -> ダウンロードする. python 拡張入れるで大体使える。

  • docker -> 環境汚さない。バージョン切り替え用意。構築まで早い。好き。

docker は公式にあるものを使います。それが一番早い。

https://hub.docker.com/_/python

$ docker pull python:3

$ docker run --rm python:3 python --version
Python 3.7.3

これで準備おわりです。便利な世の中。

次、作業環境を構築していきます。

Dockerfile の用意、これも公式をパクれば良いです。

若干書き換えてますが、今は気にしないのが大人です。

FROM python:3

WORKDIR /usr/src/app

COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD [ "pytest", "test.py" ]

Dockerfile で requirements.txt なるものをコピーしてるので用意してあげます。

簡単に調べてみると、これはパッケージ管理用のファイルみたいでした。


requirements.txt

pytest


ここまでを build してコンテナ作成します。

$ docker build -t test .

よくあるこんにちは世界をやります。


hello/api.py

def hello():

return 'hello world !!'

if __name__ == '__main__':
print(hello())


こんにちはできました!

$ docker run --rm test python hello/api.py

hello world !!

次、開発にとって大事なテスト導入します。

デフォルトのやつもあるみたいですが、さっきスルーしてもらった pytest がわりかしスマートで良さそうでした。

テストするにあたってまず自作関数をモジュールとして読み込めるようにします。

__init__.py ってのを作って定義すればよしなに。


hello/__init__.py

from .api import (

hello
)

次にテストファイル


test.py

import pytest

from hello import hello

def test_hello():
assert 'hello orld' == hello()


そしてテスト実行!

$ docker run --rm test

============================= test session starts ==============================
platform linux -- Python 3.7.3, pytest-4.5.0, py-1.8.0, pluggy-0.11.0
rootdir: /usr/src/app
collected 1 item

test.py F [100%]

=================================== FAILURES ===================================
__________________________________ test_hello __________________________________

def test_hello():
> assert 'hello orld' == hello()
E AssertionError: assert 'hello orld' == 'hello world !!'
E - hello orld
E + hello world !!
E ? + +++

test.py:5: AssertionError
=========================== 1 failed in 0.07 seconds ===========================

Dockerfile はコマンドが省略されたとき CMD をデフォルトとして実行します。

今回は pytest test.py ですね。

そしてはい、こけます。

修正しましょう。

import pytest

from hello import hello

def test_hello():
- assert 'hello orld' == hello()
+ assert 'hello world' == hello()

あと毎回 build -> run って叩くのめんどいので Makefile 作りましょう。

python のランナーは探せば良いのあるかもしれないけど、今回のやつ程度なら Makefile でサクで良いです。(先頭タブじゃないとダメなのが面倒)

# vim:set noexpandtab :

build:
@docker build -t csvql .

test: build
@docker run --rm csvql

$ make test

...
============================= test session starts ==============================
platform linux -- Python 3.7.3, pytest-4.5.0, py-1.8.0, pluggy-0.11.0
rootdir: /usr/src/app
collected 1 item

test.py . [100%]

=========================== 1 passed in 0.04 seconds ===========================

無事通りました :raised_hands:

ここまで出来ればあとは開発へ :thumbsup:

まとめ


  • バージョン切り替えができる環境

  • 環境に左右されない。汚さない。

  • ユニットテストができるように

  • モジュール化を覚えた

  • vscode 使った?