Accueil
Explorer
Soumettre la recherche
Mettre en ligne
S’identifier
S’inscrire
Publicité
Check these out next
Introduction to C Programming Language
Simplilearn
The Pixar Way: 37 Quotes on Developing and Maintaining a Creative Company (fr...
Palo Alto Software
9 Tips for a Work-free Vacation
Weekdone.com
I Rock Therefore I Am. 20 Legendary Quotes from Prince
Empowered Presentations
How to Map Your Future
SlideShop.com
Read with Pride | LGBTQ+ Reads
Kayla Martin-Gant
Exploring ChatGPT for Effective Teaching and Learning.pptx
Stan Skrabut, Ed.D.
How to train your robot (with Deep Reinforcement Learning)
Lucas García, PhD
1
sur
47
Top clipped slide
UnitTestのためのクラス設計
18 Sep 2012
•
0 j'aime
17 j'aime
×
Soyez le premier à aimer ceci
afficher plus
•
7,920 vues
vues
×
Nombre de vues
0
Sur Slideshare
0
À partir des intégrations
0
Nombre d'intégrations
0
Télécharger maintenant
Télécharger pour lire hors ligne
Signaler
Développement personnel
Takeshi Ishida
Suivre
Web Developer à アライドアーキテクツ
Publicité
Publicité
Publicité
Recommandé
ブラウザでの自動テスト
hashedrock
1.1K vues
•
22 diapositives
Spock's world
Takuma Watabiki
4.4K vues
•
41 diapositives
Test Plugins
ykhr
684 vues
•
28 diapositives
Antigenを使おう
Hideaki Miyake
2.4K vues
•
46 diapositives
ファイルレスマルウェアの紹介
Bigdrea6
76 vues
•
13 diapositives
StreamingAPIを使用したTwitter Bot @waketi の紹介
kaiba d
907 vues
•
14 diapositives
Contenu connexe
Dernier
(20)
在哪里可以做《奥克兰大学文凭证书|毕业证》
kjds1245
•
2 vues
国外学历【伊利诺伊理工学院研究生文凭毕业证留学生首选】
21dsasa
•
2 vues
①【圣力嘉学院毕业证文凭学位证书|工艺完美复刻】
vgh215w
•
2 vues
①【伯恩茅斯大学毕业证文凭学位证书|工艺完美复刻】
0987hgh789
•
2 vues
留学学分不够办理《美国塔夫茨大学假文凭毕业证》
250dsacd
•
3 vues
留学学分不够办理《美国阿苏萨太平洋大学假文凭毕业证》
250dsacd
•
3 vues
国外学历【奥本大学研究生文凭毕业证留学生首选】
21dsasa
•
2 vues
办Griffith电子毕业证书,办格里菲斯大学毕业证高仿成绩单QQ/微信:819 4343,办Griffith假硕士毕业证,办Griffith本科假文凭证...
BonnieLaymon
•
4 vues
本科/硕士《新西兰奥克兰大学毕业证成绩单》
21dadasda
•
3 vues
留学生案例《邓迪大学学位毕业证书和学士文凭》
36dsahj
•
2 vues
留信网认证可查【卡尔顿大学文凭证书毕业证购买】
12da12
•
2 vues
国外学历【塞吉-蓬图瓦兹大学研究生文凭毕业证留学生首选】
jsad789
•
2 vues
本科/硕士《新西兰尼尔森理工学院毕业证成绩单》
21dadasda
•
4 vues
留学生案例《菲莎河谷大学学位毕业证书和学士文凭》
789sd12
•
2 vues
留学生案例《艾德菲大学学位毕业证书和学士文凭》
15sdasd
•
2 vues
在哪里可以做《基尔大学文凭证书|毕业证》
kjds1245
•
2 vues
①【高贵林学院毕业证文凭学位证书|工艺完美复刻】
vgh215w
•
2 vues
☀️《UEDIN毕业证仿真》
DAS54SA
•
11 vues
《南达科他大学毕业证|学位证书校内仿真版本》
123shab123
•
4 vues
☀️《Bournemouth毕业证仿真》
DAS54SA
•
2 vues
En vedette
(20)
Introduction to C Programming Language
Simplilearn
•
333 vues
The Pixar Way: 37 Quotes on Developing and Maintaining a Creative Company (fr...
Palo Alto Software
•
83.4K vues
9 Tips for a Work-free Vacation
Weekdone.com
•
2.3K vues
I Rock Therefore I Am. 20 Legendary Quotes from Prince
Empowered Presentations
•
137.7K vues
How to Map Your Future
SlideShop.com
•
265.2K vues
Read with Pride | LGBTQ+ Reads
Kayla Martin-Gant
•
175 vues
Exploring ChatGPT for Effective Teaching and Learning.pptx
Stan Skrabut, Ed.D.
•
52K vues
How to train your robot (with Deep Reinforcement Learning)
Lucas García, PhD
•
40.1K vues
4 Strategies to Renew Your Career Passion
Daniel Goleman
•
119.9K vues
The Student's Guide to LinkedIn
LinkedIn
•
82.5K vues
Different Roles in Machine Learning Career
Intellipaat
•
11.2K vues
Defining a Tech Project Vision in Eight Quick Steps pdf
TechSoup
•
8.6K vues
The Hero's Journey (For movie fans, Lego fans, and presenters!)
Dan Roam
•
28K vues
10 Inspirational Quotes for Graduation
Guy Kawasaki
•
301.4K vues
The Health Benefits of Dogs
The Presentation Designer
•
34.2K vues
The Benefits of Doing Nothing
INSEAD
•
51.3K vues
A non-technical introduction to ChatGPT - SEDA.pptx
Sue Beckingham
•
17.9K vues
The Dungeons & Dragons Guide to Marketing
Ian Lurie
•
15.9K vues
How You Can Change the World
24Slides
•
57.9K vues
signmesh snapshot - the best of sustainability
signmesh
•
9.5K vues
Publicité
UnitTestのためのクラス設計
UnitTestのための クラス設計
t_ishida
自己紹介 名前:石田 武士(@t_ishida) 所属:アライドアーキテクツ システム部
注意 日頃UnitTestしている人には当たり前の話しか しません PHPUnitそのもの使い方は説明しません このセッションは過去UnitTestにトライしてよ く分からなかった、もしくは挫折した人に最 適化されています
では、早速
テストしてますか?
テストしてますよ 何度もブラウザから叩いて、こっちの分岐 入った「っぽい」し 何度もブラウザから叩いて、期待通りの回数 ループしてる「っぽい」し 何度もブラウザから叩いて、期待通りのメ ソッド呼び出した「っぽい」し
テストしてますよ 何度もブラウザから叩いて、こっちの分岐 入った「っぽい」し
死亡フラグ 何度もブラウザから叩いて、期待通りの回数 ループしてる「っぽい」し 何度もブラウザから叩いて、期待通りのメ ソッド呼び出した「っぽい」し
本当にテストしてますか? リロードデバッグですか? 実行タイミングが同じだというだけで、関連の 無いコードを同じ場所に追記しまくってません か? それをリロードでデバッグして「テストをしな いで」リリースしていませんか?
本当にテストしてますか? リロードデバッグですか? 実行タイミングが同じだというだけで、関連の無い
死亡フラグ コードを同じ場所に追記しまくってませんか? それをリロードでデバッグして「テストをしないで」 リリースしていませんか? 結合テストだけしてテストした気になっていませんか?
にんげんさんてすとしないです?
だって・・・ DBが絡むから値固定できないし ファイルに吐きだすから値検証できないし ブラウザから入力しないとダメだし
だって・・・ DBが絡むから値固定できないし
死亡フラグ ファイルに吐きだすから値検証できないし ブラウザから入力しないとダメだし
結合テストをして意味があるの は単体テストをやり尽くしたあ
とからです
UnitTestってなに? 身も蓋もない言い方をすれば単体テスト ただし、本セッションで言う単体テストは xUnit系テスト、主にPHPUnitのテスト メソッドに色んなパターンの引数を渡して戻 り値が合ってるか比べるだけです
つまり、こんなコードを
こうテスト
UnitTestの考え方 “単体”での確認が出来れば良い 故に呼んでるメソッドの先の正しさは気にし なくて良い(その先の正しさは、それ単体で確 認するから) メソッド単体での正しさを徹底的に確認する
UnitTestのメリット 環境から切り離してロジック単体をテストで きる プログラムとして保存するから何度でも実行 出来る。そして速い。(回帰テスト自動化) 電算機のテストは正確 ("hoge" !=
'hoge ')
UnitTestのデメリット テストを作るのは時間がかかる 場合によってはテストのためにクラス設計を 歪める必要がある 必ずしも、それで全てのバグを検出すること が出来ないので過信は禁物
だからと言って、単体 テストしない理由には なりません
ここから本題
UnitTestのためのクラス設計 UnitTestを意識してクラス設計する必要がある 故に既存のコードをテストに入れるのは大変
どれだけ大変かはレガシーコード改善ガイド を読むと良いです
UnitTestのための クラス設計の指針 強い“依存”を徹底的に排除する
クラス間の依存 外部システムへの依存 複雑度を下げる
モック そのクラスのように振る舞うダミーのこと ダミーで入力を検証する ダミーで出力を固定する
こういうこと
モック モックを使うということはオブジェクトを差し替える ということ
モックを使うための注意 つまり・・・
モックを使うための注意 メソッド内で new してたら差し替えられない staticメソッド呼び出しは差し替えられない 組み込み関数は差し替えられない final
な クラスも差し替えられない(モックは 継承して作る)
依存の排除(クラス間の依存) コンストラクタやメソッドの引数でオブジェ クトを渡す(ファクトリを渡すのも可)
セッタで上書き可能なメンバ変数にする
オブジェクト渡し
オブジェクト渡し
セッタで上書き
セッタで上書き
おまけ(依存なし)
依存の排除(外部システム) プロキシパターン
プロキシパターン DBなんか文字列(SQL文)渡したら配列を返すク
ラスです
プロキシパターン ファイルの読み込みなんか文字列(path)を渡し たら文字列を返すただのメソッドです
複雑度を下げる 同じタイミングで実行されるからと言って関 連の無いコードを同じ場所に書かない ifの入れ子になったらメソッドを分割する ループの中は別メソッドにする(走査と操作は 分ける)
ざっくばらんなまとめ そのクラスに関連するオブジェクトはメンバ 変数にする メンバ変数はセッターで上書き可能にする メソッドは小まめに分ける 外部システムとの絡みはラッパーを作る
テストしない理由? テスト書いている時間がないから 上司がテストに対する理解がなくて時間とら せてくれないから あとで書くから 複雑過ぎてテストが書けないから
テストしない理由? テスト書いている時間がないから
死亡フラグ 上司がテストに対する理解がなくて時間とら せてくれないから あとで書くから 複雑過ぎてテストが書けないから
時間無くてテスト書けない それは手動でテストしている時間も無いはずな のでリリースしてはならないコードです
上司の理解を得られない 理解を得る必要はありません 勝手に書いてください 自分の時間と健康と心の平穏を守るためにや るのです
複雑過ぎてテスト書けない それは、そもそも手動でもテストできません メソッドを分割して複雑度を下げてください
あとで書く 絶対にあとで書きません
書いておけば妖精さんがテ ストしてくれます
ご清聴ありがとうございました
http://tech.aainc.co.jp
Notes de l'éditeur
\n
\n
\n
\n
\n
ユニットテストの説明に前に本講義で多用されるオブジェクト指向というものについて説明しておこうと思います。\nオブジェクト指向とは何か?  というとよくある説明として「モノを中心にしたプログラミングのことだよ。 $apple->color = 'red'; みたいなね」 のようなものを見かけます。\n実際にそれは正しし、分かっている人には分かり易いのですが、分からない人にとってはただでさえ分からないところを一層煙に巻かれる状態になり易いので、別のアプローチから簡単に説明します。\nデータ構造とアルゴリズムをワンセットにした単位で扱うプログラミング手法のことです。構造体に変数と関数ポインタをセットにしたものだと思えば良いです。\nその関数ポインタで呼び出した内部で、その構造体の変数を"$this"として直接アクセスできるだけですね。PHPで言う場合、構造体ってハッシュのことだと思えば良いです。\n以下のコードは配列とクロージャを使ってイメージを表現したコードです。\n\n
\n
\n
\n
\n
\n
\n
人間さんはテストしないですか?\n
\n
\n
結合テストで確認できるのはインターフェースが\n一致しているということだけです。\n\n
ユニットテストっていうのは単体テストのことです。ただし、ここではユニットテストと言う場合、オブジェクト指向プログミングにおけるxUnitを用いたクラス単位のユニットテストのことを指します。JavaならばJUnit、.NETならば NUnit、PHPならばPHPUnitを使います。\n\n
\n
\n
\n
プログラムとして保存する「テスト仕様書」であり「エビデンス」であり\n「プログラムの使い方を説明するドキュメント」であると考えれば良いです。\n他に、「無駄に複雑なコードが書けなくなる」というメリットも有ります。\n最低限「UnitTestが書けるレベルのコード」ということが保証されます。\n
3つ目は気になるところだと思うのですが、\nクラス境界、システム境界のインターフェースに齟齬が\nあるという種類のバグは検出出来ません\n
\n
\n
こんなコマンド打つと実行できるよ\n
\n
\n
Unitテストは単体テストなので "クラス単体" をテストします。\n依存を排除したクラス設計をしなければなりません。\n\n\n
依存を排除する理由はつまるところ、これです。\n
モックを作るコードを説明する。\n・メソッドの入力の検証\n・出力の固定\nについて説明する\n\n
\n
\n
\n
\n
\n
\n
\n
DBWrapperをモックにして、コンストラクタの引数で渡しています。\n\nモックにして期待通りのSQL文が渡されることの確認と\nDBが返した値をそのまま返却することを確認しています。\n図中では畳んでますが、getTestCDで配列を定義しています。\n\n
\n
FileManagerをモックにしてセッタで設定しています。\nまた、自身のfindに対する依存があるため、\n自身をモック化してfindが返す値を固定しています。\n\n
\n
エスケープのテスト\n\n何にも依存しないユーティリティのようなものなので、ままテストできます。\n
ラッパーのことです\n
\n
\n
\n
引数で渡すにせよ関連するクラスはメンバ変数にしてしまうのが、\nUnitTest的には便利だし、オブジェクト指向の設計的にも理にかなってることが多いはず。\n\n
\n
\n
\n
\n
\n
\n
人間さんはテストしないですか?\n
\n
Publicité