トップページ⇒tech
72コメント41KB

XPのxUnitは使えてる?

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
ねぇ、XPはともかくxUnitはツールとして使えてますか?
ユニットテストできないクラスの方が多くないですか?
数学ライブラリとか単純なストリングクラスレベルのものであれば
可能ですが、そうでないものは難しいのではないかと思うのですが
実際に触れられているか、または、触ったことがある方教えてちょ。
00229101/08/30 10:02ID:AuuQmmaU
ユニットテストはクラス単位でテストするけど、他のクラスを利用してはならない
という決まりはないと思う。has_a のクラスがあればそれを所有している状態が
そのオブジェクトのあるべき姿なのでそのままでテストするべき。
setUp() でオブジェクトを生成する時に必要な周辺のオブジェクトも一緒に作る。

委譲が単純なメッセージの転送で結果が自明だと思うならテストを省いてもいいかも
しれないけど、リファクタリングの結果メソッドの移動で委譲の形になったのなら、
その変更の影響確認の意味があるのでテストを削ることはない。

あと、setXXX(), getXXX() などの自明なメソッドや、GUIなどのテストが難しいも
のを無理してテストに含める必要もない。

「リファクタリング」の本にも、100%のカバレッジにこだわって結局テストしなく
なってしまうよりも、できるところからどんどんテストを書いていった方がいいと
書いてあった。
0023301/08/30 13:13ID:SlMm8NNo
>>16

そういったクラスの単体テストに関しては、XP導入篇にやり方が書いてあるので、
立ち読みでもいいので読んでみるといいと思います。

基本的にはそのクラスが依存している下層クラスのダミーを作ってテストする、
ということになると思います。
0024IDEなんてクソ01/08/30 21:48ID:ZAelFQ6s
理屈なんかどうでも良くて、作るものの数倍の規模のテストを書きまくる。
とにかくコーディングしまくって、家に帰るときに全部xUnitで自動実行。
翌朝、デグレードしていないことを確認して、別の観点でテストを書きまくる。
クソみたいなテストでも、何回も書き直すと自分のスキルになる。
単体とか結合とかは、人件費よりCPU時間の方が貴重な頃のクソ概念。
屁理屈こねてるぐらいならコーディングしろ。
それがイヤならプログラマやめな。
00251701/08/31 00:05ID:sK1P25wQ
>>21
単体テストはホワイトボックステストなので、GooのテストがFooの実装を意識したものに
なっていてもかまわないのではないかと思います。いかが?

>>24
漢らしい!ある意味extremeですな。それでうまく進められるのなら、全くOKだと思います。

オレはそれほど漢気(オトコギ)がないので、テストの効果は低下させずにテストの規模を
少なくできる方法を考えたいと思います。

24氏の方法だと、特定のクラス階層を取り出して再利用するときに、テストコードの
切り分けに手間がかかりませんか?テストを単体,結合に分けておくとそのような時には
便利ではないかと思います。

このあたりの考察,議論が屁理屈ではなくて、仕事の質を高める理屈につながることを
願います。
00261601/08/31 00:31ID:r3.yQrDE
みなさんアドバイスありがとうございました。

1. 基本は、クラス単位でテストをする。
2. has-aクラスを持っているのであればそれらは生成してもよい。
3. 利用関係のクラスはダミークラスを用意する。

という方針で進めればよいという風に理解しましたがあっていますか?

あっていた場合、私自身悩んでいたのは、3.についてです。本当にダミー
クラスを用意することができるのか? 単純なシステムであれば、
可能に思えますが、複雑なものであればダミークラスを用意し、それら
の用意したクラスがうまく連携するかどうかの補償する必要が発生し、
ダミークラスのユニットテストが必要になり、それをするのにさらに
ダミークラスが必要になる...。つまり、ダミークラスが必要がなくなるまで
それを繰り返すか、どこかで妥協する必要があるんじゃないだろうかという
こと。それにより、複雑なシステムではユニットテストは難しくなって
くるのではないかという疑問へとつながります。ここら辺は、みなさん
問題なくできていますか? Webアプリ程度のものであれば可能に思え
ますが、マルチスレッドなシステムとか大規模なシステムは、
GUIに近づくほど難しいと感じます。
0027デフォルトの名無しさん01/08/31 00:31ID:4nm4VJrc
:%s/Goo/Bar/g
0028デフォルトの名無しさん01/08/31 00:59ID:6bUtDlqk
Fooを作る場合
Foo(interface), FooImpl, MockFoo, FooImplTest
をつくるけど 駄目?
ちょっと面倒だけど、ほかのクラスの実装にほとんどたよらずに
テストできるのでいいかんじ。
00291601/08/31 02:42ID:r3.yQrDE
>>23
購入してみようかと思ったのですが、あまり評価がよくないようなのですが、
実際のところみなさんどう思いましたか?

