スクリプト、スニペット、関数:生産性が高く、脆弱性の低いテストコードにするには

ログイン、検索、プロフィールの作成、これらはテスターとしてよくおこなう操作です。eコマースサイトでは、カートに入れる、カートを見る、チェックアウトといった操作があり、コンテンツ作成サイトでは、タグ付け、投稿、画像のアップロード、ページの編集といった操作があります。わたしたちは、これらの用語について、わざわざその意味を改めて定義しなくても、十分に理解できます。では、どのようにテストすればよいのでしょうか?自動でテストするには、つまり、時間を節約し、テストで要求される専門知識を減らすような簡単に再現できる方法でテストするには、どうしたら良いのでしょうか?

まずはログインのケースを考えてみましょう。

再利用可能なログイン方法

多くのアプリケーションで最初に行う必要があるのはログインであり、テストの事前条件です。

ほとんどのテスターは、2 つの異なるテストを用意することでこれを解決します。まず、ログインに関するすべての組み合わせを、興味深い失敗も含めて、ひとつの成果物としてテストします。次に、シンプルで再利用可能なログイン操作のスクリプトを用意します。このスクリプトは4つのコマンドを組み合わせています。すなわち、ユーザー名の入力、パスワードの入力、送信ボタンのクリック、ログインの確認テキスト (通常は「こんにちは、<プロフィールに記載されているフルネーム>」) の表示待ちです。ログイン後の画面ではまた、ログイン後の画面に表示される標準的な要素を確認したり、画像の比較を行ったりする場合もあります。もっとも簡単な方法は、これらを実行するコマンドを、すべてのテストスクリプトにカット&ペーストで挿入することです。

そしてある日、問題が起こります。開発者は、以下の例のように、セキュリティを強化するためにログインに”company id“という新しいフィールドを追加します。この例は、米国のとある地方銀行の実際の画面キャプチャであり、”Company ID” フィールドが追加された “Commercial” ログインフローの画面です。

突然、すべてのテストスクリプトが失敗することになります。もしテストスクリプトがプレーンテキストで書かれたものであれば、賢いプログラマーは検索と置換を駆使して修正することができるでしょう。

しかし、繰り返しになりますが、賢いプログラマーであれば最初の段階でコードスニペットを使用していたでしょう。

コード スニペット

ほとんどのテスト自動化ツールは、再利用可能なロジックのスニペットを作成する方法を備えています。ビジュアルツールでは、一種のカプセル化としてコードスニペットを作成することがよくあります。つまり、4ないし5個のビジュアルコマンドを作成し、それをカット&ペーストできるような仮想コマンドにまとめるのです。

しかしこれには、一般的なカット&ペーストと同じ問題(英文)が起こり得ます。

そこで、外部ライブラリに格納できるメソッドまたは関数を作成します。このライブラリはバージョン管理する必要があります。バージョン管理については後で説明します。新しいフィールドを追加するためにユーザーインターフェイスを変更する場合、コードを変更する必要があるのは、そのライブラリのコード1箇所だけです。この1箇所の変更だけで、失敗したすべてのテストが突然成功するようになります。問題は解決です。

ログインの場合は、私たちはいくつかの「あらかじめ用意された」情報を持っています。ユーザー名、パスワード、そして場合によっては相手側に何を期待するか。これらを変数に変更すれば、ユーザ名以外の文字列や無効なパスワードを渡すことができ、エラーメッセージを期待することができます。つまり、テスト自動化ツールには変数を渡すための機能が必要なのです。

また、変数をその場で作成する機能も必要です。たとえば、まったく異なる課金体系でユーザーを作成し、検索結果にはお互いが表示されないようにすることができます。また、同時に複数のテストを実行して、それぞれ異なるユーザー名を使用するようにできます。私のお気に入りの方法は、たとえば “acount201805091300100101” や “user@account20180509130010010101.com” など、日付と時間を変数に入れることです。コードスニペットでこのような変数を生成できます。実際にこれらのメールの受信を確認する必要がある場合は、mailinator.comドメインを持つ電子メールの使用を検討してください。


ログイン用のスニペットのパターンが存在することが分かれば、あらゆる種類のスニペットを作成できることに気付くでしょう。特に検索は簡単で、(用語) に期待する (結果テキスト) を検索すればよいのです。定型的で既知のレコードのデータベース、あるいは少なくとも結果を計算できるものから始めて、用語を検索し、検索がどのように機能するかを示します。結果テキストは、たとえば特定の結果とともに”200件中 1~20件を表示“となり、順番に表示されるでしょう。順序を確認するには、正規表現(英文)が便利です。

