UIテストの所要時間を10分の1にする試み、Raspberry Piのクラスタで並列実行。ソフトウェア品質シンポジウム2018
開発現場の多くでテストの自動化が進む中で、テスト時間を短縮することはビルドとテストの待ち時間を減らし、開発効率を高める上で重要なポイントになってきています。
そうしたなかで時間がかかっていたUIテストの所要時間を短縮する手段としてRaspberry Piをクラスタ化する手法を紹介するのが、レバテック株式会社 折田武己氏です。
本記事では、9月12日から14日のあいだ東洋大学で開催された「ソフトウェア品質シンポジウム」(日本科学技術連盟主催)での折田氏のセッション「UIテストの所要時間を10分の1に短縮する取り組み~ラズベリーパイのクラスターで並列実行~」の内容をダイジェストで紹介します。
単体テストはさくさく終わるのにUIテストは時間がかかる
レバテック株式会社 折田武己氏。
私は自動テスト、SeleniumやAppiumを使ってWebアプリやスマホアプリの自動テストに長年取り組んでいました。ただ、そのなかで課題もありました。
単体テストはxUnitでさくさく終わるのに、UIテストはかなり時間がかかります。比較的最近の仕事でも、UIテストを全部やると3日か4日かかるものがありました。
四半期ごとなどにアプリケーションをリリースするのであればそれでも間に合いますが、最近では継続的デリバリが普及してきて毎日のようにリリースがあります。なので、現場では必要最小限のUIテストだけをやって、本当に必要になったところで全種類のUIテストをやる、といった取り組みのところもあると思います。
しかしUIテストを省略したためにトラブルになる可能性もあるわけです。
この時間のかかるUIテストをなんとかできないものかと、以前はMac miniを五重塔のように積み重ねて試したこともありましたが、それでも追いつきませんでした。
ならば、Raspberry Piを数十台積み重ねればいいんではないか。そう思って取り組んでみたのが今回の発表です。
ただ、Raspberry PiはLinuxで動くので、あくまでも最終確認はMacやWindowsなどの実機でしっかりやる必要があります。しかし3日も4日もかかる膨大なテストケースが3時間でできるようになれば、あとは見栄えなどのチェックを人間がすればいいことになり、かなり効率化が進むと思います。
UIテストの現場で直面するいくつかの課題
UIテストは、テストフェーズでいうと統合テストやシステムテストの部分で行われます。テスト環境は、WebアプリならWebブラウザに、ネイティブアプリならスマートフォンになります。
今回はおもにWebアプリケーションにフォーカスします。
UIテストの現場で直面する課題はいくつかあります。
1つ目は、テスト用の端末が足りないという課題です。
UIテストの実行は開発者のPCを共有してください、とPMから指示されることもあります。
これはかなり困ったことで、例えばSeleniumが動くと勝手にマウスカーソルが奪われたりします。ヘッドレスモードで動かしたとしても画面解像度の問題などがありますので、開発用のPCとUIテスト用のPCを兼用するのはよくありません。
なにより困るのは、昼間はがりがりと開発作業をして、最後にテストを行う。テストが終わってCIサーバがオールグリーンになったら帰れるけど、UIテストには時間がかかるのでPCを立ち上げっぱなしにして帰るわけにも行かないと。
しかもUIテストを行うタイミングは、単体テストも終わって結合テストに入り、エンドツーエンドで検証をするタイミングなので、プロジェクトも終盤ですでに一部の開発者が違うプロジェクトに移ったりして、いまのプロジェクトの人もPCも少なくなっています。そのためUIテストに使えるPCも少なくなっているのです。
じゃあテスト用PCをあらかじめ確保しておけばいいかというと、UIテストをやるのは開発の終盤になるので、それまで使わないPCをずっとオフィスに用意しておくのは場所を取ってしまいます。
最近ではクラウドサービスが普及しているので、テスト用端末もクラウドにしてしまえばいいじゃないか、という選択肢もあります。
これは課題の多くを解決してくれる選択肢でもあります。ただ、課題がないわけではありません。
クラウドは従量課金なので利用時間に応じて金額が上がっていきます。実際にテスト用のPCを購入するよりもスペース的にもコスト的にも安くていいのかもしれませんが、テストをしているうちに課金のメーターが上がっていく感覚は開発者として気になりますし、予想外に自動テキストの処理が長引いたりするとコストが予算をオーバーする可能性もあるので、プロトタイプで実行時間を検証するなど事前に計画をしなければなりません。
安くて小型であるRaspberry Pi
そこで、もうひとつの選択肢としてみなさんに提案したいのがRaspberry Piです。
Raspberry Piは、なにより安い。
しかも名刺サイズほどの小型なので、使わないときには引き出しの中にしまっておけるし、デバイスドライバなどの開発は不要で、自分でハードウェアをいじったり、Bluetoothで通信をしてリモコンのふりをしてゲームを操作する、といった制御もできます。
Raspberry Piは世界中のユーザーがノウハウを共有していて、Linuxが動くというメリットも大きい。
初期のRaspberry Piは性能もいまひとつでしたが、最近のモデルは性能も向上していて、最新モデルは5年ほど前の安価なデスクトップPCといった感覚で使えます。
UIテストの実行ならRaspberry Piの性能で十分
まずRaspberry Piについて説明します。
LinuxとしてUbuntuのディストリビューションやDebian系のRaspbianなども動きますので、Linux開発者は普段の環境がそのまま使えます。gccのコンパイラなどもそのまま動きます。
ただし基盤はむき出しの状態で販売されているので、ケースを購入したり自作します。
USBポートは4つ、イーサネットのポートも付いていますし、最新モデルはWifiもあります。カメラポートもあり、監視カメラといったデバイスも作れます。
メモリは1GB、ただしストレージはSDカードを使います。
GPIOという汎用入出力ポートがあって、今回作るクラスタもこれを使っています。
Raspberyy Piの性能はどうなんだということで、実際に下記はRaspberry Pi 3BでUIテストのスクリプトを実行し、その実行時間を計測しました。
重要なポイントはデスクトップPCとノートPCとRaspberry Piの時間にほとんど差がないというところです。というのも、Webアプリケーションをテストする場合、リクエストをサーバに投げて、その結果が返ってくる時間を待っているのがほとんどなのです。なので、デバイスの性能によって差が出ないのも当然と言えば当然なのです。
ですので、Raspberry PiでSeleniumやAppiumのテストスクリプトを実行するのはRaspberry Piで十分なのです。
すると、Raspberry Piの台数を増やして並列実行すれば、トータルのテスト時間を短縮することが可能になります。
つまり数こそ力と。
Raspberry Piのクラスタを作る
そこで以下が今回作ったRaspberry Piクラスタの構成図です。
すでにRaspberry Piのクラスタは個人からアメリカの原子力機関まで大小様々なものがあります。今回、私が実際に作って実感したのは、Raspberry PiをまとめてPCの筐体に入れてしまうのが業務では扱いやすいということです。
そのときにはRaspberry Piの電源をどうするかが問題になります。今回はGPIOを使いました。
PCの電源からは12ボルト、5ボルト、3.3ボルトが出ていますが、そのほとんどが12ボルトです。これをRaspberry Piで使えるようにするには12ボルトを5ボルトを降圧して使う必要があると言うことです。
そこで便利なのが秋葉原の秋月電子です。ここで売っていたDC/DCコンバータで12ボルトを5ボルトに高圧しました。
それからRaspberry Pi 3以降は無線LANをサポートしていますが、クラスタを構築するほどの台数のRaspberry Piでは無線LANのアクセスポイントがパンクします。そこでRaspberry Piの通信は有線LANにすべきです。
電源管理にはArduinoを使います。なぜならRaspberry Piはオンオフをする方法が電源を抜き差しする方法しかない、だからRaspberry PiをPCの筐体内に入れてしまうと手でケーブルを抜き差しするのが難しくなるので、何らかの方法で電源制御が必要になるためです。
ArduinoでRaspberry Piの電源を制御します。
ミドルウェアは、DockerとKubernetesを使います。これでいちいちSDカードなどをコピーしてRaspberry Piに挿すといった作業をせず、コンテナをRaspberry Piのクラスタにデプロイして動かせるようになります。
Ghostbotは僕が作っているツールなのでみなさんご存じないと思いますが(笑)、自動テスト開発支援ツールです。
Raspberry PiクラスタによるUIテストとさらなる可能性
実際の利用例ですが、WebアプリのUIテストではFirefoxかChromiumを使うのが順当です。
スマホアプリの場合、いま実験的にやっているのは、USBでビデオキャプチャデバイスをつなげてスマホの画面をキャプチャし、その画像を用いてテスト結果を判定することです。
これをさらに安価なWebカメラでやってしまおうと考えています。そうするとRaspberry Piには4つのUSBポートがあるので4台のWebカメラを使って同時に4台のスマホなどの画面の検証ができるようになるかもしれません。
さらにUIテストを効率よく並列実行するためには、例えばSPA(Single Page Application)のようにUIテストをやりにくいものもあって、これに対してSeleniumに搭載されている、JavaScriptをWebページに埋め込む機能を使ってテスト効率がよくなるような工夫も考えています。
Raspberry Piのクラスタを持つというのはデータセンターを自前で持っているようなもので、いろいろ面白いことができるのではないか、という可能性に気がつきました。
そのアイデアはまた別の機会にご紹介したいと思います。
(Raspberry Piのクラスタ作成についての詳細は、折田氏のWebサイト「ラズパイ・クラスター製作ガイド」で公開される予定。今回の資料も公開されています)
あわせて読みたい
MySQL互換の分散データベース「Clustrix」、MariaDBが買収
≪前の記事
Microsoft Azure上での実行目的ならJavaの長期サポート(LTS)を無料提供、MacやWindowsでの開発用途もOK。マイクロソフトとAzul Systemsが提携で