http://www.amazon.co.jp/exec/obidos/ASIN/4894714914/ref=b_br_r_4_3/249-6364008-4713114
0030デフォルトの名無しさん01/08/31 11:33ID:FX.uO0Uc
>>29
評判が悪いのは、『実行計画』の方です。
内容そのものが悪いというわけではなく、訳がヒドイという理由で評判が悪いです。
『導入編』の方はそのようなことはありませんでした(精読したわけではないですけど)
0031301/08/31 11:50ID:l23fvLAE
>>30
いや、一番ひどいのは「入門」です。これは、
http://objectclub.esm.co.jp/eXtremeProgramming/ec-errata.txt
と併用しないと理解できません。

もっとも「実行計画」も基本的に同じ人間が翻訳しているので出来はよくない
ですが。「導入編」はわかりやすいし、おまけもついているのでお勧めです。
00323001/08/31 12:50ID:FX.uO0Uc
>いや、一番ひどいのは「入門」です。これは、

あ、そうでしたね。
あまりに酷かったので、俺の記憶から消去してました(藁
0033801/08/31 12:52ID:pdlIkxbs
>>30,31
あえてsageずに激しく同意。
大学受験レベルの訳が出来てないのには閉口する。
導入編があれば入門も実行計画もいらんのではないかと思うよ。
0034デフォルトの名無しさん01/08/31 14:58ID:SVE3wbvc
Servlet系にXUNITは使えますか?

HttpRequestを使ってるクラスが多くて、
そういうクラスをどうやってXUNITでテストできるのでしょうか?
DB系のクラスも難しい
結局ブラウザで地道にやってます
0035sage01/08/31 16:33ID:BPhzZYhE
HttpUnit
http://wiki.esm.co.jp:8080/xp/29
じゃだめ?

>34
0036デフォルトの名無しさん01/08/31 16:41ID:SYzSjnws
>>34 80版ポートを開いてHTTPを聞いてダミーデータ(ファイルとか)をそのまま返す
簡易サーバ作れば?
んでsetUp() でlocalhostとかで起動しとく
0037デフォルトの名無しさん01/08/31 16:58ID:FX.uO0Uc
>>34
>DB系のクラスも難しい

これはテストしやすいと思うけどなぁ。
テストしづらいとしたら、それは、メソッドが複雑である、ということでは?

どういう所が難しいの?
0038IDEなんてクソ01/09/01 00:59ID:t2cxml/2
>>34
コアサーブレット&JSPかなんかのサンプルに
URL指定してPOSTするAppletのコード
が出てたのでそいつを改造してJUnitしたことはあ
るけど、そういうことではないのかな?
あんまり真剣にやったわけじゃないから、細かいこ
とはわからんが、中途半端なフレームワーク使うよ
り、人のコード改造した方が生産性はあがるぞ。
0039IDEなんてクソ01/09/01 01:03ID:t2cxml/2
>>38
ちなみにサンプルのコードは以下のURLから落とせるよ。
http://books.softbank.co.jp/isbn/1431/
SendPost.javaとかいうファイル名だったとおもう。
0040デフォルトの名無しさん01/09/01 03:56ID:lnjRwD/Q
>>34
Requestの使用するメソッドだけを備えたラッパーを
つくれば幸せになるかも

>>37
DB関連はUnit単位ならどうということはないけど、
実際のDBを使用するテスト(Acceptance?)となると
データを用意する -> テストする -> 後始末
となりやっぱり面倒かと
004110 01/09/01 14:39ID:EO8HRrv6
>>23
なるほど、やはり仮想クラスのダミーを作って
テストするということですね。
とりあえず、導入編を買って読んでみます。
0042デフォルトの名無しさん01/09/01 21:07ID:ln0xQxLk
>>40
>データを用意する -> テストする -> 後始末
>となりやっぱり面倒かと

というか、それってxUnitの全否定に繋がるような気が・・・。
0043「人のバグ見て、わがバグなおせ」01/09/01 22:18ID:FG67tGr.
>>40
君には向いていない職業だね。
早く出世するか、転職するか選んだ方がいいよ。
プログラマが「コーディングがイヤ」とか「コーディングに自信がない」
って言ったらおしまい。
「血を見るのがイヤ」とか「盲腸切るの自信が無い」なんて言う外科医に
命預けられる?
あんたの顧客も同じ気持ちだよ。
0044デフォルトの名無しさん01/09/01 23:47ID:npROBw1M
>>42
やっぱり、そこで苦しくなってくるのがDB絡みだな。
パフォーマンスや時間やライセンスの都合で、
DB空間を必要な数だけ構築できない場合には、
複数の開発者(&デバッグ者)が同一のDB空間に相乗りすることになり、
うまく(素早くってのも含めて。delete * from HOGEHOGEとかをやれるかどうか)
必要なデータを用意&抹消するのが困難になったりする。

言いかえれば、空間を好きなだけ作ることが
パフォーマンスや、ましてライセンスに、縛られるという
DBMSの構造が駄目駄目だ、ということなんだけども。

というわけで、大抵の商用DBMSベンダーは、いってよし。

そうそう。
http://www.zdnet.co.jp/enterprise/0108/30/01083006.html
今時WaterFall開発を薦めるという勇気有るドキュ記事。
言ってること、これ、変だろ。
(乱暴にいえば)渡して「から」デバッグするのがSpiralだろうに、
バグは許されないからWaterFallしろってのは、勘違い。
0045801/09/02 00:04ID:VPRUB6jg
>>43
優良スレに育ちつつあるんだから煽りモード控えめで行きましょう。
0046801/09/02 00:08ID:VPRUB6jg
>>44
DBに対するxUnitの適用方法ですが、導入編に示唆的な一節があります。

“テストをできる限り高速で走らせるためには、安全性を考えあわせた上で、
なるべく実際のデータベースにはアクセスしないことが基本的なルールだ。”
(導入編131ページより)
00474001/09/02 02:56ID:BNPFq0lA
んーなんか誤解を与えたようで。
プログラムは好きですよ、ほんと。

>>46
それは、DB周りのクラスを使うがわの話であり
DB周りのクラスそのもののテストにはDBやらSQLやらが
関係してくると思います、多分。

現実のリソースに触るようなテストはできれば別系統にしておいて
実行速度をあげるという意味だったかと。僕もそうしてます。
00484001/09/02 03:20ID:BNPFq0lA
>>42
xUnitマンセー!否定だなんて!

ただSQLがらみだと何度もテスト実行可能なように
setUpやらtearDownやらに手間がかかって
やだなあ、とか思いません?
僕がSQL嫌いなだけかもしらないけど。

っていうかなんか楽な方法ないですか?
0049デフォルトの名無しさん01/09/02 03:39ID:yCMII86.
>>48
初期化・終了処理周りのルーチンワークが面倒なら
xUnit拡張してSQL Unitかそこまで行かなくても
SQLTestCaseでも作ってやればいいんじゃない?

本質的に複雑で面倒でライブラリ化不可能ならあきらめるしかないかもね...
00504001/09/02 04:08ID:BNPFq0lA
DBSetUPを作ってConnectionの準備、後始末くらい
ならやってますが、個々のテストで必要なデータが
結構ちがうためデータのそれはどうにも…。

外部にバッチをおいてテスト前に必要なSQLを
実行するようにしたこともあったけど、あんまり
気持ちよくない。xUnitだけで完結しないし。
0051デフォルトの名無しさん01/09/02 10:02ID:BlWYAHM.
>>46
生DBにアクセスしないかどうかをユーザーの自由意志で決められる場合は、そうでしょうね。
OODBとかJDO(藁)みたいに、なかば暗黙化されてる場合に、ちょっと困るなぁと。
DBを切り離すわけにもいかないし、パフォーマンスやライセンスで足引っ張られるのは厳然たる事実だし。
某環境でObject1つを生成するのに1秒かかった時は本当に鬱になった。
0052801/09/03 01:49ID:1RRG7AyI
>>47
>それは、DB周りのクラスを使うがわの話であり

「DB周りのクラス」がどこまでを指すかが気になるなぁ。
この辺の認識って十人十色ですよね。

皆さんは大体どのあたりをイメージされてますか?
0053デフォルトの名無しさん01/09/03 14:22ID:fElqx/V6
>>48
>ただSQLがらみだと何度もテスト実行可能なように
>setUpやらtearDownやらに手間がかかって
>やだなあ、とか思いません?

いや、だから、何を「やだなあ」と思っているのか、読み取れないんですが・・・。

>>50
>ならやってますが、個々のテストで必要なデータが
>結構ちがうためデータのそれはどうにも…。

問題はこれだけですか?
結局「面度くさい」ということですか?

だったらしかたないですねぇ。
0054__01/09/03 23:53ID:eYogrFz2
めんどくさい仕事は新人に「教育」名目で押し付ける。
でも、テストデータを作るのも楽しくない?
テストデータを生成するロジックを考えるのも楽しいよ。
制約があるから、知恵を絞る楽しさがあるんだじゃないかな?
制約なくなったら、俺は仕事しない。納期もないだろうしね。
00554001/09/04 02:58ID:u0uEF7wo
>>53
ちょっと長いけどこんな感じ?(with JUnit)

public FooCreatorTest extends TestCase {

public static Test suite() {
return new TestDBSuite(FooCreatorTest.class) {
protected void doSetUpDB(Connection conn)
throws SQLException
{
conn.executeQuery("create table foo ....");
conn.executeQuery("create table baa ...");
conn.executeQuery("insert into foo...");
// だらだらと続く
}

protected void doTearDonw(Connection conn)
throws SQLException
{
conn.executeQuery("drop table foo");
conn.executeQuery("drop table baa");
}
}
//以下テストが続く
}

このやり方だと長ったらしくSQLが続く上に
テストのためのSQL自体が間違いを含んでいたり,
エスケープが面倒だったりと結構いやなものです。
SQLを直に使うためDBに依存も起きます。
テストに要する時間が通常の三倍くらいってとこかな。

怠慢ってのは(それなりに)大切だとおもうけど、だめですかね?

で、なんかいい方法ないっすか?
00564001/09/04 03:06ID:u0uEF7wo
インデント消えてるし…
あとexecuteQuery --> execute ですね…

>>54
それはちょっとむごいかと
つうか僕が新人ですよ!

一番きつい制約が時間なので、できるだけ安いコストで
テストしたいです。
0057通りすがりのプログラマ01/09/04 07:26ID:172vGpu.
>>33
やはり読みづらいですか。
デザインパターンとか、XPはいい方向だと思うのですが、
どうにも良書が少なくて、取り入れづらくて。
最先端で天狗になっちゃって誰も何も言えないのかな。
0058通りすがりのプログラマ01/09/04 08:36ID:172vGpu.
パターンハッチングも逝ってます。
この手の訳書が出ないことを嘆いてますが、間違いなく足ひっぱってるとおもわれ。

分からなかったら俺のセミナーを聞け!なのかな。
導入編訳者が違うので買ってみま。
00595301/09/04 14:27ID:xkDT0p0o
>このやり方だと長ったらしくSQLが続く上に
これは仕方がないですね。

>テストのためのSQL自体が間違いを含んでいたり,
これは間違わないようにするしかないです。

>エスケープが面倒だったりと結構いやなものです。
何をエスケープするんでしょう?

>SQLを直に使うためDBに依存も起きます。
それも仕方がないですね。

>怠慢ってのは(それなりに)大切だとおもうけど、だめですかね?
怠慢おおいに結構。

>で、なんかいい方法ないっすか?
create table - drop tableは本当に必要なんですか?それも毎回?
Singleton patternとRollbackをうまく使えば、テストに要する時間は短縮できます。
テストデータ生成も、Insert文を直接書くのではなく、CSVをInsert文に変換する
クラスなどを作って、間違いをなくすようにする。

こんなとこかな。
0060デフォルトの名無しさん01/09/04 22:39ID:2dtERGnw
ちょっとは頭使おうよ。
新人ならやめちゃえよ。今からならやり直せるよ。
大体、そんなに自動化しちゃったら、お前ができる仕事なくなるよ。
楽する方法を考えるのが、今の仕事なんじゃないの?
XP以前に、仕事に対する姿勢が問題じゃん。
00614001/09/05 02:05ID:nluvb.ck
>>59
何度よんでも一回だけ処理をしてくれるSetUp用の
クラスは、データが重複する場合は作ります。

create - drop は趣味の問題かもしれません。
ごみは残さないって感じで。

データの量が多い場合は外に出しますが
少ない場合はテストに内臓のほうがよいような気がします。

エスケープは正規表現かなにかと勘違いしたかも、すみません…
0062デフォルトの名無しさん01/09/05 13:16ID:42ScEOYY
>>61
じゃぁ、結局何が問題なの?
つまるところ「面倒くさい」ってとこに帰着するのかな?
それって、xUnitを全否定することでは・・・(loop)
0063デフォルトの名無しさんNGNG
要するに、仕事の結果だけ欲しくて、仕事したくないってことじゃん。
こんな奴が「xUnitは役立たない」って知ったかぶって言いふらすんだろうな。
役立たないのは、、、
ま、それ以上は言わないよ。大人だから。
00648NGNG
>>63
大人なら初めから黙ってるよろし。
いたづらに煽るばかりのレスはウザい事この上なし。

というわけで話題提供を試みてみる。

実DBにアクセスしないとできないテストが多岐にわたるようであれば、それこ
そリファクタリングの対象とすべきでは?
「DBにアクセスするな」というのは、テストの手間を惜しむという面もあるが
、DBへの依存度が低い設計を強制するという面も忘れてはならないと思う。
0065デフォルトの名無しさんNGNG
>>64
それからUnitTest自体のリファクタリングも必要だよね。
0066デフォルトの名無しさんNGNG
でもさ>>1の聞きかたって、ある種の煽りでしょ?
タイトルだって、xUnitの効果に疑問があるわけでしょ?
で、よくよく聞いてみると、「めんどくさいことしたくない」でしょ?
何処が優良スレなんだよ。別のスレたてて議論しよ。
00678NGNG
>>66
別スレでも「めんどくさいことしたくない」派が書き込むのは不可避。
なぜなら彼らのほうが多数派だから。
改革派だけでオナニー議論したところでこの業界は変わらない。

66さんの同僚にも「めんどくさいことしたくない」派がたくさん居るはず。
このスレで説得する方法を磨いてみては?

P.S.懐疑派を煽るのはXPの価値を貶めるだけなので止めましょう。
00688NGNG
そろそろ煙たがられてるような気もするがめげずに啓蒙age。

「XPエクストリーム・プログラミング導入編」は良書なので否定派も肯定派も
ご一読を。(税抜2400yenナリ)
0069デフォルトの名無しさんNGNG
図書館を利用せよ
0070デフォルトの名無しさんNGNG
>>64
というかこれって、いわゆるOOPと(R)DBのインピーダンスミスマッチの話だよね。
あっちの世界とこっちの世界を行き来するためのコードがナニかと煩雑になるというあれ。

JDOだっけ?あれにでも期待するといいんじゃないかな。最終的には。

一方、今すぐ最終段階になれるわけでもないんで、DBアクセスをライブラリ化しとく
ってのは必要になるだろうね。毎度毎度JDBCコードを素で書いていたらやってられん。

「ライブラリ化する」というリファクタリング(?)は、必要だと思われ。

>>68
導入編ですか。買ってみます。たしか薄い本ですよね。持ち運べるのが嬉しい。
00718NGNG
>>69
その手もあったね。スマンです。

>>70
前の2冊ほどは薄くないけど、持ち運べない程でもないです。
赤紫色のカバーで目立ちやすいのですぐ見つかると思います。
0072デフォルトの名無しさんNGNG
職場にいるめんどくさいことしたくない派は、揚げ足とってさらし者にする。
どうせリストラするんだから、きっかけをあげればいい。
仕事しない奴10人より、やる気のある新人の方が役立つよ。
何もみんな一緒にXPする必要なし。少数精鋭でいきましょう。
結果を残せば経営陣は何もいえないよ。
■ このスレッドは過去ログ倉庫に格納されています