PPP3: テストしやすい設計・テスト自動化に向けて
08-03 テストから設計を改善する
ここまでで、できるだけテスト対象だけを実行させるようにテストを作成してきました。
実行させてきたの?
そうなの?
08-03-01 テストしやすい設計
- テストしやすいのは結合度が低く凝集度が高いモジュール
- オブジェクト指向原則
- 単一責任の原則 → 凝集度を高める
- 最小インタフェースの原則
- オープンクローズの原則:拡張できて、修正が他に影響しない
- リスコフの置換原則:サブクラスでは受け入れを寛容に、返却を厳密に
- 継承より利用
08-04 テスト実行の自動化に向けて
この章の残りではCIツールでテストできるようにするために、自動化に便利なライブラリを紹介します。
ツールを使うためにまた別のツール(ライブラリだけど)を覚えないとっていうのも
微妙につらいものがあるけどしかたないんだろうね
個人的な志向でいうとブラックボックスが増えていくのは気持ちよくない
08-04-01 toxでテスト実行環境を自動作成する
- toxは複数のvirtualenv環境にテスト環境を構築し、テスト・結果表示するツール
py35
は特別な名前で、インストールされているpython3.5
コマンドを探し出して、virtualenv
を作成します。
ここで言ってるvirtualenv
ってのは普通名詞じゃなくてvenv
のことでもなくて
virtualenv
ってことなんだろうか
それでいいんだろうか
とにかく仮想環境から作ってくれるらしいということはわかった
ちょっとtox.iniを作って実行してみる
拡張子iniってだけあってiniだなこれは
[tox]
envlist = py36,flake8
skipsdist = true
[testenv]
deps = pytest
testfixtures
commands = pytest
[testenv:flake8]
basepython = python3.6
deps = flake8
commands = flake8
これでtox
って実行すると何か起こるわけ?
仮想環境から抜けた状態でやったほうがいいんだろうな
$ deactivate
$ tox
Command 'tox' not found, but can be installed with:
sudo apt install tox
あっ
仮想環境から抜けたからtoxがなくなった(バカ
toxは素の環境に入れなきゃダメ?
素の環境でpython普通に起動すると2.7なんだけど?
どうするのが正しいの?
仮想環境の中からやってもいいのかな
とりあえず知らんぷりして素の環境にtoxをインストールしてみる
インストールは普通にできた
$ tox
py36 installed: atomicwrites==1.3.0,attrs==19.1.0,importlib-metadata==0.18,more-itertools==7.0.0,packaging==19.0,pluggy==0.12.0,py==1.8.0,pyparsing==2.4.0,pytest==4.6.3,six==1.12.0,testfixtures==6.9.0,wcwidth==0.1.7,zipp==0.5.1
py36 run-test-pre: PYTHONHASHSEED='3486821505'
py36 run-test: commands[0] | pytest
================================================================================== test session starts ===================================================================================
platform linux -- Python 3.6.7, pytest-4.6.3, py-1.8.0, pluggy-0.12.0
...
=============================================================================== 10 passed in 0.05 seconds ================================================================================
flake8 installed: entrypoints==0.3,flake8==3.7.7,mccabe==0.6.1,pycodestyle==2.5.0,pyflakes==2.1.1
flake8 run-test-pre: PYTHONHASHSEED='3486821505'
flake8 run-test: commands[0] | flake8
./bankaccount.py:4:1: E302 expected 2 blank lines, found 1
...
./test_myview.py:20:9: F841 local variable 'result' is assigned to but never used
ERROR: InvocationError for command /home/takahiro/study/PPP3-mac/test/.tox/flake8/bin/flake8 (exited with code 1)
________________________________________________________________________________________ summary _________________________________________________________________________________________
py36: commands succeeded
ERROR: flake8: commands failed
できた
っぽい
けど
ERROR: InvocationError for command .../flake8 (exited with code 1)
ていうのが
気になる
たぶん警告が出たっていう意味のexit code 1なんだとは思うけど
警告が出ないように修正してもう一度
$ tox
:
flake8 installed: entrypoints==0.3,flake8==3.7.7,mccabe==0.6.1,pycodestyle==2.5.0,pyflakes==2.1.1
flake8 run-test-pre: PYTHONHASHSEED='2317494554'
flake8 run-test: commands[0] | flake8
________________________________________________________________________________________ summary _________________________________________________________________________________________
py36: commands succeeded
flake8: commands succeeded
congratulations :)
congratulations :)
08-04-02 繰り返し可能なテスト環境
- テスト終了後には、必ずtearDownメソッドで後始末する
- エラーなどで中断してしまった場合に備え、テスト開始時にも後始末の処理を呼び出す
そこまでするんだったら毎回新規に環境を作ったほうがすっきりするかもな
できればだけど