テストコードのあり方

2
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

【「DTで連想するものは?」であなたが何クラスタか判定する】 DT = デシジョンテーブル -> 品質系 DT = 田園都市線 -> 渋谷使う系 DT = Defencive Tackle -> アメフト系 DT = Dream Theater -> メタル系

2013-04-11 16:24:55
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

@t_wada お手透きな時に返事をもらえると幸いです。結合テスト(WebであればHTTPを介して、ライブラリであれば公開されているAPIでのユースケース)のテストで、1テストクラスにどれくらいのテストメソッド(検査したい項目。assertの数ではない)を書きますか?

2013-04-11 16:44:46
Takuto Wada @t_wada

@kyon_mm クラスの中にいくつ書くかは設計やフレームワークによって変わるので状況によります。結合テストの場合には細かすぎるといろいろ大変なので、検査したい項目をユーザの操作でまとめられる単位のテストシナリオにして、主に機能に対してクラス、シナリオに対してメソッドで書いてます

2013-04-11 17:11:35
Takuto Wada @t_wada

@kyon_mm DT = 童貞 -> 伊集院クラスタ

2013-04-11 17:12:27
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

@t_wada なるほど。その機能と言っているものの出力(つまり、各シナリオでの最終的な結果)はほとんど同じということでいいですか?もちろん、途中でチェックする項目はあると思いますが。

2013-04-11 17:16:16
Takuto Wada @t_wada

@kyon_mm きょんくんの最初の質問にあった結合テストってどんなものでしょう? 私は Web アプリに対してたとえば Selenium や Casper.js などを使って画面遷移を伴うテストかなと思って答えました。そういう文脈では、最終的な結果はシナリオによってバラバラです

2013-04-11 17:20:20
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

@t_wada 直面しているのはライブラリなのですが、Seleniumでも僕は同じように捉えると考えています。先のは「会員登録機能というテストクラスをつくって、A->B->C->登録完了と遷移するテストメソッド、A->D->E->登録完了と遷移するテストメソッド」だと思いました。

2013-04-11 17:26:24
Takuto Wada @t_wada

@kyon_mm きょんくんの理解で合ってます。「会員登録機能というテストクラスをつくって、A->B->C->登録完了と遷移するテストメソッド、A->D->E->登録完了と遷移するテストメソッド」のようにメソッドを作っていきます。そのメソッドの各所に assert を書きます。

2013-04-11 17:30:32
Takuto Wada @t_wada

@kyon_mm これから夕会に参加するので、ちょっと反応悪くなります

2013-04-11 17:31:56
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

@t_wada そのときに「登録成功」「登録失敗」以外のテストメソッドって書きますか?つまり、別の機能を使って、別の結果を得られるようなテストメソッドです。「○○をしているときにも会員登録ができる」などの直交性のテストは「登録成功」のテストメソッド群の一部として数えます。

2013-04-11 17:35:56
Takuto Wada @t_wada

@kyon_mm 私の場合は、書かないと思います。

2013-04-11 17:53:19
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

@t_wada なるほど。仮にですが、そのシナリオ(遷移の方法、各状態でチェックする内容)をパラメタライズできるのであれば、1つのテストクラスには1つのテストメソッドしか書かないことになると思うのですがどうでしょう。僕は正にそういった考えを抱いていて、この質問をはじめました。

2013-04-11 17:58:19
Takuto Wada @t_wada

@kyon_mm それは「登録成功」「登録失敗」までパラメータにするということですか? 全てパラメタライズすればそうかも。各シナリオが基本的に似ていて、ちょっとずつ違うような場合にはパラメタライズが有効に働きそうです。各シナリオが大幅に異なる場合には……どうなるか見てみたいですね

2013-04-11 18:02:05
Takuto Wada @t_wada

@kyon_mm 私の回答きょんくんの役に立っているかな? 私はあまり大したことを言っていない気がします。役立つなら良いのだけど……

2013-04-11 18:03:19
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

@t_wada 結果(出力)毎に別になるイメージです。異常系の扱いは今試行錯誤中で一緒にするか悩んでいますが、今は別にしています。「A機能がもたらす結果毎にクラスをつくる」というイメージです。今は、異常系や網羅基準の変更は基本となるテストクラスの拡張で表現しています。

2013-04-11 18:12:14
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

@t_wada いえ、とても役に立っています。社内ではbleisさんには相談したのですが、誰に聞いていいかわからず><

2013-04-11 18:12:46
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

いまやっているテストクラスの抽象化がすごく楽しいんだけど聞かない話なだけにすごい慎重になっているということ。

2013-04-11 18:14:01
Takuto Wada @t_wada

@kyon_mm その方針はアリだと思います。私はこれまで「一つの事前条件から様々な遷移によって様々な結果になる」のは Testcase class per Fixture にして、「様々な事前条件から同じような結果になる」場合には我流でした。きょんくんのアプローチは面白そう。

2013-04-11 18:37:59
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

@t_wada ありがとうございます。いま考えているのはあらゆるテストは組み合わせを自動化したほうがいいと思ったことです。なのでSpockは僕の中ではもう終わっていて、関心は「因子」「水準」「制約」であり、因子が操作であってもそれは一緒でそれのみをどうやって書くかということでした

2013-04-11 18:43:29
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

@t_wada なので、入力、設定、また操作手順も因子、水準、制約、依存関係で表現していて、自動で組み合わせるようにテストコードをシフトしています。Assertの抽象化とかもあるのですが、それは今回とは別です。面白いのはこうしたテストクラスはテスト観点と1対1になったことでした。

2013-04-11 18:47:47
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

僕の中でテストコードが劇的に進化したのでこの2週間は素晴らしい。

2013-04-11 18:48:46
きょん@アジャイルコーチ、システムアーキテクト @kyon_mm

まだいくつか乗り越える壁はあるけど、いいですね。はい。

2013-04-11 18:49:59