はじめに
Github Actionsの話で、ブランチによる、トリガーの設定を試した。今回はpythonの自動テストを試したいとおもいます。二つ方法で実装したため、dockerの仮想環境 とgithubのubuntu環境の実行に対して、シミュレーションします。
Target
- Github Actions でdocker-compose exec -T app pipenv run pytest、flake8の実行ができること
- ubuntu環境で pytest、flake8の実行ができること
- dockerの仮想環境 とgithubのubuntu環境に対して、シミュレーション
- その他
共通のテストファイル
簡単に以下のテストファイルを作成しました。
def test_sample1():
"""add test """
assert True
Docker仮想環境
name: dockerPipenv
on: [push]
jobs:
DockerComposePytest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: docker Build
run: docker-compose build
- name: Docker Compose Up
run: docker-compose up -d
- name: Pipenv Run Pytest
run: docker-compose exec -T flask_app pipenv run test
- name: Pipenv Run Lint
run: docker-compose exec -T flask_app pipenv run lint
これはgithubの仮想環境の中に、dockerの仮想環境を構築し、testとlintを実行する感じです。
=============================== test =======================================
Run docker-compose exec -T flask_app pipenv run test
docker-compose exec -T flask_app pipenv run test
shell: /usr/bin/bash -e {0}
============================= test session starts ==============================
platform linux -- Python 3.10.7, pytest-7.1.3, pluggy-1.0.0
rootdir: /service/flask_app
collected 1 item
modules/tests/test_util.py . [100%]
============================== 1 passed in 0.01s ===============================
=============================== lint =======================================
Run docker-compose exec -T flask_app pipenv run lint
docker-compose exec -T flask_app pipenv run lint
shell: /usr/bin/bash -e {0}
無事に実行できた。
ubuntu 環境
ubuntu pytest
まずは、actionファイルは以下のようです。
name: pythonPytest
on: [push]
jobs:
PythonPytest:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.10
uses: actions/setup-python@v3
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pytest
pip install flake8
pip install Flask
pip install Flask-WTF
pip install pydocstyle
pip install pyflakes
- name: Analysing the code with pylint
run: |
ls -l
flake8 source/
pytest -vs
この感じで、直接にpython3.10のパッケージpytestとflake8などをにインストールすることですね。
============================= test session starts ==============================
platform linux -- Python 3.10.6, pytest-7.1.3, pluggy-1.0.0 -- /opt/hostedtoolcache/Python/3.10.6/x64/bin/python
cachedir: .pytest_cache
rootdir: /home/runner/work/python_pipenv_test/python_pipenv_test
collecting ... collected 1 item
source/modules/tests/test_util.py::test_sample1 PASSED
============================== 1 passed in 0.01s ===============================
実行結果:無事にflake8とpytestを実行しましたね。
ubuntu pipenv
アプリのパッケージバージョンを管理するため、以下のPipfileを作成しました。
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
Flask = "==2.1.0"
mod-wsgi = "==4.9.1"
Flask-WTF = "==0.15.1"
requests = "==2.26.0"
[dev-packages]
flake8 = "*"
pydocstyle = "*"
pyflakes = "*"
flake8-isort = "*"
isort = "*"
autopep8 = "*"
pytest = "*"
[requires]
python_version = "3.10"
[scripts]
lint = "flake8 /service/flask_app "
lint-fix = "bash -c 'isort /service/flask_app && flake8 /service/flask_app | cut -d: -f1 | sort | uniq | xargs autopep8 -i'"
test = "pytest"
github actionsファイルは以下でございます。
name: pythonPipenv
on: [push]
jobs:
PythonPipenv:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v3
- name: Set up Python 3.10
uses: actions/setup-python@v3
with:
python-version: '3.10'
- name: Install dependencies mod-wsgi
run: |
★ sudo apt-get -y install --no-install-recommends libaio1
★ sudo apt-get -y install apache2 apache2-dev
- name: Install dependencies pipenv
run: |
cp source/Pipfile Pipfile
python -m pip install --upgrade pip
pip install pipenv
pipenv install --skip-lock --dev
- name: Analysing the code with pylint again
run: |
pipenv run pytest -vs
pipenv run flake8 source/
上記の★の部分を見てください。Pipfileの中に、依存関係があるパッケージのインストールが必要な場合、[Pipfile]をinstallする前に、やるべきです。
あと、apt-getの際に「sudo」を追加しないと以下のエラーがでます。
============================= test session starts ==============================
platform linux -- Python 3.10.6, pytest-7.1.3, pluggy-1.0.0 -- /home/runner/.local/share/virtualenvs/python_pipenv_test-ulorymQ-/bin/python
cachedir: .pytest_cache
rootdir: /home/runner/work/python_pipenv_test/python_pipenv_test
collecting ... collected 1 item
source/modules/tests/test_util.py::test_sample1 PASSED
============================== 1 passed in 0.01s ===============================
実行結果:無事にpytestとflake8を実行しましたね。
シミュレーション
Docker仮想環境
メリット
- 商用環境と同じ環境で実行するため、信頼感がベスト
- dockerのお掛けて、local環境、自動テスト環境、開発検証環境、商用環境の一元管理ができる
- 複数コンテナの接続テスト場合、おすすめです。
デメリット
ubuntu pytest
メリット
デメリット
- local環境のpytest、flake8などパッケージバージョン変更がある場合、pytest.ymlの手動修正が必要かも
ubuntu pipenv
メリット
- 実行時間がubuntu pytestによる、遅いけど、dockerより早い。59s
- Pipfileのお掛けて、local環境、自動テスト環境、開発検証環境、商用環境の利用するパッケージを一元管理することができるし、インストールはわざわざインストールしなくてもよい。
デメリット
- Pipfileのパッケージが外部依存がある場合、手動対応が必要です。「★」の部分
その他
上記の感じで、test.pyファイル中に、テスト関数がない場合、以下のエラーを出るので、気になります。
普段はテストが通ったが、ただ、テストパータンがないため、成功と言えないですね。真面目だよね。
まとめ
現在のWEB業界はアジャイル開発の実施と伴う、開発スピードを求めている背景で、(特にSREのGuidelinesを基づいて、自動化するべきであることで)今後の開発は以下のようにした方がよいかも。
- 開発環境は「ubuntu pipenv」を利用する。
- 商用環境にリリースする際に、「Docker仮想環境」を利用する。
※補足記事を追加しましたので、良かったら参考してください。