狠狠撸
Submit Search
ユニットテスト 1日目
?
Download as PPT, PDF
?
2 likes
?
2,184 views
Yoshiki Shibukawa
Follow
Python Developer Camp2008 ユニットテストの紹介スライド
Read less
Read more
1 of 25
Download now
More Related Content
ユニットテスト 1日目
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
Download