自動テストの作成・実行の習慣がないチームに、それを導入した経験がある方の経験談が知りたいです。
参考:コミットログを書く文化がないチーム https://teratail.com/questions/12542
追記 (2015-09-25)
最近、読んだ本にこんな文がありました。
https://kindle.amazon.co.jp/post/mpWzXQrCS9WpA-HTl2cIcw
... テストは病みつきになるという私の主張にみなさんが同意しないかもしれない唯一の理由は、みなさんが試してみたことがないということです。...
学校や研修で、テストを書いてグリーン状態を保ちながら改善、拡張をしていくという経験をした人が増える(増やす)ことが大事なのかもしれません。
(シノゴノいうより経験しさえすれば...)
追記 (2015-11-07)
・11/31 時点で 評価点数が一番多かった回答をベストアンサーにしようと思います。
追記 (2015-10-04)
・teratail サイトでは機能追加、変更の際にどんなテストを実施しているのかを知りたいです。
追記 (2015-09-17)
- github のサービスで テストのコードカバレッジレポートを作ってくれるものがあります。(coverails)
レポート例: https://coveralls.io/builds/867027/source?filename=lib%2Fboard.rb
学校や新人研修でのプログラミングの課題の評価は,
テスト・カバレッジを含めることが当たり前
のことになればと思っています。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
私はフリーランスという立場上、個人的に作業するか大プロジェクトの片隅で与えられたら仕事を黙々とこなす(=郷に入っては郷に従え)という状況なので、導入経験は無いのですが・・・
少し離れた位置から 醒めた 目で眺めて見ると、自動テストの作成・実行を習慣化するのは至難の業であり、通常業務の片手間に実施出来ることではありません(と思います)。
ではまず、作成を根付かせるポイントから。
以前にどこかの質問の回答でも触れましたが、JUnitをテストツールと位置付けて、仕様変更の後追いをしている様ではまず成功しません。最初は良くても長続きする事は無いでしょう。
何故ならば、既に完成している仕様に合わせてテストクラスを書くと言うことは、まずテストクラスが仕様通りであることを テスト しなければならず、短納期かつ仕様変更の多い昨今では、納期が膨らむか、最悪、テストクラスが完成したかしないかのうちに仕様が変わりいつまで経ってもプログラム本体の実装に取り掛かれないという状況に陥りかねません。
それを打開する方策の一つとして登場したのがテスト駆動開発です。
これはテストを先にやる方法であると安直に説明される場合もありますが、それは間違いです。
そうではなく、詳細設計の成果物として、利用やメンテの難しい従来型の詳細設計書を作成するのを止めてしまい、浮いた時間で動く詳細設計書をテストクラスという形で作成するという開発手法です。
そのメリットを幾つか列挙すると
- 複雑な仕様でも、厳密に定義しやすい
- 仕様通りかどうかは、動かしてみれば一目瞭然(OK:緑、NG:赤)
- 仕様変更の度に「後追い」で設計書のメンテをしなくて良い
- 設計完了時には単体テストの自動化も完了
- 作成したテストクラスは、コーディング時から各種テスト行程での回帰テスト、更にはエンハンス期間全体を通して利用できる
つまり、付け足し作業ではなく、開発プロセスの中で自動的に生成され、掛けた労力が十二分に報われる仕組みになっているので、その価値を理解できれば習慣化も容易になるというものです。
ただし、開発プロセスそのものの変更を余儀なくされるので、若手中心の小規模案件からパイロット的に開始して実績を積んで行くのが良いと思います。
次に、実行を根付かせるポイントについて。
実は、こちらもポイントは自動化です。
Jenkins
のようなツールが作成されもてはやされているのは、ビルドやテストなど、単調で面倒だけど速く正確に実施しなければならないタスクを自動化するためです。
そもそも人間の脳は退屈
を最も嫌います。また、同じ様な事を何度もやっていると、どこまでやったかを簡単に忘れてしまいます。
更に、もし手作業で確実に実施出来たとしても、品質担保の為に証跡
を残さねばならないとすれば、それもかなりの負担です。
テストの自動実行の仕組みは、これらの課題を一掃する可能性を秘めた極めて有望なツールです。
以上をまとめると、
- 若手中心の小規模案件から
- 習慣化を強要するのではなく
- 最初は簡単なところから
- 成果が無理なく「自動的に」得られる様に手順や仕組みを整備する
という感じです。
もちろん、言うは易く行うは難しですから、遠い異国へ宣教旅行へ行くような覚悟が必要だと思いますけれども。
最初の改宗者を見つけるまでは、とにかく前だけ見て頑張ってください。
投稿2015/09/08 00:16
編集2015/09/08 10:34総合スコア5936
0
自分の習慣を改めることでさえ至難の業なのに、他人の習慣を変える事の難しさは想像を絶するでしょう。というか、自分の場合は失敗しました。3年かけても変わらなかったので、自分がチームを変える決断をしました。失敗談でも良ければ聞いてください。
自動テストの導入のために3年間で行ったこと
そんな言うほどやってないでしょ、と思われるかもしれませんが、結構がんばったつもりです。それでもチームメンバーの習慣を変える事はできませんでした。とった戦略が間違ったものだったのだとふりかえります。
- レガシーコード改善ガイドの読書会
- 開発環境構築手順書にしれっとテスト用のツール導入を追加
- ユニットテスト及びテスト駆動開発導入のためのワークショップ
- Code Retreatという設計技術を磨くイベントの開催
- 日々の開発でペアプロで回し、率先してユニットテストをデモ
なぜ普及しなかったのか?
現状の否定をされて嬉しい人はいない
成功を体験した集団を、 現状否定をして 改革すべきではないと思います。 その人たちは 善意でそれをずっとやってきて、 しかもそれで 成功してきている人たちなんですから、 現状否定では理解や共感はえられないんです。
余程の組織でなければ、ソフトウェアをリリースする前にテストは行っているはずです。そのテストは手動で、人の目で確認しています。「その方が安心だ」派もいます。最終的な確認はもちろん人の目で行うべきですが、もっと小さなサイクルで行う事で細かなバグを防ぐのが自動テストの利点の1つです。
「全て自動でテストを行う」といった過激な事は言っていなかったつもりですが、そのように受け取られていたのかもしれません。
導入時の成果をうまく説明できなかった
「自動テスト」の効果は「開発効率を上げること」ではありません。「開発効率が下がらないようにすること」です。そのため、実践した時の効果が見えづらい宿命にあるように思います。
たくさんテストケースを書いても実行時間が伸びるだけでバグの捕捉ができないかもしれません。そのため、最低限のテストを実行するように、後から間引くなどの調整が必要です。良いテストケースはどんなケースで、どんなテストケースはダメなのか、議論することも必要です。
はてさて、質問者さまの環境はどんな環境でしょうか?日々の開発についてふりかえり、チームで話ができる環境でしょうか?その環境はお互いの意見を率直に交換ができる環境でしょうか?もっと良いやり方はないか、という点において貪欲に追求しているチームでしょうか?
ただ「自動テストっていういいやり方があるんだよ」っていうのを紹介するだけでは根付かない理由はそういうところにもあるように思います。
最後に
文化を変える事に一番大事なこととして「諦めないこと」を上げる方がいます。それは否定しません。ただ、残念ながら人生の時間は有限です。文化を変えようとチャレンジしたことは、得難い経験です。ただの自己肯定ですが、その経験を糧に新たな道を歩むのも悪い選択じゃないと思ってます。
ぼくは、自動テストの導入の手前の「自分たちの開発のやり方を真摯に考えられるチーム作り」のところまではなんとかできました。後は種をまいたので、チームのみんながそれぞれ学び、芽吹いてくれることを祈りつつ次の一歩を歩みます。
投稿2015/09/08 03:14
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/09/15 05:58
2015/09/16 01:23
退会済みユーザー
2015/09/16 02:35 編集
2015/09/17 05:35 編集
退会済みユーザー
2015/09/17 05:44
0
自動テスト(各種ユニットテストやらSelenium、Mercuryの導入など)というのは、開発工程だけで捉えていては導入が難しい、と感じます。
少なくとも開発工程の工数を圧迫する作業なので、
・開発者にメリットとデメリットを理解してもらう
・コストを管理している人や部門にメリットとデメリットを理解してもらう
という2側面があります。導入にあたって、前者に注目してしまいがちですが、後者もかなり重要です。
おおむね、プロジェクトは
・Cost
・Quality
・Delivery
という要素で成立しており、自動テストの導入は、
・Qの担保のために投入するCの削減
・それにより同等のCを投入する場合におけるDの短縮化
であることを具体的な推定値で関係者(特にコスト管理者・部門)示すのがキモです。
また、自動テストのもうひとつの特性として、「仕様がテストケースとして凍結される」という
ことが挙げられます。仕様が未凍結、あるいは不明確な状況ではテストを作成できませんから、開発工程に入る前の上流工程で漏れがないか、運用計画が破綻していないか、といったプロジェクトのロジックの点検になります。
さらに、あまり気付いていないメリットとして、プロジェクトの成果であるプログラムとテストフレームワーク(テスト ランタイムとシナリオ)は、償却対象の資産であり、資産の価値を下げないためのテストによる点検・棚卸しが可能になる、ということが挙げられます。安全区間を立証できないプログラム資産は、たとえばローンチ後の改変や機能追加によって非安全区間が顕在化することによるサービス停止・安定性の低下・サービス リソースの枯渇といった、不良債権化することがあります。自動テストによる回帰テストで担保されるケースが多いと予想されます。自動テストの成果物は資産価値に対するリスクヘッジでもある、という側面は、経営層や株主に対して説明しやすいのではないでしょうか。
まとめますと、自動テストの導入にあたって、開発者だけを対象に説得する(あるいは布教する)というのは、あまり有効ではなく、より幅広いステークホルダーが理解できるように努める必要がある、ということです。そして、自動テストが万能なわけではない、ということも伝えておく必要がありますね。人月の神話ではありませんが、銀の弾丸などないのですから。
投稿2015/09/15 06:23
総合スコア51
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/15 12:01
2015/09/15 12:53
0
導入するためのハードルが複数あって
- 発注元が自動テストを知らない
- 開発メンバが自動テストを知らない
- 開発期間が短い
- バグ修正に時間を割いたため自動化する時間がない
- リリース後の機能追加も同じ開発メンバでやるとは限らない
私の経験した範囲では、一旦リリースした後に自動テストを追加する事例が多いです。
ただ、最初から自動テストを作るプロジェクトのほうが、後々で炎上することは少ないように思います。
ちなみに、ユニークな事例として、開発時にドキュメントを廃止してTDDのテストコードが仕様書だと言い切ったものがあります。
こちらは仕様がユースケースとして明確化できたので後々の機能追加が比較的容易でした。
投稿2015/10/25 02:43
総合スコア326
0
工学的でなく、精神論的に・・・
テストするという行為が自分の失敗をさらけ出すというマイナスイメージをもってしまっていると、嫌なものという精神的負担があるのかな?と感じます。
テストコードが、使い方のサンプル集のような位置づけで便利なものというようなプラスイメージへ転換できれば、すすんでテストコードを書いてから、コーディングする癖がつくのかなと思ったりしますが、理想論でショウカ。
プログラムを書いていると、たとえば、道を渡る時、なかなか変わらない信号があって、たまに青ならすぐわたっちゃえるけど、ほぼ陸橋をわたった方が、かかる時間が一定で結局早く着くのに、距離や楽さ、たまにすぐ渡れた時の快感?から信号を待ってしまう、そんな気持ちに似ている気がします。
幾らマネージャ的な視点から、結局こっちの早いよといっても、陸橋を渡る事にメリットが無いと楽な方へ流れます。
陸橋をわたる(テストコードを書く)と、好きな子とすれ違える(他の人が書いた素敵なコードに出会えるかも?ちょっと違うか・・・)的な、メリットを感じれば喜んで陸橋わたります(テストコード書きます) ;-)
あとは、やってみせ、言って聞かせて、させてみせ、 ほめてやれば、人は動くかもしれません。
投稿2015/11/07 06:23
総合スコア1768
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
このスレッドを読んだ、思いつきなので、すでに存在しているのかも…と思いながら書いてます。
「テストコード」をもとに、「詳細設計書」と「テスト仕様書」「テスト報告書」をドバッと出力してくれるようなものあったら…テストコードを書くことが手間にならないかなと。
すみません、思いつきです。
投稿2015/10/30 17:35
退会済みユーザー
総合スコア0
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/04 11:26