【TDD】テスト駆動開発【TestFirst】
■ このスレッドは過去ログ倉庫に格納されています
テスト駆動開発 (test-driven development; TDD) について マターリ 語りましょう
ツールについては別スレで
テストツールについて語るスレ 2
http://hibari.2ch.net/test/read.cgi/tech/1208013693/ >>507
何か変か?
仕様決める→テスト仕様書作成→プログラム設計→コーティング
なんだから仕様が変わる度にテスト項目見直しだろ >>509
変だろ
なんでそんな当たり前のことを述べる必要があるんだ
それとも>>506には何か深い意味があるのか? テストプログラムのテストというのはおかしいでしょうか。
例えば、アクションゲームの自動機能テストを行うために、
予め設定した大まかな指示通りに自動でコントローラーを入力する
仮想的なプレーヤーをプログラムしたとします。
このプログラムはゲームのリリースには含めないテストプログラムのひとつです。
しかし、正しく動くことが明らかなほどシンプルなプログラムではありません。
なので、この仮想プレーヤープログラムもテスト対象とすべきだと私は思います。
このような考え方はテスト駆動開発としては間違っているでしょうか。
テスト駆動を解説した本やWeb記述にもこのような状況のことは書かれていないような気がします。 テストプログラムのテストのテストというのはおかしいでしょうか。
テストプログラムのテストのテストのテストというのはおかしいでしょうか。
テストプログラムのテストのテストのテストのテストというのは可笑しいでしょうか。 >>511
> テストプログラムのテストというのはおかしいでしょうか。
別におかしくないが、そのこととTDDとは何の関係もない。 >>512
>>514
わかりました。
ありがとうございます。 >>516
数学的に考えれば品物が上がらない事は明白だろう? どこまでテストするかの話になると外部ライブラリだけでなくコンパイラやOSまで疑う必要がある
一昔前のコンパイラは多すぎてコンパイラのテストもやっていたな 訂正
>一昔前のコンパイラは多すぎてコンパイラのテストもやっていたな
一昔前のコンパイラはバグが多すぎてコンパイラのテストもやっていた Kindleでこんな本が発売されたのを発見。
読んでないので内容は全くわからないが、目次を見る限り、よさげな気もする。
『これからはじめるTDD テスト駆動開発入門 (Think IT Books)』 \1,400
http://www.amazon.co.jp/dp/B00VFQ7WCM
> エクストリーム・プログラミングのプラクティスのひとつであるテスト駆動開発(TDD)について、
> 聞いたことはあるけれど内容は知らない方、概要は知っているけれど実際に使ったことが
> ない方を対象に、全7章にわたってご説明していきます。アジャイルをかじった程度の開発
> 経験の浅いプログラマと、TDD開発を実践しているプロジェクトリーダーによる会話形式で
> 楽しくTDDを学びましょう。本書は、インプレスが運営するWebメディア「Think IT」で、「マル
> チプラットフォーム対応のゲーム開発エンジンUnityを体験する」として連載された技術解説
> 記事を電子書籍およびオンデマンド書籍として再編集したものです。 あとUnityどこに関係するんだ?amazonの紹介文修正しとけよ。 >>521
TDDの本なんてめったに出ないから紹介しただけだし。
目次は
http://book.impress.co.jp/books/1114170210
にある。
俺はTDD初心者じゃないから買わないけど。 ステマ言われたんで買ってみた。
40分で2/3位読めた(コード入力してないから)。
内容はTDDを全く知らない人向け。誤植を何カ所か見つけた。
DHHのTDD is deadについても言及があるが、及び腰で全くなってない。 読み終わったけど、全然駄目だった。
やはり、自分が読まないとお薦めしてはいけないね。
筆者は、TDDをテスト手法でもあると勘違いしてる気がする。
誤った要件理解をTDDのテストがFailすることで発見する場面が何度か出てくるが、
TDDでテストがFailするのは、基本的に最初にテストを実装・実行するときと、自分の
意図したものが正しく実装できなかったか、あるいは、リファクタリングで何かを壊した
ときかのどれか。
まあ、期待値が間違ってたということもあるけど、それは要件を間違って理解したと
いうことではない。
この本の例に則して言えば、例えばボーリングで一投目から、{(3, 7), (G, 3)}と投げた
ときのスコアを13点ではなくて16点だと誤った思い込みをしたとき(期待値を間違った
わけではなくて、スペアのボーナスは、次に初めて獲得した点数だと思い込む)、
TDDというはその誤った思い込みによるスコア体系を正しく実装する手段でしかない。 TDDに関する議論をググってみて見つけたページ。
TDDをめぐる、最近の議論についての私見。
http://blog.fieldnotes.jp/entry/2014/05/07/225129
完全に同意。
TDDは、
> 開発者テストのレベルで「開発者の思ったとおりに動く」ことが保証
されるようにするもの。
そしてそれを使って
> テストによって開発が駆動されること
を目指すもの。 >>526
TDDと、品質保証のための自動テストによる単体テストを、完全に混同してる。 >>531
ここにも勘違いしてる奴がいた
TDDはよりよい設計をもたらすものじゃない
TDDは、自分が正しいと思った設計で、それをコーディングするときに、テストの力を借りて
確信を得ながらコーディングするための手法だ
「自分が正しいと思った設計」が「Good Design」じゃない奴は、どんな開発手法を使っても
自動的には「Good Design」にはならない >>532
TDDは、自分が正しく無い設計を選んでしまったときに、少しでも早くその事を知り、フィードバックするための手法だよ。 >正しく無い設計
この「無い」の漢字の使い方は可笑しい
これフィードバックな >>534
コードを全て実装した後でテストが失敗したとき、それは
・間違った実装をした
・テストの期待値が間違っていた
というのがわかる位だよ。
正しくない設計(というか稚拙な実装)でも、正しい結果(期待値と合致する)であれば、
たいていは気づかない。 三大期待しすぎてガッカリされる手法
オブジェクト指向
リファクタリング
TDD >>536
TDDなんだから、コードを全て実装する前のテストの実装の段階でも、テストのしやすさやテスト観点、インターフェース名称などで何か気付くことがあるし、テストの失敗の仕方でもフィードバックを得られる。
テストは漫然とやるのではなく、情報収集の手段だと考えてやることが大事だよ。 >>540
> TDDなんだから、コードを全て実装する前のテストの実装の段階でも、テストのしやすさやテスト観点、インターフェース名称などで何か気付くことがあるし、テストの失敗の仕方でもフィードバックを得られる。
そういうことを経てTDD用のテストとコードが完成したとき、その設計がGood Designではないと
いうことは気づかないということだよ。
テスト容易性やネーミングは、Good Designのほんの一部。 >>541
そりゃTDDのプロセスが1周すれば、残るのはTDDでは気付けない事や割りに合わないことが残るに決まってるよね。
TDDが完全に役に立たないと言いたいのではなくて、より良い設計を目指す手法としては割りに合わないと言いたいのだと思うけど、ではTDDより良い手法としては何があると主張してるのかな? >>542
勘違いしてるかもしれないけど、俺は超TDD派だし、日々TDDでコーディングしてる。
ただ、TDDはよりよい設計を導き出す手法ではないと言ってるだけ。
もう少し言うと、「気付けない事」の中には「思い込みバグ」なんかも含まれる。
自分がそれが正しいと思ったら、それが正しくあるようなテストとコードを書くため、
それがバグであることがわからない。
もちろん、要求仕様との乖離があってもわからない。
TDDはそういうものを検出するものではない。 TDDは万能薬じゃないって解っていればOKなのだが、TDDのテストが通るからOKみたいなのはあり得ないってだけでしょう?
想定していない事態はTDDじゃ検出できない(想定外の事が起きたときに加える事は当然だけど)
テストは自分の想定している事態に対してコードが正常であるって保証をプログラマに与えてくれるだけでしかないって言う部分がなぜか万能薬みたいに語られるのってエヴァンジェリストが悪いとしか思えない。 >>544
俺に対して何を言いたいのか良くわからないが、俺は
>>534
> TDDは、自分が正しく無い設計を選んでしまったときに、少しでも早くその事を知り、フィードバックするための手法だよ。
を否定しただけだよ。 >>544
> テストは自分の想定している事態に対してコードが正常であるって保証をプログラマに与えてくれるだけでしかないって言う部分がなぜか万能薬みたいに語られるのってエヴァンジェリストが悪いとしか思えない。
エヴァンジェリストは、「○○は万能薬ではない」って大抵言ってると思うが。
「○○は万能薬」と思う(勘違いする)のは、良くわかってない奴か、「○○は万能薬だと言われている」
ことにしてdisりたい奴だけじゃないの? >>543
どんな設計手法も、その手法を使わないよりも良い設計を目指すためにあると思うよ。
より良い設計というのはバグが無いという意味ではなくて、費用対効果の面で妥当な設計、と言い換えても良いけど。
新規の何らかのクラスを設計するときに、シーケンス図を書いて複数人でレビューしてから実装には入った方が費用対効果が高いのか、TDDで実装してから本体とテストコードをレビューした方が費用対効果が高いのか?
もし、TDDの方が高いとき、それは何故なのか?
っという観点の話にすれば、俺の主張は以下になる。
TDDはテストによってより早くフィードバックが得られるから費用対効果が高いが、そのフィードバックを解釈するのにも経験が必要で、テストが通りさえすれば良い、という考え方では効果は発揮できない。
また、レビューアにもフィードバックを解釈する能力が要求されるうえ、ペアプログラミングでない場合はテストがNGになった時点の情報が得られないため、設計者よりも少ない情報から設計を判断するための高い能力が必要になるかもしれない。
シーケンス図の方も書けば良い設計になるわけじゃないし、シーケンス図から問題点を読み解く能力が必要だが、おそらくTDDよりはレビューが易しい気がする。
だが、TDDのテストは実行可能ということが利点であり、レビューアが疑問があればテストを追加して実行することが出来る。これを利用すれば、費用対効果を更に高めることが出来るのではないか? >>547
本当にTDDを理解して実戦しているのか疑わしいレベル。
> そのフィードバックを解釈するのにも経験が必要
意味がわからない。
テストによるフィードバックは失敗あるいは成功しかなく、正しく実装できたはずなのに失敗するのは、
・テストが間違っている
・正しく実装できたはずというのが思い違い
のどちらか、あるいはその両方しかなく、解釈もクソもない。
自分が書いたテストが失敗して、その原因もわからないレベルなら、それはTDDをする資格がない。
というか、そんな奴にプロダクトコード書かせるな。
> ペアプログラミングでない場合はテストがNGになった時点の情報が得られないため、
> 設計者よりも少ない情報から設計を判断するための高い能力が必要になるかもしれない。
これも意味がわからない。
> どんな設計手法も、その手法を使わないよりも良い設計を目指すためにあると思うよ。
そもそも、TDDは設計手法というより開発手法と言うべきで、極言すれば実装手法でしかない。
というか「よい設計」の定義が俺と大幅にずれてる気がする。
俺が思う「よい設計」というのは、例えば
・SOLID原則が守られている(あるいはそれほど重大な違反は無い)
・カプセル化が守られている
・メンテナンス性が良い(リーダビリティが良い)
・パフォーマンスが良い
などなど。
そういう意味の「よい設計」ができる奴は、TDDをしなくとも良い設計はできる。 あと、TDDにおける「素早いフィードバック」というのは、
・正しくテストが実装できたであろう実感(red -> green)
・思い通りのコードが実装できたであろう実感(green -> refactoring -> green)
だぞ。
設計が正しい、あるいは妥当であるというフィードバックではない。 >>547
今時、シーケンス図を書いて複数人でレビューしてから実装に入るって、どんな分野のどれくらいの規模なの?
リファクタリングが一般化した現在、クラス図でさえ事前にかっちりしたもの書くと手戻りが発生していやがられるのに。 それは言える
メタプログラミングでプログラムは自動生成にしておけば
手戻り発生しても仕様書直すだけで済む 自動生成するプログラムの修正が必要になるだろタコ。 カバレッジって自動じゃないテスト(ようは手動の結合テスト)でも使えんの? ■ このスレッドは過去ログ倉庫に格納されています