PPP3: モジュール、テスト
Chapter 08 モジュール分割設計と単体テスト
MVC
Controllerはだいたいフレームワークが面倒を見てくれる
DomainModelは永続化される状態を持つモデル
ApplicationModelは機能を構成する、通常は永続化されないモデル
テスト
ユニットテスト・コンポーネント結合テスト・機能単体テスト・
機能結合テスト・システムテスト・非機能テスト
機能結合テストは自動実行が難しく手動によるテストとなる
08-02-02 ユニットテストを書く
unittestでユニットテストを書いてpytestで走らせる
pytestの方が賢い
unittest.Testcaseを使わずpytest流でテストケースを作る場合も
unittest
クラスごとのフィクスチャー:setUp(self)
、tearDown(self)
モジュールごとのフィクスチャー:setUpModule()
、tearDownModule()
testfixturesライブラリ
compare
はassertEqual
よりも詳細なメッセージを表示する
ShouldRaise
は例外に渡された引数も確認できる
その他いろいろ
少しサンプルがあるので動かしてみる
サンプルのクラスにself._balance
とself.balance
があるのは
さすがに間違いだろうな
でも[正誤表 https://www.shuwasystem.co.jp/support/7980html/5382.html#2]には載ってなかった
テストクラス
import unittest
class TestBankAccount(unittest.TestCase):
def _getTarget(self):
from bankaccount import bankaccount
return bankaccount
def _makeOne(self, *args, **kwargs):
return self._getTarget()(*args, **kwargs)
def test_construct(self):
target = self._makeOne()
self.assertEqual(target._balance, 0)
:
balance = property(get_balance, set_balance)
ってしたんだから
target.balance
でアクセスできるんじゃないの
それともそこを通さないことに意味がある?
いや逆だろう普通に考えて
target.balance = xx
の形も使われてないし
これだとbalance = property(get_balance, set_balance)
がカバーできてないことに
なりはしないだろうか
どういうことかな
単体テストだからwithdraw
のテストでget_balance
やset_balance
に依存しない、
というのはわからなくもないけど(ほんとうは腹落ちしてない
target.balance
の形を使ってないのは漏れなんじゃないの
単純に言って、普通に使う形でテストしなくていいんだろうか、という思いがある
まあそれはおいといてテスト実行
$ pytest
================================================================================== test session starts ===================================================================================
platform linux -- Python 3.6.7, pytest-4.6.2, py-1.8.0, pluggy-0.12.0
rootdir: /home/takahiro/study/PPP3-mac/test
collected 6 items
test_bankaccount.py ...... [100%]
================================================================================ 6 passed in 0.02 seconds ================================================================================
おーできたできた
勝手にテストを見つけてくれるのはありがたい