先週の火曜日(2011/5/24)JJUG CCC 2011に参加してきました。
ちょっと、このイベントの周辺の日付で
いろいろとイベント参加 + LTを2本とかいうハードスケジュールだったので、
ブログの更新が遅くなりました。
で、かつ私自身はノートを取らず、Twitterでつぶやいているので、
頭の中を全てが素通りしていますので、
印象だけを記述します。
おそらく誰かがTogetterなどでまとめられていると思いますので、
詳しい実況はそちらを参照してください。
2011年5月30日月曜日
2011年5月27日金曜日
Androidテスト部の宣伝してきました。
ワイヤレスジャパン2011でAndroid LTセッションがあり、参加してきました。
たまたま日本Androidの会にてLT参加者募集ということでしたし、
実は『Androidテスト祭り』実行委員にも関わらず何のタスクもなかった
(できるものが何もなかった)ので、
宣伝がてら参加することにしました。
いや、こういう書き方すると、
イヤイヤ参加しているように読めますが、
実際は目立ちたがり屋なので、
喜んで参加している次第です。
全体的な印象ですが、やはり管理者層の方が多く、
ワイヤレスジャパンでAndroidの情報収集をしている人は
これからAndroid開発でのビジネスを考えている方のようでした。
そんなわけで町田支部の@ngsw_taroさんのAndroidアプリ開発LTは
熱心にメモを取られている方が多かったように思います。
で、私のLTですが、
タイトルは『Androidテスト祭り~僕とテストしてRIA充になろうよ』。
で、これがその資料です。
結果的にはすべりまくりでした。
こんな感じで、あとで司会の関西の方に突っ込まれまくりました…
ただ、まあありがたい事に私のイベントの周知もメモをとってくれている方を
ちらほら見かけましたので、
宣伝としては成功したのかもしれないような気がします。
たまたま日本Androidの会にてLT参加者募集ということでしたし、
実は『Androidテスト祭り』実行委員にも関わらず何のタスクもなかった
(できるものが何もなかった)ので、
宣伝がてら参加することにしました。
いや、こういう書き方すると、
イヤイヤ参加しているように読めますが、
実際は目立ちたがり屋なので、
喜んで参加している次第です。
全体的な印象ですが、やはり管理者層の方が多く、
ワイヤレスジャパンでAndroidの情報収集をしている人は
これからAndroid開発でのビジネスを考えている方のようでした。
そんなわけで町田支部の@ngsw_taroさんのAndroidアプリ開発LTは
熱心にメモを取られている方が多かったように思います。
で、私のLTですが、
タイトルは『Androidテスト祭り~僕とテストしてRIA充になろうよ』。
で、これがその資料です。
結果的にはすべりまくりでした。
- 「ねえ、僕と契約して魔法少女になってよ」というネタはプログラマーには受けるネタですが、管理者層の人にはさっぱり伝わらないこと
- ワイヤレスジャパンでAndroidの情報を収集している人は既にリア充(いや、そういうわけでもないだろうけど)なので「RIA充」と言っても意味が通じないこと
- 「王子で王子が語る」というベタなネタは意外と受けが良いこと
こんな感じで、あとで司会の関西の方に突っ込まれまくりました…
ただ、まあありがたい事に私のイベントの周知もメモをとってくれている方を
ちらほら見かけましたので、
宣伝としては成功したのかもしれないような気がします。
2011年5月22日日曜日
じ、実はJenkins勉強会にも参加してきたんですっ
実は金曜日にも勉強会に参加してきました。
『第三回Jenkins勉強会』です。
土曜日の朝にこの記事を書き始めたのですが、
DevLoveに参加するために家を出る時に、
保存するのを見事に忘れて、
今、書きなおしています。
で、結構目の前で起こることにはすぐ反応できるのですが、
過去のことを思い出すのはなかなか厳しいので、印象だけ記録しておきます。
全体的な印象ですが、
発表者たちもまだまだ勉強中という感じで、
時折川口さんからアドバイスを頂いたり、
これはこうしたほうがいいといった活発なアイデアが出てきたりして、
レベルの高い勉強会であると思いました。
おそらく、毎回川口さんは参加されているようですので、
私もこの勉強会で何か発表できるといいなと思いました。
あと、実はこの日からGroovyに取り組み始めて、
kimukou_26さんから紹介されたGroovistきょんさんや、
Twitterでフォローさせていただいているいろふさんとお会いすることが出来ました。
Twitterは有名人などを気軽にフォローできますが、
やっぱり実際にお会いするとより親近感を持つことができますね。
この記事を読んでいる皆さんは普段から勉強会に参加されている方が
多いと思いますが、
勉強会というのは人間関係を広められるのでとてもいいですね。
『第三回Jenkins勉強会』です。
土曜日の朝にこの記事を書き始めたのですが、
DevLoveに参加するために家を出る時に、
保存するのを見事に忘れて、
今、書きなおしています。
で、結構目の前で起こることにはすぐ反応できるのですが、
過去のことを思い出すのはなかなか厳しいので、印象だけ記録しておきます。
全体的な印象ですが、
発表者たちもまだまだ勉強中という感じで、
時折川口さんからアドバイスを頂いたり、
これはこうしたほうがいいといった活発なアイデアが出てきたりして、
レベルの高い勉強会であると思いました。
おそらく、毎回川口さんは参加されているようですので、
私もこの勉強会で何か発表できるといいなと思いました。
あと、実はこの日からGroovyに取り組み始めて、
kimukou_26さんから紹介されたGroovistきょんさんや、
Twitterでフォローさせていただいているいろふさんとお会いすることが出来ました。
Twitterは有名人などを気軽にフォローできますが、
やっぱり実際にお会いするとより親近感を持つことができますね。
この記事を読んでいる皆さんは普段から勉強会に参加されている方が
多いと思いますが、
勉強会というのは人間関係を広められるのでとてもいいですね。
DevLove HangarFlight に参加してきました。
勉強会ラッシュの一週間の締めとしてDevLove HangarFlightに参加してきました。
私は勉強会デビューが最近なので初参加となりましたが、
DevLoveはかなりの実績のあるイベントで2008年から開催している(もっと前から?!)ようです。
勉強会などは大概ATNDで検索していますが、
このイベントはTwitterで知りました。
発表者や内容を見てみると、
面白いものがいっぱいありそうで、どのセッションに参加しようか
結構悩みました。
とりあえず、以下、私が参加したセッションの内容というか印象を…
と、まあこんな感じでしたが、
会場ではいろいろ初対面のかた、Twitterでフォローしているけど、
はじめましてなんて方もいらっしゃってびっくりでした。
個人的には、kimkou_26さんとアラさんとご挨拶していただいたのが印相的ですね。
とくにアラさんにはびっくりしました。
アラさん宛に返信を書いていると、後ろから突如、
あ~、それ、あたしですと声をかけられてびっくりしました。
きれいな方で二十歳で、おれのヨメさんになってくれないかな(ピピーッ。イエローカード!)、、、なんて妄想を抱きました。
ちなみに、彼女とともにキョンさんとキムコウさんの下でGroovistに成長していきたいと考えております。
そんな訳で、次のDevLoveあったら、また参加したいと思います。
以上、駄文失礼をば失礼いたした
私は勉強会デビューが最近なので初参加となりましたが、
DevLoveはかなりの実績のあるイベントで2008年から開催している(もっと前から?!)ようです。
勉強会などは大概ATNDで検索していますが、
このイベントはTwitterで知りました。
発表者や内容を見てみると、
面白いものがいっぱいありそうで、どのセッションに参加しようか
結構悩みました。
とりあえず、以下、私が参加したセッションの内容というか印象を…
と、まあこんな感じでしたが、
会場ではいろいろ初対面のかた、Twitterでフォローしているけど、
はじめましてなんて方もいらっしゃってびっくりでした。
個人的には、kimkou_26さんとアラさんとご挨拶していただいたのが印相的ですね。
とくにアラさんにはびっくりしました。
アラさん宛に返信を書いていると、後ろから突如、
あ~、それ、あたしですと声をかけられてびっくりしました。
きれいな方で二十歳で、おれのヨメさんになってくれないかな(ピピーッ。イエローカード!)、、、なんて妄想を抱きました。
ちなみに、彼女とともにキョンさんとキムコウさんの下でGroovistに成長していきたいと考えております。
そんな訳で、次のDevLoveあったら、また参加したいと思います。
以上、駄文失礼をば失礼いたした
2011年5月2日月曜日
HttpComponentsのプログラミング…始めたばかり
ほとんど自分メモ。
Apache Http Componentsでシクったので、自分メモ。
Good!な例
BAD!な例
Apache Http Componentsでシクったので、自分メモ。
Good!な例
public String getResource() throws URISyntaxException,
ClientProtocolException, IOException {
URI uri = URIUtils.createURI("http", HOST_NAME,
PORT_NUMBER, PATH_NAME, queryString,
null);
HttpGet hGet = new HttpGet(uri);
HttpClient client = new DefaultHttpClient();
return client.execute(hGet, new BasicResponseHandler());
}
BAD!な例
public String getResource() throws URISyntaxException,
ClientProtocolException, IOException {
URI uri = URIUtils.createURI("http", HOST_NAME,
PORT_NUMBER, PATH_NAME, queryString,
null);
HttpGet hGet = new HttpGet(uri);
HttpClient client = new DefaultHttpClient();
HttpEntity entity = client.execute(hGet);
InputStream input = entity.getContent();
//.....
}
2011年4月17日日曜日
JUnitでWebサービスのモックを作る
ソーシャル系のアプリやほかのWebサービスと連動するアプリの単体テストをする場合、
対向するWebサービスをどうしても利用しないとテストできないようなケースが発生する。
たとえば、Twitterアプリを作成している場合など。
Twitterのようなすでに動いているサービスが対向するwebサービスであれば、
テスト用のアカウントを作成しておいて、
そこにテスト用のTweetを入れておけばよいのではあるが、
しかしエンタープライズな場合だと、
そのような準備をできないこともある。
SIerの場合、後の工程(つまり総合試験)にそれらのテストを持って行って、
人月投入するというパターンがあるが、それはそれで、非常にまずい。
そんなわけで、手軽にWebサーバーを構築したいのだが、
tomcatにサーバーをまた立てて、モックのアプリサービスを書いて、
云々というのも非常に面倒臭い。
そこで登場するのがJettyという軽量Webサーバーです。
これはJUnitでもサーバーを立ち上げられる優れもので、テスト用にも利用出来るなかなか優れたういやつです。
ちなみに、現在はバージョン8まで登場しているそうですが、本稿で使用するのは
さて、早速コードをと言いたいところですが、
今回のサンプルは先に仕様の説明から。
では、早速JUnitのテストコード
一応このテストクラスが実行されている間は、サーバーはローカルホスト3000番で起動します。
実際にどのような処理がなされるかは、このテストの内部クラス
では、
ここでは本当に先程の仕様通りに
となっています。
あまり説明いらないですね。
では、サンプルのテストコードを書いてみましょう。
なお、このサンプルではApache HttpComponentsを利用しています。
適当なクエリーをつけてGetで呼び出しました。
ここの部分は実際のクラスを入れておく部分ですね。
と、まあこんな感じなわけですが、
多少依存性がありますので、その情報も書いておきます。
必要なライブラリーは
です。
皆さん、Web連携アプリのテストもしっかりとやりましょう。
対向するWebサービスをどうしても利用しないとテストできないようなケースが発生する。
たとえば、Twitterアプリを作成している場合など。
Twitterのようなすでに動いているサービスが対向するwebサービスであれば、
テスト用のアカウントを作成しておいて、
そこにテスト用のTweetを入れておけばよいのではあるが、
しかしエンタープライズな場合だと、
そのような準備をできないこともある。
SIerの場合、後の工程(つまり総合試験)にそれらのテストを持って行って、
人月投入するというパターンがあるが、それはそれで、非常にまずい。
そんなわけで、手軽にWebサーバーを構築したいのだが、
tomcatにサーバーをまた立てて、モックのアプリサービスを書いて、
云々というのも非常に面倒臭い。
そこで登場するのがJettyという軽量Webサーバーです。
これはJUnitでもサーバーを立ち上げられる優れもので、テスト用にも利用出来るなかなか優れたういやつです。
ちなみに、現在はバージョン8まで登場しているそうですが、本稿で使用するのは
7.3.1です。さて、早速コードをと言いたいところですが、
今回のサンプルは先に仕様の説明から。
- Webサーバーはlocalhostにポート3000で立てます。
- どのようなリクエストが来ても、レスポンスコード
200 : OKを返します。 - コンテンツタイプは
"application/json"を返します。 - メッセージ部分は
{"test_result" : "ok"}というjsonが設定されます。
では、早速JUnitのテストコード
@BeforeClassと@AfterClassからどうぞ。
public class HttpGetResourceTest {
private static final String TEST_RESULT = "{\"test_result\" : \"ok\"}";
private static final int PORT_NUMBER = 3000;
private static final String LOCAL_HOST = "localhost";
private static Server server;
/**
* サーバーを起動する。
*/
@BeforeClass
public static void setUpBeforeClass() throws Exception {
InetSocketAddress inet = new InetSocketAddress(LOCAL_HOST, PORT_NUMBER);
server = new Server(inet);
// 後述するHandlerの実装。
Handler handler = new RequestHandlerImpl();
server.setHandler(handler);
server.start();
}
/**
* サーバーを終了する。
*/
@AfterClass
public static void tearDownAfterClass() throws Exception {
server.stop();
server.destroy();
}
@BeforeClassではサーバーを起動して、@AfterClassはサーバーをシャットダウンします。一応このテストクラスが実行されている間は、サーバーはローカルホスト3000番で起動します。
実際にどのような処理がなされるかは、このテストの内部クラス
RequestHandlerImplに記述します。では、
RequestHandlerImplをどうぞ。
private static class RequestHandlerImpl extends AbstractHandler {
@Override
public void handle(String target, Request baseRequest,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
response.setStatus(HttpServletResponse.SC_OK);
Writer writer = response.getWriter();
writer.write(TEST_RESULT);
HttpConnection connection =
HttpConnection.getCurrentConnection();
Request req = connection.getRequest();
req.setHandled(true);
}
}
ここでは本当に先程の仕様通りに
- どのようなリクエストが来ても、レスポンスコード
200 : OKを返します。 - コンテンツタイプは
"application/json"を返します。 - メッセージ部分は
{"test_result" : "ok"}というjsonが設定されます。
となっています。
あまり説明いらないですね。
では、サンプルのテストコードを書いてみましょう。
なお、このサンプルではApache HttpComponentsを利用しています。
@Test
public void testIsServerReady() throws Exception {
URI uri = URIUtils.createURI("http",
LOCAL_HOST, PORT_NUMBER,
"/search",
"user=mike_neck&start=10",
null);
HttpGet hGet = new HttpGet(uri);
HttpClient client = new DefaultHttpClient();
HttpResponse res = client.execute(hGet);
HttpEntity entity = res.getEntity();
if(entity != null){
StringBuilder builder = null;
InputStream input = null;
try {
input = entity.getContent();
InputStreamReader reader =
new InputStreamReader(input, "UTF-8");
builder = new StringBuilder();
while(reader.ready())
builder.append((char)reader.read());
}finally{
input.close();
}
assertThat("testIsServerReady",
builder.toString(),
is(TEST_RESULT));
}else{
fail();
}
}
適当なクエリーをつけてGetで呼び出しました。
ここの部分は実際のクラスを入れておく部分ですね。
と、まあこんな感じなわけですが、
多少依存性がありますので、その情報も書いておきます。
必要なライブラリーは
commons-logging.jar
jetty-continuation.jar
jetty-http.jar
jetty-io.jar
jetty-server.jar
jetty-util.jar
servlet-api.jar
です。
皆さん、Web連携アプリのテストもしっかりとやりましょう。
2011年4月5日火曜日
AnnotationとenumとInterface
プログラミングを始めると、いつもメタプログラミングなことを始めてしまって、
成果がよくないことがあるのですが…
これもその一例…
でも、意外とやってみて使えそうな気がしたのでメモです。
Javaの
以下は
この
その結果としてそれぞれのフルーツの名前が表示される。
という仕様になっているわけですが、
これまたテストするのが面倒くさいなと思うわけですよ。
テストケースは二つで、
これって、どうやんの?と思う。
いや、すくなくともオレだけは。
というわけで、
Javaの
を活用してみる。
まずはインターフェース。
で、次にenum。
こうすると、
これで
で、最後にテストをする余地があるとしたら、それは
テストコードはこんな感じです。
ただし、どっちのほうが性能が良いんだ?とかいう野暮な質問はオレにはしないでくれよ。
…答えられない人ノ
成果がよくないことがあるのですが…
これもその一例…
でも、意外とやってみて使えそうな気がしたのでメモです。
Javaの
enumは何気にInterfaceの実装を記述することができて、switch - case文でやっていることをそのままenumにさせることが可能だったりする。以下は
switch文を使った例
public enum Fruit {
APPLE, ORANGE
}
public class DisplayFruit {
public void printFruitName(Fruit fruit){
switch(fruit){
case APPLE:
System.out.println("This is an apple.");
break;
case ORANGE:
System.out.println("This is an orange.");
break;
}
}
}
この
DisplayFruitクラスのユーザーはprintFruitNameメソッドにenum Fruitを引数として渡して、その結果としてそれぞれのフルーツの名前が表示される。
という仕様になっているわけですが、
これまたテストするのが面倒くさいなと思うわけですよ。
テストケースは二つで、
FruitがAPPLEだった場合、This is an apple.と表示されること。FruitがORANGEだった場合、This is an orange.と表示されること。
これって、どうやんの?と思う。
いや、すくなくともオレだけは。
というわけで、
Javaの
enumは何気にInterfaceの実装を記述することができるを活用してみる。
まずはインターフェース。
public interface FruitName {
public String getName();
}
で、次にenum。
public enum Fruit implements FruitName {
APPLE{
@Override
public String getName(){
return "This is an apple";
}
},
ORANGE{
@Override
public String getName(){
return "This is an orange";
}
}
}
こうすると、
DisplayFruitはこんなになる。
public class DisplayFruit {
public void printFruitName(Fruit fruit){
System.out.println(fruit.getName());
}
}
これで
DisplayFruitのテストはほぼ無くなる。で、最後にテストをする余地があるとしたら、それは
DisplayFruitに対してのテストではなく、Fruitに対するテストだけになる。テストコードはこんな感じです。
public class FruitTest{
@Test
public void testGetName(){
assertThat(Fruit.APPLE.getName(), is("This is an apple."));
assertThat(Fruit.APPLE.getName(), is("This is an orange."));
}
}
ただし、どっちのほうが性能が良いんだ?とかいう野暮な質問はオレにはしないでくれよ。
…答えられない人ノ
登録:
投稿 (Atom)