ラベル Selenium の投稿を表示しています。 すべての投稿を表示
ラベル Selenium の投稿を表示しています。 すべての投稿を表示

2012年10月21日日曜日

プログラミングのタネ

はじめに

おはようございます。当ブログにアクセス頂き、ありがとうございます。
椅子から立ち上がっただけで、激しいぎっくり腰に見舞われた、たなけんです。
本エントリでは、私なりのプログラミングのネタの探し方について記載します。

どう書く?org

はじめに頭に浮かんだのはどう書く?orgです。(久しぶりにのぞいてみるとサーバエラーになっていましたが)
問題の範囲が小さく、様々な言語で解答されているので、とっかかりやすく、他言語の特徴なども知ることができ、新しく覚えた言語を手に馴染ませる際に良く利用していました。

プログラミング本の写経

プログラミングの本、例えばPaul Grahamのon Lispであれば、Common Lispでどう書くか、ということが示されています。僕の場合は、Common LispではなくClojureでon Lispの写経を行いました。(SICPも早く完了したいのですが。。。)
その言語についての知識が全くない状態であれば、ただ写経するだけでも、習慣的な記法が身に付いて良いかと思いますが、私は少し退屈だと感じたのと、Clojureが好きであるという点から、少し言語を変えて写経を行いました。
Ruby on Railsを初めて学んだ際には”RailsによるアジャイルWebアプリケーション開発”という本を黙々と写経(というかコマンドとかもそのまま打ってました)しました。そのころは、Javaで書かれた自社製の独自フレームワークを使って開発することしかしておらず、Railsでは本当に少しのコードで、こんなことができるんだと衝撃を受けました。
写経をしながらだと、開発環境が整えられているためか、フレームワークのソースなどもその場で気になった瞬間に読むことができ、そういった点からも、手を動かさずに読むよりも理解が深まる気がします。
そういった訳で、プログラミング本はプログラミングのネタ供給元としてなかなか優れていると思います。

競技プログラミング

プログラミングコンテストチャレンジブックなど競技プログラミングのお題が紹介されている本やWebサイトも良質なネタの供給元だと考えられます。
しかし、僕自身がそれ程高度なアルゴリズムや実行時のパフォーマンスに関心がないため、競技プログラミングのお題でプログラムを書くことはあまりありません。(Excelの自動操作なんとかして的な、泥臭いけど知識が無いとてこずる系が興味の中心です)

ランサーズ

ランサーズというフリーランスへ仕事を依頼することができるサイトがあるのですが、ここでシステム開発系の依頼もいくつかあるようです。
内容としては、Webサイト構築、データの変換やデータベース構築などです。
その中で下記の2つの依頼が僕の目を引きつけました。

  • Webから商品情報をスクレイピングしてデータベースに登録する
  • 独自性ルールの麻雀ゲームを実装する

これを見た時、『これは職業プログラマ向け、どう書く?orgだ』と感じました。
それほど難しくなく、かつ現実的なスキルセットが必要なプログラムのネタが、ランサーズには転がっています。さらにそのプログラムの市場価値(依頼金額)も見られるので、『自分だったらx時間でできそう』とか、『この分野の依頼が多いから、やったことないけど手を出してみるか』といった自分のスキルの需要と供給についても考えられるので、『プログラム書きたいけど手頃なネタがないなぁ』という方には、ランサーズに出されているお題に取り組んでみることを、是非おすすめします。(個人的には、こういったスキルマッチングの市場がより一般的になるのかどうかなど、プログラムのネタ探し以外の点でもランサーズおよび類似サービスに注目しています)

必要に迫られ系

