UFT Oneで正規表現を利用した汎用的なテストコードを記述する方法
はじめに
こんにちは、テスト自動化アーキテクトの三浦です。
今回はUFT Oneで正規表現を利用して汎用的なテストコードを記述する方法についてご紹介したいと思います。
UFT Oneとは
MICRO FOCUS社が提供するWeb、モバイル、API、RPA、エンタープライズアプリケーションソフトウェアの機能テストを自動化する事ができるツールです。 UFT OneではSAPのアドインが用意されているのでSAPの画面に特化して簡単に自動化スクリプトを実装することができます。
正規表現とは
いくつかの文字列を一つの形式で表現するための表現方法です。
オブジェクトを正規表現で指定する必要性
正規表現が必要になる具体例を挙げてみましょう。
任意のSHIFTの技術ブログの記事から、2つ前の記事に遷移するスクリプトを書いてみます。
操作を記録する通常パターン
SHIFT技術ブログの『情シスでも』 とことんやると、それは組織の文化になる!!で「前の記事」ボタンを押下する動作をUFTで記録します。
記録すると以下のコードが出力されます。
Browser("『情シスでも』 とことんやると、それは組織の文化になる!!|").Page("『情シスでも』 とことんやると、それは組織の文化になる!!|").Link("前の記事 1から始めるTypeScript入門①").Click
では続けて、遷移した先のページで「前の記事」ボタンを押下する動作をUFTで記録してみます。
記録すると以下のコードが出力されます。
Browser("『情シスでも』 とことんやると、それは組織の文化になる!!|").Page("『情シスでも』 とことんやると、それは組織の文化になる!!|").Link("前の記事 1から始めるTypeScript入門①").Click
Browser("『情シスでも』 とことんやると、それは組織の文化になる!!|").Page("1から始めるTypeScript入門① ~").Link("前の記事 会って2日でお客様に信頼される仕事術を見た").Click
上記のコードを実行すると記録した通りに動きます。
上記の記録の何が問題なのか
上記の記録方法では問題があるのですが、何が問題でしょうか。 それは、 「任意のページから実行した場合に同様の結果を得られない」 という点です。
スクリプト実行のスタート画面を1から始めるTypeScript入門① ~ 環境構築からJsonファイルでHello World ~にして再度実行してみましょう。
結果は以下のようになります。
違いがおわかりでしょうか。
『情シスでも』 とことんやると、それは組織の文化になる!!のページからスクリプト実行時には実行時間は 8秒 なのに対し、
1から始めるTypeScript入門① ~ 環境構築からJsonファイルでHello World ~のページからスクリプト実行をすると実行時間が 43秒 となっています。
「前の記事」ボタンを2回押下しているだけなのに何故このような違いが生まれてしまうのでしょうか。
実行時間が長くなってしまっていた原因
実行時間が長くなってしまっていた原因についてはスマート認識という機能が働いている為です。 UFT OneでSAPのローディングパネルが消えるまで待つ方法に記載しておりますので以下を記事から抜粋します、
つまり、正しく実装されておらずエラーとなるはずの箇所でエラーにはならず スマート認識によりブラウザ・ページオブジェクトを無視して等しい項目を探す機能が働き意図した動作になりました。
上記はあくまでも例ではありますが、このように同一のページ構成だがブラウザ名・ページ名だけが記録したオブジェクトと異なりスマート認識が働いて実行時間が無駄に長くなってしまっているパターンは多くあると思います。
では、どのようにすればスマート認識を機能させずに、どのページに対してもオブジェクトを認識させることができるのでしょうか。 それを実現する為に使用するのが 「正規表現」 です。
正規表現を使用してオブジェクトを正しく認識させよう
記録したリポジトリを修正することで正規表現でページ名を指定することができるので、ローカルリポジトリを開いてみましょう。
ローカルリポジトリの確認
『情シスでも』 とことんやると、それは組織の文化になる!!でのページ記録したオブジェクトは以下のように記録されています。
ブラウザ名・ページ名が 「『情シスでも』 とことんやると、それは組織の文化になる!!|SHIFT Group 技術ブログ|note」
項目名が 前の記事 1から始めるTypeScript入門① ~ 環境構築からJsonファイルでHello World ~
これらに一致する項目がページ上に存在すればスマート認識を働かせずに項目にアクセスをすることができます。
1から始めるTypeScript入門① ~ 環境構築からJsonファイルでHello World ~のページからスクリプト実行をした場合、上記のオブジェクト情報に一致しなかった為、スマート認識が働いていました。
オブジェクトに正規表現を適用する
SHIFTの技術ブログにおいて、どの記事にアクセスしても「前の記事」ボタンに対してスマート認識を働かせずにアクセスさせるには、どのように正規表現を適用すればよいでしょうか。
ブラウザオブジェクトに正規表現を適用する
まず、ブラウザ名・ページ名から考えていきましょう。
ブラウザ名・ページ名は 「『情シスでも』 とことんやると、それは組織の文化になる!!|SHIFT Group 技術ブログ|note」 となっています。SHIFTの技術ブログの記事の末尾はどれも 「|SHIFT Group 技術ブログ|note」 となっている為、タイトルの末尾がこの文字列に一致するかどうかを認識させるようにすれば良さそうです。
正規表現を設定したい場合、値列にフォーカスをあてると右側にボタンが表示されるのでクリックしてください。
値設定オプションダイアログが表示されるので定数に「.*|SHIFT Group 技術ブログ|note」と入力し、正規表現にチェックを入れる。 リテラルとして扱うかどうかのメッセージボックスが表示されるので「いいえ」を選択してOKです。
設定が完了すると以下のようになります。ブラウザのオブジェクトに関してはnameプロパティに対しても正規表現を適用する必要があります。「+」ボタンを押下してください。
nameプロパティもtitleプロパティと同様の値も持っているので修正する必要があります。nameプロパティを選択してOKボタンを押下してください。
プロパティの一覧にnameプロパティが追加されるので、先ほどの同様の手順で正規表現を適用させます。 正規表現を適用してSHIFTの技術ブログ全般を認識できるオブジェクトとなったので名前を変更します。
名前を 「SHIFT Group 技術ブログ|note」 に変更してエンター押下すると、ソースコードで使用されている該当オブジェクトの名称も自動的に置換されます。
ページオブジェクトに正規表現を適用する
ページオブジェクトに関しても、ブラウザオブジェクトと同様に正規表現を適用します。
項目オブジェクトに正規表現を適用する
項目オブジェクトについて同様に正規表現を適用します。
クリック対象のオブジェクトに関してはタイトルが「前の記事 1から始めるTypeScript入門① ~ 環境構築からJsonファイルでHello World ~ 」となっており、正規表現に「前の記事.* 」を適用し名前を「前の記事」に変更します。
不要なオブジェクトを削除する
ブラウザ・ページ・項目に対してそれぞれ正規化をしたことにより、どのSHIFT技術ブログのページからでも「前の記事」のボタンを押下できるオブジェクトになったので、正規化したオブジェクト以外は削除します。
「前の記事」を2回押下したいのでスクリプトを以下のように修正します。
正規化したスクリプトで再度実行してみる
正規化したスクリプトで再度実行してみます。
『情シスでも』 とことんやると、それは組織の文化になる!!のページからスクリプト実行時には実行時間は 9秒
1から始めるTypeScript入門① ~ 環境構築からJsonファイルでHello World ~のページからスクリプト実行をすると実行時間は 7秒
正規化したことでスマート認識を働かせずにページのオブジェクトを正しく認識することができ、実行時間が大幅に短縮されました。
最後に
いかがだったでしょうか。 同一のページ構成だがブラウザ名・ページ名だけが記録したオブジェクトと異なりスマート認識が働いて実行時間が無駄に長くなってしまっているパターンは多くあると思います。正規表現を適用して実行時間を短縮して効率的なテストを行いましょう。こちらの記事が参考になれば幸いです。
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/