これ に最近プルリクが来て、テスト書かないとな〜って思ったのがきっかけです
目次
- unittestを使ってテストコードを書いてみた!
- GitHub Actionsでテストの自動化をしてみた!
unittestを使ってテストコードを書いてみた!
参考:https://qiita.com/aomidro/items/3e3449fde924893f18ca
書いたコード:https://github.com/sun-yryr/Rec-adio/blob/feature/test/test/test_func.py
Pythonには標準モジュールで unittest があります。これを使ってテストコードを書いてみました。
結構運用でカバーしてる部分が多いのでご注意ください
unittest.TestCase
のサブクラスとして各テストコードを書いていきます
import unittest
import テストするモジュール as f
class TestCalculate(unittest.TestCase):
def test_add(self):
# 足し算のテスト
self.assertEqual(f.add(3, 5), 8)
def test_sub(self):
# 引き算のテスト
self.assertEqual(f.sub(3, 5), -2)
使用可能なassertメソッドは こちら にあります。
テスト用のメソッドは test
で始まる必要があります。
if __name__ == "__main__":
unittest.main()
mainを呼ぶことでテストが走ります。
複数のファイルに分割してテストコードを書くことがほとんどだと思います。
python -m unittest discover -v
を実行することで、カレントディレクトリのテストが全部走ります。
pipenvのscriptsに登録
せっかくpipenvを使っているので、scriptsに登録します。
上記のコマンドはテストコードがあるフォルダで行う必要があるので一工夫加えます。
[scripts]
test = "bash -c \"cd test ; python -m unittest discover\""
テストコードのフォルダに移動する cd
を先に打つ必要があるので、 bash -c
で実行してあげます。
$ pipenv run
....
----------------------------------------------------------------------
Run 4 tests in 0.386s
OK
OKが出れば完成です。
GitHub Actionsでテストの自動化をしてみた!
テストを作ったら自動化しますよね?
Actions → New workflow → Python application を選びます。
テンプレートが使いやすくてすごいいい......
下記のようなテンプレートが適用されたyamlファイルができます。
# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Python application
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.8
uses: actions/setup-python@v1
with:
python-version: 3.8
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Lint with flake8
run: |
pip install flake8
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with pytest
run: |
pip install pytest
pytest
適当に設定していきます。
name: Python application
名前です、好きな名前にしましょう。
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
どのブランチのどの操作でActionを走らせるかを決めます。大抵そのままで平気です
runs-on: ubuntu-latest
どのイメージで実行するか、だと思います。(よくわからないのでスキップ)
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.8
uses: actions/setup-python@v1
with:
python-version: 3.8
?
pythonのバージョン指定をしてるくらいしかわからない
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Lint with flake8
run: |
pip install flake8
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with pytest
run: |
pip install pytest
pytest
name, run で1セット。runで指定したコマンドが走るみたいですね。
設定した物がこう
# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Python application
on:
push:
branches: [ master ]
pull_request:
branches: [ master, release ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.6
uses: actions/setup-python@v1
with:
python-version: 3.6
- name: Install Pipenv
run: |
python -m pip install --upgrade pip
pip install pipenv
- name: Install dependencies
run: |
pipenv sync
- name: Test with unittest
run: |
pipenv run test
まとめ
動いたのでOK!チューニングは別の機会!