Ruby版 CIツール導入ガイド2
第2回では CI で実行するジョブにはどういう物があるのかについての概要を、第3回では、ジョブとして利用可能なツールのインストール方法をいくつか紹介した。今回は前回紹介しきれなかったその他のツールについて紹介したいと思う。
個々のツールのインストール方法等までは踏み込まないが、興味をもったツールを見つけたら、公式ページや紹介記事等を参照して欲しい。
RSpec
公式サイト::
https://github.com/rspec/rspec
RSpec は ruby でポピュラーに利用されているテストツールだ。前回、test/unit の利用方法について触れたが、RSpec はより充実したテストを記述できる。テスト駆動開発を行いたいなら RSpec の方が色々な面で有利だと言えるだろう。例えばまだ開発されていないクラスのテストを先に記述し、クラスの開発が終わるまでテストの実行をペンディングする事等ができる。また、英語に近い形でテストスクリプトを記述できるのも特徴的だ。これらの特徴により、RSpec のテストスクリプトは、対象とするクラスの設計書に近い存在になり得ると言えるだろう。
Reek
公式サイト::
https://github.com/troessner/reek
「コードスメルチェッカー」という触れ込みの Reek は、嫌な雰囲気のするプログラムコードを指摘してくれる。「嫌な雰囲気」とは例えばネストが深すぎるメソッドや、メソッドが多すぎるクラス等、さまざまだ。前回紹介した RuboCop と被る点も多いが、独自の視点による有用な指摘も多数ある。警告には URL が付記されており、警告内容の詳細が記載されいるWEBページへ誘導してくれるのも親切だ。是非利用していきたいツールのひとつである。
RDoc
公式サイト::
https://docs.ruby-lang.org/ja/latest/library/rdoc.html
Ruby 用のドキュメント自動生成ツールである。test/unit と同じく標準ツールなので Ruby をインストールすれば自動的にインストールされる。プログラムコード内のクラスやメソッドに付与されたコメントをパースし、リファレンスマニュアルを自動的に生成するツールだ。さまざまなマークアップも利用可能なので、きちんとコメントをメンテナンスすれば十分納品物として通用するドキュメントを生成できる。前回紹介した RuboCop ではコメント漏れも警告してくれるので、併用すると便利だ。
Selenium
公式サイト::
https://www.seleniumhq.org/
UIテストの自動化ツールである。WEBアプリケーションの結合テストを自動化できるのが特徴だ。これらのテストではユニットテストでは見つけられないさまざまなバグを発見できるだろう。
Selenium は Version 2以降、web-driver というモジュールの概念を導入しており、スマホを含めたさまざまなブラウザでのテストが可能になっている。このためIE特有のバグ、iPhone版 Safari 特有のバグ等を検出できるのが大きなメリットだ。ただし、それらのテストを行うためには実機やエミュレーターが必要となる。
ユニットテストと同じくテストプログラムを記述する必要があり、ここに工数を割けるかどうかが導入時の最大の問題だと言える。ただし、ユニットテストを書くためには各クラスレベルでプログラムの動作を把握する必要があるが、UIテストは外部仕様さえ分かっていればテストを記述できる点が大きな違いだ。また PHP, Python, Ruby, .NET, Perl, Java等、さまざまな言語が利用でき、アプリケーションの本体がどのような言語で記述されているかに依存しない。これらの特徴から、業務で行うなら外注しやすい部分とも言えるだろう。
導入メリットは大きく、それ以外の方法ではおよそ発見できないようなバグも発見できる。筆者の周辺において、例えば以下のようなバグを Selenium の導入によって解決できた。
- 数年に渡る複数の開発会社の改修で肥大化した業務アプリケーションがあった。PHPで記述されているが開発会社間で共有可能な資料はER図程度であり、プログラムの詳細設計は各社に任されていた。Selenium による自動テストを実行した所、A社開発部分のあるページαを表示後に、B社開発部分のあるページβを表示すると不可解な現象が起こる事を確認できた。ページαとページβには何の接点も無いように思えた。詳細を調査した所、A社、B社が独自に定義したセッション変数がたまたま同じ名前になってしまっていたのが原因だった。この問題はページβで発生する原因不明の問題として報告されていたが、このテストを行うまでは再現方法が分からず、解決に至ってなかった。
- 他社から供給されている地図APIを利用し、Javacriptで描画された地図上のさまざまなポイントをクリックすると情報を表示するアプリケーションがあった。情報供給ポイントは数千ヵ所に及ぶが、Selenium で全ポイントをクリックした所、数ヵ所で期待しない動作が確認できた。詳細を調査した所、いくつかのポイントでのデータ入力ミスが原因だった。
- A社のAPIをB社のライブラリを経由して利用するWEBアプリケーションをC社が開発していた。100分の1程度の確率でまれに期待しない動作が起こるのだが、再現条件が分からず解決策が見つからなかった。そこで Selenium で数千回の試行を行い、A社のAPIがエラーを返す時に、B社のライブラリが適切な処理を行っていない事を確認できた。
以上のように手作業ではなかなか確認が難しい問題を、膨大な反復作業によって追及できる。ブラウザ上で次々と機械的に画面内をクリックし、エビデンス(画面スクリーンショット)を自動的に蓄積していく様は見た目にも派手であり、顧客に与えるインパクトやプレゼン効果も高い。
まとめ
今回はなるべく多くのツールを紹介する事を目的とし、CI で利用できるさまざまなツールを紹介した。次回は GitLab を実際に構築し、自動的に各ツールが実行される環境を作っていきたいと思う。
次回
社内サーバにリモートリポジトリを作るのも一つですが、「開発にまつわる面倒事」をこの際全部、tracpath(トラックパス)に任せてみませんか?
バージョン管理サービス・プロジェクト管理サービスの「tracpath(トラックパス)」では、
ユーザー5名、リポジトリ数3つまで、無料で利用可能です。
さっそく実務でも使って見ましょう。
自らも開発を行う会社が作ったからこそ、開発チームの「作る情熱」を支える、やるべきことに集中出来るサービスになっています。
エンタープライズ利用が前提のASPサービスなので、セキュリティも強固です。