• Like
ユニットテスト 1日目
Upcoming SlideShare
Loading in...5
×

ユニットテスト 1日目

  • 2,490 views
Uploaded on

Python Developer Camp2008 …

Python Developer Camp2008
ユニットテストの紹介スライド

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,490
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
21
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. ユニットテスト - 1日目 - 渋川よしき
  • 2. まずは
    • 目的
      • ユニットテストは何かを知る
      • ユニットテストは何ではないかを知る
      • テスト駆動開発の作法を知る
      • unittest.py, doctest を使ってみる
    • やって欲しいこと ※
      • 体験->発見
      • いつもと違ったことをする
      • 質問する
      • 失敗はない、学びがある
      • 楽しむ
    ユニットテスト1日目 Page ※ 六本木ヒルズでやっている   NLP セミナー の手法を参考にしてます
  • 3. チェックイン ※
    • ペアを作ってください
      • 二人一組で開発してもらいます
      • やろうとすること、考えていることを口に出すと学習効果アップ ※
    • 自己紹介 (2 人で 2 分 )
      • 自分の名前 or ハンドルネーム
      • Python との関わり
      • この1時間で何を学びたいか?という決意表明をしてください
    ユニットテスト1日目 Page ※ 僕が勝手に 師匠と呼んでいる方の  スライド を参考にしました ※ 「言語技術」が日本のサッカーを変える
  • 4. アジェンダ
    • ディレクティブテスト
      • ユニットテストとは何か?
      • ユニットテストとは何ではないのか?
    • unittest.py を使ったテスト駆動開発体験
      • まずは開発のデモ
      • 続きはみなさんの手で!
    • doctest を使ってみる
    ユニットテスト1日目 Page
  • 5. テストの分類 ~ディレクティブなテスト~
  • 6. 2種類のテスト
    • ディレクティブなテスト
      • 開発をディレクション ( 方向付け ) するためのテスト
      • アジャイルソフトウェア開発で言うところのテスト
    • マネジメントのためのテスト
      • 品質などを管理するためのテスト
      • いわゆる、ソフトウェア工学の教科書に出てくるテスト
    ユニットテスト1日目 Page
  • 7. この分類の発想の種
    • フランクリンプランナー
      • ディレクタ・リーダ ( メンバーをひっぱる )
        • 戦略立案、決断、全体設計
      • マネージャ ( メンバーの尻をたたく )
        • 人・モノ・金の管理、細かい設計
    • ソフトウェアのテスト
      • アジャイル開発のテスト
      • ソフトウェア工学の本に載っているテスト
    ユニットテスト1日目 Page +ほりうち!師匠のスライド
  • 8. テスト駆動開発 (TDD) とユニットテスト
    • テスト駆動開発
      • テストを先に書き、実際のコードをその後に書くやり方
      • この開発手法の中で書くテストがユニットテスト
      • eXtreme Programming で広まった手法
      • 開発の方向付けをするディレクティブなテスト
    • いろんな呼び方
      • テストファーストプログラミング
      • デベロッパーテスト
      • 動く仕様書
    Here comes your footer  Page
  • 9. まとめ ~ユニットテストとは?~
    • ユニットテストとは何か?
      • 開発を方向付けする
      • テスト駆動開発の中で書く
    • ユニットテストは何ではないか
      • 品質管理のテスト
        • ウォーターフォールのテストフェーズのテスト
    Here comes your footer  Page
  • 10. ユニットテストをテスト駆動で書く unittest.py
  • 11. 例題:ダーツのクリケット
    • 15 ~ 20 、ブル ( 中心 ) だけを使う
    • 交互に投げる
    • 1つの数字に3本入ると占領 ( クローズ )
      • ダブルは2本分、トリプルは3本分
      • 全員が一つの数字をクローズするとキル
      • クローズしてキルされるまではスコアが入る
    • 誰かが全部をクローズすると終了
      • スコアが高い人の勝ち
      • 最大 20 ラウンド
    Here comes your footer  Page 引用元: Wikipedia
  • 12. まずは準備
    • ファイルの構成はどちらでもいいです。
      • 実際のコードとテストコードでファイル分割
      • テストコードも実際のコードも同じファイルにする
    • PyScripter を使っていればスタートアップコードは不要です
    • 最初のテストをパスするところまではデモします。真似してタイプしてみてください
    • 二つめ以降は画面に出しませんので、 挑戦してみてください
    ユニットテスト1日目 Page # -*- coding: utf-8 -*- import unittest # スタートアップコード if __name__ == “__main__”: unittest.runTests()
  • 13. 例題:ダーツのクリケット ( 今回のワークで扱う範囲 )
    • 15 ~ 20 、ブル ( 中心 ) だけを使う -> 18 と 20 だけ使う
    • 交互に投げる ->一人分だけ実装
    • 1つの数字に3本入ると占領 ( クローズ )
      • ダブルは2本分、トリプルは3本分
      • 全員が一つの数字をクローズするとキル
      • クローズしてキルされるまではスコアが入る
    • 誰かが 全部 (18 と 20) をクローズすると終了
      • スコアが高い人の勝ち
      • 最大 20 ラウンド
    ユニットテスト1日目 Page
  • 14. テスト駆動開発の基本ルール
    • テストファースト
      • Python が「コードを書いてくれ~」と言ってからコードを書く
      • 具体的には AttributeError, AssertionError など
    • 仮実装
      • 返値が 3 なら、 return 3 と書いてしまう
    • 三角測量
      • 一つのメソッドにつき2つのテストケースを使う
    • 明白な実装
      • 分かり切っている実装は仮実装を行わないでいきなり実装
      • 今回は封印してください
    ユニットテスト1日目 Page
  • 15. 最初のメソッドを実装するまで テストケースを書く
    • テストケースは unittest.TestCase の子クラスとして実装します
    • テストを書くメソッドは test から始めます
    • TestCase クラスのメソッド (assert_, assertFalse, assertEqual など ) を使ってテストを書いていきます。
    • なるべく小さいステップで上れるように、階段を設定していきます。
    ユニットテスト1日目 Page class TestCricket(unittest.TestCase): def test_throw_1(self): game = Cricket() game.throw(18, 1)         self.assertEqual(game.get_count(18), 1)
  • 16. 最初のメソッドを実装するまで Failure を見る->仮実装で OK を見る
    • 次に、 NameError( クラスが無い ) と言われるので、クラスを実装する。
    • NameError->AttributeError( メソッドがない ) とひとつずつ解決していくと、 Error が Failure( テスト失敗 ) に変化する
    • Failure を見たら、仮実装 ( テストを通るだけの最低限 ) をしてテストを OK にする
    ユニットテスト1日目 Page class Cricket(object): def throw(self, area, count): pass def get_count(self, area): return 1 # 仮実装
  • 17. 最初のメソッドを実装するまで 三角測量でメソッドを完成させる
    • もう一つテストを書いて、実装を完成させます ( 三角測量 )
      • 第一ステップ:一つ値を設定してから取得 ( 最初の仮実装 )
      • 第二ステップ:もう一つ値を設定して、合計値を取得 ( 今回のステップ )
    ユニットテスト1日目 Page def test_throw_2(self): game = Cricket() game.throw(18, 1) game.throw(18, 2) self.assertEqual(game.get_count(18), 3)
  • 18. それでは手を動かしてみて下さい 残りの仕様を実装してみてください
    • 15 ~ 20 、ブル ( 中心 ) だけを使う -> 18 と 20 だけ使う
    • 交互に投げる ->一人分だけ実装
    • 1つの数字に3本入ると占領 ( クローズ )
      • ダブルは2本分、トリプルは3本分
      • 全員が一つの数字をクローズするとキル
      • クローズしてキルされるまではスコアが入る
    • 誰かが 全部 (18 と 20) をクローズすると終了
      • スコアが高い人の勝ち
      • 最大 20 ラウンド
    ユニットテスト1日目 Page
  • 19. ユニットテストのその後 今回はここまではできません m(_ _)m
    • リファクタリング
      • 機能追加すると徐々にコードが汚くなる
      • プログラムを整理してキレイにする
      • 修正後のコードの動作はユニットテスト が保証する
    • 開発のリズム
      • レッド:テストが失敗
      • グリーン:テストが成功
      • リファクタリング:きれいなコードへ
    きれい 汚い ( すぐに ) 動かない ※ 角谷さんのスライド より GREEN 動く Refactoring RED ユニットテスト1日目 Page
  • 20. doctest を使ってみよう ユニットテスト1日目  Page
  • 21. doctest
    • doctest とは?
      • docstring の中のテストコードを実行する仕組み
      • コメントの中に自然に書ける
      • インタラクティブモードをコピペすればテスト完成
      • 文芸的なテスト
      • Python が発祥?
    ユニットテスト1日目 Page    import doctest    def pow(x, y):     """calc power.    >>> pow(1, 2)    1    >>> pow(10, 2)    100    """    result = 1    for i in xrange(y):    result *= x    return result    if __name__ == '__main__':    doctest.testmod()
  • 22. doctest を書いてみよう
    • 例題:先ほど作ったクリケットのクラスのテスト
      • ゲーム終了までの過程をインタラクティブモードで実行
      • それをコピペして、 docstring に書き込みます。
      • もしも unittest のスタートアップを書いていた場合には doctest の スタートアップに切り替えます。
    • 実行の仕方
      • スタートアップコードを書いた場合にはそのままコンソールから実行できます
      • エラーがないと何も画面には出ません
      • -v をつけると、実況中継が出ます
    ユニットテスト1日目 Page
  • 23. doctest に関する渋川の所感
    • メリット
      • 気軽に書ける
      • コメントの中にかけるので、自然言語で補強できる
      • ユーザの目に触れやすい
      • ライブラリ系ならば動作可能なドキュメント / サンプルコードとして使える
    • デメリット
      • 複雑なテストケースが書きにくい
      • 網羅的なテストケースが書きにくい ( 1オブジェクトにつき数パターンが限度? )
      • return で結果がきれい出るものじゃないと書きにくい ( 結果が DOM ツリーになるとか )
    ユニットテスト1日目 Page
  • 24. 宿題
    • 周りの人とユニットテストについて議論してみましょう。
    • ダーツのクリケット
      • 残りのルールもすべて実装してみてください
    • ボウリング
      • ユニットテストのサンプルとして人気の、ボウリングのスコア計算を作ってみてください
    • 100 本ユニットテスト ※
      • ユニットテストを 100 本書いてみて下さい
    ※ MindMap のセミナー の宿題を   参考にしました ユニットテスト1日目 Page
  • 25. 参考資料 これからユニットテストを深めていくために
    • Python のライブラリリファレンス unittest , doctest
    • デブサミ 2008 和田卓人氏「デベロッパーテスティング・ライブ」
    • JPUG 北海道支部 /Ruby 札幌合同 角谷信太郎氏「スはスペックのス」
    • Google->TDD, ユニットテスト etc
    • http://www.codeplex.com/pyspec/ - 引っ越し予定
    • まさ ー る 氏 Kent Beck Testing Framework 入門 ( 渋川の原点 ) – 1999 年
    ユニットテスト1日目 Page