最後になりますが、やはり最も楽しいのは、自分のプログラムで現実の問題を解決することでしょう。ざっと思い出しただけで、今年は下記のプログラムを留学生活の合間に書いていました。

  • 計算問題自動生成(姪っ子向け、問題数、難易度を選んで計算問題生成)
  • 数独を途中までソルバ(単純に数を当てはめるだけの部分はプログラムに解かせ、推理が必要な部分は自分が楽しみながら解くためのツール)
  • 超簡易ERP(発注、在庫、営業、受注、販売、顧客、採用、給与、財務を管理するRailsアプリ、友人が文房具販売のスモールビジネスを始めるため、夏休み中に作成)
  • レポーティング (ビジネスゲームで得られる膨大なデータをDBに落とし込み、グラフを作成、マーケットシェアなど加工が必要な情報の計算)
  • ビジネスゲームロジック類推(蓄積したデータを変数に、統計モデルを検証し、どのパラメータが何に、どれくらい影響を与えるかを類推。)
  • 簡易OCR(画像データを変換、分割し、必要な箇所の文字を読みDBへ補完)
  • 英単語検索、記録(はじめは自分向けのコンソールツール、同じ単語を何回調べるかとか、類義語が簡単に取得出来るようにするなどをWordNetを使って実装。その後Webアプリとしてリニューアル)
  • オークションの売買履歴自動記録(アマゾンマーケットプレイスの上位1200冊の出品情報を継続的に取得(スクレイピング)記録し、売れるまでの期間、価格とランキングの変遷、売れる本のジャンルなどを求める)
  • 2chまとめの自動取得(スクレイピング)
  • Wordpress.comのブログに自動投稿(Seleniumでブラウザを自動操作)
  • POIを使ってExcelファイル作成(アドホックに良くある)


必要に迫られ系の変種としては、ライブラリの検証が挙げられます。このブログで紹介したDatomicQuartziteWeb-driverなど、新しいライブラリを使う際には、いきなり既存のプロジェクトに組み込むのではなく、検証用プロジェクトを作成し、機能を一通り試しています。厳密には『何を書くか?』というプログラムのネタを供給してはいませんが、『何か書く、できることの幅を広げる』という観点からは、ライブラリの検証もひとつのプログラムのネタと言っても良いかと思います。
ローカルに保存されているプロジェクトの残骸を数えてみると、上記プログラム以外にも30ほどプロジェクトがあり、2週間に1つ以上のベースでは新規ライブラリを試していた様です。(ふと思い出しましたが、今年の頭はcoffeescriptやクライアントサイドMVCにこってりはまっており、spine.jsなどソースをガリガリ読んでいました。こちらも機会を見つけて紹介したいと思います)

まとめ

今年書いたプログラムの総括のようになってしまいましたが、プログラムを書きたいけど何を書けば良いか分からない、という方のヒントになればと思い、本記事をしたためました。
ランサーズを見て、どう書く?orgを思い出したのが事の発端ですが、ブログを書いているうちに、必要に迫られて書いたプログラムの思い出が頭に浮かび、長くなってしまいました。
Clojureを使い続けて3年目です。はじめはファイルの入出力でさえもわざわざ調べて書いていたのですが、今ではDBやWebのプログラミングも手短にできるなど、手に馴染んできました。現実的な問題を解き続ける事で、できることの幅が広がり、達成するまでの労力と時間が短縮されました。
この冬に、学生からソフトウェアエンジニアへと職業が戻りますが、業務内/外にこだわらず、Clojureを使って問題を解決していきたいと思います。
また、ゲームを使った学習についても関心があるので、Javascriptのゲームライブラリであるenchant.jsもClojurescriptのラッパを書くなどして使ってみたいと思っています。

今日の作業は以上、最後までお読み頂き、ありがとうございました。
たなけん(作業時間30分)

2012年8月19日日曜日

Webクライアントのテスト

はじめに

おはようございます。当ブログにアクセス頂き、ありがとうございます。
先日、魔女の宅急便を見ました。映画の最後で語られる「おちこんだりもしたけれど、私はげんきです」のメッセージに、とても励まされた、たなけんです。(ダイエットに挫折しそうになっていたため。。。)
本エントリでは、Webクライアントのテストについて記載します。

Webクライアントのテストの位置づけ

Webクライアントのテストの為に、今回テスト手法やテスト用ライブラリなどを調査しました。その結果、いくつかの興味深いフレームワークやライブラリ、ツールを見つけることができました。
しかし、今回のWebクライアントは

  • ソースコードが実質20行程度と非常に短い
  • 条件分岐がなく一本道のロジックである

ことから、それらのライブラリを利用してテストする程ではないと考えました。
本来であれば、クライアントのメソッド単位で、まずは単体テストを実施し、その後ユーザの操作フローに基づいた結合テストを実施します。また、正常系だけではなく、異常系も漏らす事無くテストするのが本来のテストの姿であると考えています。
しかしながら今回は、Webクライアントの機能が十分すぎる程シンプルであるため、テストの目的を、デグレーションの検出に限定して考えたいと思います。

テストプログラム実装方針

