こちらは ANDPAD Advent Calendar 2022 の25日目の記事です。
はじめまして、アンドパッドでQuality Control (≒ QAエンジニア) をやっている高木です。普段は「ANDPAD引合粗利管理」の開発チームでテストや品質に関わる業務を行なっています。
初めてのテックブログ執筆でアドベントカレンダーの最終日枠を取ってしまい非常に恐れ慄いているのですが、あまり気張らずに業務でのTryを記事にしようと思います。
直近、業務として開発経験が無い私がGo言語とWebDriverを使ってテストデータ作成を自動化を行ってみたので、その際に行ったこと・考えたことを書こうと思います。
背景
QAエンジニアとしてソフトウェアテストを行なっている中で、大量のデータを作成する必要があるテストが度々発生していました。
具体的には
- 各データで1度だけ確認できる挙動のテスト
- データを削除した際の確認を複数回行うテスト
などです。
私の現在の業務ではUI上でのブラックボックステストを中心に行っており、テストデータ作成も画面上から手動で行なっています。
そのため、必要な件数が10件程度であれば手動で作成してもそこまで手間はかかりませんが、50件、100件と必要になる場合、非常に時間がかかってしまって作業効率が悪いと感じていました。
さらに、個人的には正直テストデータ作成という作業自体が業務の中でも楽しい作業ではないと感じていたため、仕事に対するモチベーションという観点でも改善したいなと思うようになっていました。
上記の背景もあり、テストデータ作成を自動化することで作業効率化していこうと決めました。
先に実際に作成したイメージを載せておきます。
やったこと
自動化にあたり、以下の順序で作業を進めていきました。
- 何を自動化したいかを整理する
- どのような手段で自動化するかを決定する
- 実装する
- 実際に使ってみる
1. 何を自動化したいかを整理する
まず最初に何を自動化したいかを改めて整理しました。(要件定義)
今回の目的としては先述した通り、「テストデータ作成工数を削減したい」という目的のため、
- 多くのテストで必要とするデータである
という指標を何より優先して検討し、まず最初にユーザーのデータ作成を自動化することにしました。
自動テストと同じく、今回のツールも何度も使うことで自動化による工数削減効果が発揮されます。 当たり前ですが、ユーザーのデータはほぼ全てのテストで必要とされるため、自動化の恩恵が受ける機会が多く、メリットが大きいと考えられます。
実際にユーザーのデータを作成する時間を計測したところ、1件あたり約30秒程度かかっていました。 仮に100件作成するとしたら3000秒 = 50分かかってしまいます。 この結果からも非常にメリットは大きいと考えました。
この時に気をつけた点としては、スコープが大きくなりすぎないように注意することです。
あれも自動化したい、こっちも楽したい、と考えていくと、どこまでもやりたくなってしまって作業がダラダラ続くようになってしまうため、今回はユーザー作成だけ!と明確に1stスコープのゴールを定めるように意識しました。
(普段MVPで要件を定めてくれるPMの方の凄さを強く実感する出来事でした)
2. どのような手段で自動化するかを決定する
自動化の手段について
次に、どのような手段でデータ作成を自動化するのかを考えました。 大きく分けて以下の二案が候補となりました。
- RPAツールなどを使って自動化する
- 自分でコードを書いて自動化する
今回は気持ちドリブンで二つ目の「自分でコードを書いて作る」を選択しました。
理由として、普段から趣味でコードを書く機会は持つようにしていたのですが業務内でコードを書く機会はあまり無く、せっかくなのでコードを書いて実現しようと考えたためです。
ただチームで正式なプロジェクトとして発足する場合は効率面やスキル面などを考慮して決定すべきだと思いますので、こちらは組織やチームの状況ごとに判断が必要な部分だと感じました。
(実際今回の要件程度であればSelenium IDEなどで実現できそうでした)
言語について
自分でコードを書いて自動化すると決めた後は、どの言語で作成していくのかを考えました。
結果として今回はGoを選択しました。
各OSに対応するシングルバイナリでビルドできる点が、Goを選択した最大の理由であり魅力です。
QC・QAのメンバーは開発経験がないメンバーが所属していることも多いため、環境構築が一つ大きな課題になると考えました。 私自身も開発は本業ではなく環境構築でつまづいた場合にフォローできる保証がないため、アプリケーション自体をシングルバイナリで配布し、その他の環境構築を最低限で済ませることを目的としました。
結果的に環境構築はChromeDriverのインストール程度に済ませることができました。
また、今回はGoにおけるブラウザ操作のためのWebDriverクライアントのライブラリはagoutiを使用しました。
※ agoutiは既に更新が止まっているため、本格的に運用するプロジェクトの場合は別のライブラリを使用した方がよさそうです
3. 自動化する作業を行う
どのように自動化するかを決定したので、具体的な実装に入っていきました。
詳細は割愛しますが
- データ作成に必要な情報(データ作成する環境、ユーザー名、登録メールアドレス、データ作成数)を標準入力として受け取る
- 受け取った情報をもとに、WebDriverを使ってデータを作成する
- 氏名・メールアドレスは「入力内容0」「入力内容1」「入力内容2」のように末尾に連番をつける
という内容で実装しました。
詳細な実装方法はこちらや他の方の記事などをご参照ください。
実装面で最も頭を悩ませたのが設計をどのようにするか、という点でした。
文法などの書き方についてはググれば最低限は調べられるので、大きくつまずくことはありませんでした。 しかし、設計面はどうしても知識や経験がないため、どのように実装を進めればよいのかわかりませんでした。
解決策としては、初めから綺麗なコードを書くことは諦めて一旦処理をベタ書きした後、関数などに分離した方がよさそうな箇所を分離していきました。 結果としてなんとか動くものは作ることができたので、今後の課題としてコードレベルの設計について学んでいきたいと思います。
4. 実際に使ってみる
一通り実装が完了したので、実際の使用感を確認しました。
実際に使ってみて気づいた点がいくつかありました。
- ユーザー作成を自動で流しながら、別の作業を進められるので効率化はできていた(目的は達成できそう!)
- 「hoge@example.com」と「fuga@example.com」のように、連番ではない氏名やメールアドレスのアカウントを多数作成したい場合もある
- 並列処理などを行っていないので、想像より時間がかかる
などなど多くの感想を抱きました。
今後はcsv読み込みできるようにするなど、まだまだ改善の余地を感じました。
最後に
今回自動化に取り組んでみて、ちょうど自動化した直後にユーザーのテストデータを100個ほど作成する必要が出てきたため、実際に使ってみました。 本来であれば50分程度の時間が必要であったと思われるデータ作成作業が10分程度で完了でき、別の作業と並行して実施できたため非常に効果を感じています。
また今回の取り組みの中で要件定義〜実装〜テストと擬似的にプロダクト開発の一通りのサイクルを体験することができたのが、想定外の嬉しい経験でした。
普段はテストを中心に動いていますが、他のポジションのメンバーが行っている業務への解像度が高まったと感じています。
そして何より、うまく要件を定義できずに何度も手戻りになったり、実装中にも想定通りに動かないコードと格闘することで、実際に動くものを作ってテストまで回してくださっている他のメンバーへの感謝が高まりました。
今後もこのような取り組みにTryし続けていきたいと思います!
アンドパッドのQCDivisionでは本記事のように、品質に関連することには積極的に挑戦し、様々な面から品質管理/向上に取り組んでいます。 そしてQCはもちろん他のポジションでも一緒に働く仲間を募集中です!
ご興味を持たれた方からの下記サイトからご連絡をお待ちしております。 興味を持たれた方は、求人情報をご覧ください!