例:

/Test Results[\w\W]*Test Planning[\w\W]*Test Execution/

このコードは、任意の数 (*) の単語構成文字 (\ w) または非単語文字 (\ W) で区切られた (つまり任意の文字で区切られた)、特定の順序の 3個のテスト用語に一致します。以下に、Ranorex Studioでdiv要素を同じテキストと一致させるための同様のコードを示します。

div[@text~’Test Results[\w\W]*Test Planning[\w\W]*Test Execution’]

スニペットにはさまざまな名称があり、ツールによってはメソッド、関数、モジュール、あるいは”ユーザーコード“と呼ばれることもあります。スニペットに変数と正規表現を追加できるようになると、スニペットを使う機会がいたるところに現れます。ページオブジェクトパターンは、再利用可能なビジネス機能 (ログインや検索など) の観点からテスト自動化そのものを定義し、それらの機能からテストを構成する試みです。あなたのツールが (視覚的な表現ではなく) コードで構成されている限り、しばしば誤解されるかもしれませんが、素晴らしいスタートを切るのに最適な場所となります。

スニペットを十分に活用すれば、あらゆるものがスニペットの候補として見えてきます。この種のスニペットは、完全に自動化されたテストだけでなく、テスト全体で有用であることに注意してください。たとえば、ログインのスニペットは対話型の探索的テストに最適です。テスターは1回のキーストロークでログインを完了させ、実際の探索に集中することができます。このような場合、スニペットを使用することで、結果が確実な退屈な計算式を繰り返すことに労力を割く代わりに、報われる場所にテストの労力を集中させることができます。

ただし、UIを使用せず、下位レベルで作業を行いたい場合もあります。

コマンドラインの問題とUIを介した問題

プロフィールの作成は、多くの点でログインと同じように感じられます。フィールドに値を入力し、画像をアップロードし、結果を確認します。必須フィールドを空白にすると、適切なエラーが表示されます。すべてスクリプト化でき、すべて再利用可能です。
しかし、時には多数のアカウントを作りたい場合もあるでしょう。おそらく3つ必要です。そのうちの2つは同じアカウントで、検索時にお互いを確認できるようにします。3つ目は別のアカウントにします。

その場合、ユーザーインターフェイスから関数を呼び出すと、遅延が発生します。私たちが行なっていることは、プロフィールの作成をテストすることではありません。むしろ、プロフィールの作成は、実際にテストしたいことのための事前条件に過ぎません。可能であれば、これらのコードをどこか他の場所、つまりより高速に実行可能な場所に移動するのが望ましいと思います。ディスクから復元するテスト環境に保存することもあります。もっと言えば、マイクロサービス機能やコマンドライン機能を用意して、プロフィールを素早く作成することもあるでしょう。

ここで、コードスニペットの専門知識の最後の側面をご紹介します。バージョン管理です。実装コードの場合と同じように、テストコードにもバージョン管理(英文)を適用します。コードスニペット(およびツールの成果物)を本番コードと一緒に直接バージョン管理していない場合、テストは、テストが期待するものと乖離したコードに対して実行されます。その結果、誤ったエラーが報告され、テストコードを”修正“する必要があります。
今日のところは、”コードスニペットを含むすべてのテストコードをバージョン管理下に安全に保管すること、理想的には本番コードと同じリポジトリとブランチに保管すること“と述べるだけで十分でしょう。

テスト自動化ツールであるRanorex Studioの利点の1つは、テストケースから呼び出すことができる再利用可能な小さなコードモジュールを簡単に作成できることです。また、Ranorexには “オートメーションヘルパー“と呼ばれる組み込みメソッドがあり、テスト自動化プロジェクトに簡単に追加することができます。また、Ranorex Studioは、Git、Subversion、GitHub、Team Foundation、GitLabなどのバージョン管理システムと適切に統合されています。

作者について:

Cameron Lairdは、受賞歴のあるソフトウェア開発者であり著作者です。業界のサポート団体や標準化団体に参加しており、Python Software Foundationの投票メンバーでもあります。長年テキサス湾岸に居を構え、お気に入りのアプリケーションは農業自動化向けのアプリケーションです。

(この記事は、開発元 Ranorex 社 Blog 「Scripts, Snippets and Functions: Less Brittle Test Code with More Productivity」2021年9月2日の翻訳記事です。)