Circle CIを使ってみたかったので触ってみます!
テストは何でも良かったんですが, 一番pythonが使い慣れてるのでとりあえずpytestで.
今回使ったファイル等は ここ に置いてあります.
pytestとは
pythonの単体テスト用ライブラリ.
$ pytest
とすると, 同ディレクトリ内のtest_*.pyファイルを探して, test_*の関数を実行してくれる.
使ってみる
# calc.py
def add(x, y):
return x + y
# test_calc.py
adds_data = (
[0, 0, 0], # 0 + 0 = 0
[0, 10, 10], # 0 + 10 = 10
[10, 0, 10], # 10 + 0 = 10
[5, 5, 10] # 5 + 5 = 10
)
def test_add():
for _ in adds_data:
assert add(_[0], _[1]) == _[2]
みたいな感じ.
$ pytest -v # -vで見た目がわかりやすくなる
でテストを実行し,
テストデータと一致すればPASSし, 一致しないのがあるとエラーを吐く.
テスト関数の内容は毎回似たようなのになりそうだったので,
def create_test(f, args):
def created_test():
for _ in args:
length = len(_)
arg = _[:length-1]
result = _[length-1]
print(f"{arg} -> {result}")
assert f(*arg) == result
return created_test
test_add = create_test(add, adds_data)
とまとめてしまえば, create_test関数に, テストしたい関数と引き数を渡せばテストを作れるので楽できて良さそう.
一応動作確認.
$ pytest -v -s
PASSED
テストデータいじるとちゃんとエラーはいてくれた.
mark
機能が豊富すぎて把握しきれなかったので使いそうな mark と fixture だけ触ってみた.
import pytest
すると, pytest.mark.*デコレータが使える
@pytest.mark.hoge
def func():
pass
@pytest.mark.skipif(True, reason="まだ実装してないよ")
def func():
pass
前者(mark.hoge)は,
$ pytest -v -m hoge
みたいにしてhogeデコレータがついてるやつだけテストを走らせるみたいなことができる.
後者(mark.skip)は, 第一引数に条件式をいれておいてTrueであればSkip(=テストを走らせない)して,
Falseなら走らせるってことができる. 環境変数を取得して, Macなら実行するーとかそういうのができる.
$ pytest -v -rsx
fixture
fixtureは前処理(データベースとか)を行うのに使う.
@pytest.fixture(scope='function')
def setup():
print("start setup")
print("fin setup")
def test_add(setup):
pass
scopeは,
- function: テストケース毎
- class: テストクラス毎
- module: テストファイル毎
- session: テスト毎
に前処理を走らせる.
pytestには軽く触れたので, 本筋のCircle CIを触っていく.
Circle CIとは
Circle CIは, Githubリポジトリと連携してCI/CDを提供してくれるサービス.
テストを予め書いといて, Githubのリポジトリが更新されるたびにテストが走る.
本来は, Git-flowを意識しつつ自動デプロイ等の設定もするべきなのだろうけど, 今回はとりあえず触ってみるだけ.
設定ファイルの準備
設定ファイルは, .circleci/config.yml に置く必要がある.
実行環境は, いくつか選択肢はあるが公式推奨のDockerコンテナを使う.
今回用意した設定ファイルは以下.
version: 2.1
jobs:
build:
docker:
- image: circleci/python:3.7.2
steps:
- checkout
- run:
name: install dependencies
command: |
python3 -m venv env
source env/bin/activate
pip install pytest
- run:
name: run test
command: |
source env/bin/activate
pytest --junitxml=test-reports/junit.xml -v
- バージョンは最新が2.1
- docker image -> circleci用python3.7.2
- checkout: カレントのファイルをコピー
- install dependencies: venv構築とpytest取得
- run test: テストの実行
他にも色々設定できるから 公式のドキュメント を参照しながら色々触ってみるべし.
Circle CIでテスト
Githubリポジトリを作成したら, Circle CI からGithubリポジトリを選択する.
あとは, リポジトリが更新されるたびにテストが走る.
以上.
あとは, docker-composeとの連携についても触ってみたい!