見出し画像

リアルタイムデータを扱うコンテンツの検証を楽にする方法

こんにちは、冬毛が好きです。
ナビタイムジャパンで公共交通事業者向けのサービスのQAを担当していす。
私からはリアルタイムデータを使ったコンテンツの検証方法についてご紹介します。

はじめに

当社ではバス停に設置するデジタルサイネージ向けのコンテンツを提供しています。このコンテンツでは、外部APIから配信されるバスロケーション情報を用いて、”バスが○個前のバス停にいます”、”○分遅れがあります”、”○時○分に到着予定です”といったリアルタイム情報を表示します。

バス停デジタルサイネージのイメージです

バス停デジタルサイネージのコンテンツとは

見ての通り画面構成はシンプルです。検証も一見簡単そうです。しかしこのコンテンツ、バスの走行に伴いリアルタイムに変動します。始発バスの時間になるとバスロケーション情報が配信され、コンテンツの表示も始まります。バスが当該バス停に近づくにつれバスロケーション情報が更新され、当該バス停を通り過ぎたバスは消してまた次のバス。渋滞などで遅延が発生して遅延時間情報が配信されるとコンテンツ上にも表示。最終バスが当該バス停を通り過ぎたら運行終了の表示へ。といった具合に刻々と変動するコンテンツを変動するタイミングで見る必要があります。

困ったこと

もしや、ほぼ一日中画面に張り付いて見ていないといけないのでは?
検証計画を立てるにあたり、私はこの疑問を抱きました。
1個1個の画面を見る(表示崩れがないか、値が適切に出ているか)こと自体は軽いものの、待機時間が長い。例えば、バスの遅延はいつ発生するか予測できません。そのため遅延時間を表示する部分の検証を行うには、待機時間を余裕をもって確保する必要があります。最終バスや始発バスの時間帯は通常の業務時間外です。

他にも、
・折り返し運転をするバスの折り返す前後
・循環系統の2回目停車
など詳しい説明は割愛しますが、QAとして気にしている走行パターンもあり、目当てのバスが走る時間帯で待機が必要です。
フロント部分の確認だけならダミーデータを使う手も考えられますが、リリース前のシステムテストでは実際のバスロケーション情報を使って確認しないといけません。

解決方法

そこで私が取った方法は、Selenium+Jenkinsでの自動化です。
やることは単純明快。Seleniumで対象の画面を開いてキャプチャを取る、というテストコードを書き、それをJenkinsで特定の時間帯・特定の間隔で定期実行する、というものです。あとは保存されたキャプチャを業務時間内の都合の良いときに確認するだけです。もし意図しない表示になっていたとしても、キャプチャの取得時刻からデータを調査すべき時刻が分かります。

テストコードはこんな感じ

public class Sample {
	private String date;
	@Before
	public void setUp() throws Exception {
                System.setProperty("webdriver.chrome.driver", "./driver/chromedriver.exe");
                driver = new ChromeDriver();
                driver.manage().window().setSize(new Dimension(1920, 1080));
		Calendar cal = Calendar.getInstance();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
		date = sdf.format(cal.getTime());
	}

	@Test
	public void サンプル() throws Exception {
		driver.get("https://www.navitime.co.jp/");
        	Screenshot screenshot = new AShot().shootingStrategy(ShootingStrategies.viewportPasting(100))
		        	.takeScreenshot(driver);
        	ImageIO.write(screenshot.getImage(), "PNG", new File(directory + "filename" + date + ".png"));
	}

	@After
	public void tearDown() throws Exception {
                driver.quit();
	}
}

Jenkinsの設定はこんな感じ

バスが多く走る時間帯は短い間隔、少ない時間帯は長い間隔で実行する意図で分けている

効果

この自動テストの導入により待機時間を無くし、1個1個の画面を確認するという実作業の時間だけに絞ることができました。
その結果、マニュアルテストの場合だと少なくとも8時間程度は拘束されるところを30分程度(※)まで削減できました。
※:Seleniumのテストコードを書く時間+キャプチャを確認する時間の合計です。Seleniumの実行環境は構築済みだったため、環境構築の時間は含んでいません。
ちなみにこの自動テストによって、”発車まであと○分”と表示する部分が0時台だと異常な値になる(日付をまたぐと外部APIから渡ってくる発車日時と表示用の計算が合わなくなる)、という不具合を見つけられたりもしました。

おわりに

いかがでしたでしょうか。
知ってしまうと拍子抜けするほど単純明快ですが、ちょっとした工夫でテストが楽になるというお話でした。参考になれば幸いです。