正常系の動作を自動実行し、以上が発生しない事を確認する。
ライブラリとしてSeleniumをラップしたclj-webdriverを利用する。

依存ライブラリのダウンロードの問題

project.cljにclj-webdriverを利用するよう記載し、lein depsを実行したところ、bcprov-jdk15on-147.jarおよびbcpkix-jdk15on-147.jarのダウンロード時に、チェックサム例外が発生し、Leiningen経由では上記2ライブラリがインストールできませんでした。
そこで新規Mavenプロジェクトを作成し、Seleniumの依存ライブラリをインストールしたところ、問題なく上記2ライブラリをインストールすることができました。
私の環境ではLeiningenとMavenでライブラリを共有しているため、この方法で解決をすることができました。
また、Maven利用の前にlein-localrepoによるfloating jarのローカルインストール(Mavenの3rd party jarのインストールのようなもの)を試してみましたが、こちらは上手くいきませんでした。

テストコード



  • doマクロ: 手続き型のプログラミング言語のように、以下のS式を順に処理する
  • clj-webdriver.taxi/set-driver!関数: ブラウザを起動し、引数のurlを開く
  • clj-webdriver.taxi/implicit-wait関数: 指定ミリ秒処理を停止する
  • clj-webdriver.taxi/input-text関数: テキストボックスに引数の文字列を入力する
  • clj-webdriver.taxi/click関数: 引数の要素をクリックする
  • clj-webdriver.taxi/find-element関数: 引数で指定された要素を取得する。要素はxpathなどで指定が可能


clj-webdriverの感想

依存ライブラリのダウンロードで問題が発生するなど、アルファバージョンにつきものの不安定さはありました。
その反面、一度インストールしてしまえば、非常に短いコードでSeleniumを用いたテストを記述することができました。
業務ソフトウェアをClojureで書くよう周囲を説得するのは難しいと思います。しかし、clj-webdriverのように、テストツールとしてClojureを導入するのは、非常に現実的な選択肢ではないかと、clj-webdriverを使ってみて強く感じました。
(通常の単体テストも、JUnitの代わりにテストだけClojureで書くことも出来そうですね)

今後利用してみたい、Javascriptテストの技術要素

今回のテスト(そもそもロジックがない)で利用するにはオーバースペックでしたが、Clojurescript (Javascript)のテストに関連する様々なフレームワークやライブラリ、ツールについても多少調査したため、この場を借りて紹介します。

Jasmine

Javascriptテスティングフレームワークの大本命。
Google Closure Library (Closurescriptを影で支えているJavascriptライブラリ)はJsUnitを公式テストフレームワークとして採用しています。しかし今やJsUnitはメンテナンスされておらず、JsUnitのサイトでもJasmineへの以降を推薦していました。
Clojurescriptをテストする方法が、Odyssomayさんのブログに分かりやすく解説されています。(なぜClojurescriptをビルドするためのスクリプトがPythonで書かれているかは追求しません。。。)

Sinon.js

Javascriptの柔軟性を存分に活かした黒魔術のようなライブラリ。単体テストの際、関連オブジェクトを差し替えてテストしたいといった要望は多々あるかと思います。(テストするクラス以外は、単純にある値を返して欲しいなど)
Sinon.jsはオブジェクトのスタブ化、モック化またフェイクサーバやフェイクタイムなどを提供し、オブジェクトを差し替えたいといった要望に応えてくれます。
モックあるいはスタブ化関数で処理することで、テスト対象以外のオブジェクトは、メソッドインタフェースは普遍のまま、振る舞いをテストに都合の良いように変えることができます。
同じ様なコンセプトのライブラリ、是非ともClojureにも欲しいなあと感じました。(JavaでSpring frameworkなど使えば、同様の機能は実現可能ですが、Clojureの持つ柔軟な言語特性を活かしたライブラリがあればもっと手軽に実現できそうなので)

PhantomJS

Javascriptのテストライブラリはブラウザから実行することが多いのですが、ブラウザの起動や動作までサポートするライブラリはあまりありません。
PhantomJSはコマンドラインから起動でき、読み込んだJavascriptを実行することができるブラウザです。(内部で、WebKitエンジンを利用しています)
PhantomJSを利用することで、コマンドラインからJavascriptをテストすることができ、単体テストの自動実行が容易になるかと感じました。

今回の作業は以上。最後までお読み頂き、ありがとうございました。
たなけん(作業時間30分)