kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

PPP3: モジュール、テスト

Chapter 08 モジュール分割設計と単体テスト

MVC
Controllerはだいたいフレームワークが面倒を見てくれる
DomainModelは永続化される状態を持つモデル
ApplicationModelは機能を構成する、通常は永続化されないモデル

テスト
ユニットテストコンポーネント結合テスト・機能単体テスト
機能結合テストシステムテスト・非機能テスト
機能結合テストは自動実行が難しく手動によるテストとなる

08-02-02 ユニットテストを書く

unittestでユニットテストを書いてpytestで走らせる
pytestの方が賢い
unittest.Testcaseを使わずpytest流でテストケースを作る場合も

unittest
クラスごとのフィクスチャー:setUp(self)tearDown(self)
モジュールごとのフィクスチャー:setUpModule()tearDownModule()

testfixturesライブラリ
compareassertEqualよりも詳細なメッセージを表示する
ShouldRaiseは例外に渡された引数も確認できる
その他いろいろ

少しサンプルがあるので動かしてみる

サンプルのクラスにself._balanceself.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_balanceset_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 ================================================================================

おーできたできた
勝手にテストを見つけてくれるのはありがたい