Tips

TestCafe入門

TestCafe入門

この記事では、TestCafeと呼ばれるフレームワークの入門を扱う。

概略

  1. ユーザーのブラウザ操作(以下UI)を模倣して、ウェブページ・ウェブアプリケーションを操作することにより、UIテストを代行するフレームワーク
  2. JavaScriptCoffeeScriptTypeScriptでテストシナリオを記述する
  3. 設定が簡単なので、Selenium WebDriverに代わるUIテストフレームワークとして注目されている

なぜTestCafeが必要か

苦痛を伴うUI手動テストを軽減・廃止するため。

UIテスト自動化フレームワークの普及以前は、
すべてのUIテストで、
テスト項目をまとめた書類をもとに、人間が
手動でブラウザを操作しながら目視で結果を確認していた。
これだと、延々と続く単純作業に、精神と注意力を削られることになる。
ミスも多発し、苦痛を避けるための隠ぺいやごまかし、判定基準のルーズ化が発生しうる。
これらを未然に防ぐために、UIテストの自動化が必要。

UIテストの自動化で設定が最も簡潔なものの一つがTestCafeである。
よって、TestCafeを使うのが2019年時点では最有望の解決法の一つである。

環境構築

以下の二ステップで構築する。

  1. npmをインストール
  2. TestCafeをインストール

npmをインストール

npmはNode.jsというコンピュータ上でJavaScriptを実行するライブラリに付属している。
であるので、Node.jsをインストールする必要がある。
今回はWindowsを例にとる。

インストーラーをダウンロード

以下のページからダウンロードする。

https://nodejs.org/ja/download/

ダウンロードページでウィンドウズ版を選択

インストーラーを起動してインストール

ダウンロードされたインストーラー

testcafeをインストール

ここではCドライブ直下にTestCafeTutorialsのフォルダを作っている。
そのディレクトリに移動した後で、以下のコマンドを入力する。
コマンドの入力は、コマンドプロンプト、PowerShell Core、Windows PowerShellのどれでもよい。

npm install --save-dev testcafe

テストシナリオの記述

テストシナリオの記述言語

さきに述べた通り、JavaScript、CoffeeScript、TypeScriptの三つが、
初期状態でサポートされている。

この記事ではTypeScriptでテストシナリオを記述する。
理由は以下の二点である。

  1. 漸進的型付け言語であること
  2. JavaScriptの厳密なスーパーセットであること

漸進的型付け言語のメリット

型のないJavaScriptでは、できない、
型検査などができる。

JavaScriptの厳密なスーパーセットであることのメリット

CoffeeScriptはJavaScriptに最終的にコンパイルされるが、
文法が大きく異なる。

一方、TypeScriptはJavaScriptの厳密なスーパーセットであるので、
JavaScriptの文法そのままプラスα(型指定)で記述できる。

テストシナリオの執筆準備

シナリオの作成

テストシナリオをコーディングする前に、
まず日本語でまとめることが大切である。

ここでは、最も簡単な例として、以下のようなシナリオとする。

  1. 対象画面はGoogle検索
  2. テストシナリオの内容は、検索窓に『TestCafe』と打ち込んで検索ボタンをクリック
  3. 検索結果画面に遷移すれば成功

必要な調査

HTML上で、検索キーワード入力欄と検索ボタンがどのような
ID、クラスと属性値を持っているかを確認する必要がある。

ここでは、Chromeの開発者ツールを呼び出して、
該当する要素のHTMLでの記述をチェックしている。

検索キーワード入力欄は、class=”gLFyf gsfi”、title=”検索”となっている。
検索ボタンは、class=”gNO89b”、value=”Google 検索”となっている。

実際のテストシナリオのサンプル

ここでは、手続き型で書いた最も簡単な例を紹介する。

テストシナリオの構成

最終的に目指すサンプルは以下の通り

import "testcafe";
import {Selector} from "testcafe";

fixture("Google Search")
    .page("https://www.google.com/");

test("Google Search Test", async (t) => {
    const googleSearchTextArea = Selector(".gLFyf").withAttribute("title", "検索");
    const googleSearchButton   = Selector(".gNO89b").withAttribute("value", "Google 検索");

    await t.typeText(googleSearchTextArea, "TestCafe");
    await t.click(googleSearchButton);
});
ライブラリのインポート

ライブラリはtestcafeをインポートする。

import "testcafe";
import {Selector} from "testcafe";
テスト開始ページ

ここでは、テスト開始ページの記載をしている。
page()の中に、Googleの検索ページのURLを入力している。

fixture("Google Search")
    .page("https://www.google.com/");
テスト本体

google検索のテキスト入力欄に、”TestCafe”と入力し、
google検索ボタンを押す、という内容の記載が以下のとおりである。

googleSearchTextAreaは検索語句の入力欄、
googleSearchButtonは検索実行ボタンを指している。

tはテストコントローラー(テストの実行者)、
typeTextはテキストを入力、
clickはクリック、という意味である。

詳細を解説するために、コードにコメントを付けたものを以下に載せる。

/**
 * Google Search Testという名前のテスト(test)を実施
 */
test("Google Search Test", async (t) => {
    /**
     * 定数(const)のグーグル検索検索テキスト入力欄(googleSearchTextArea)が指し示す(=)のは、
     * HTMLツリー上の要素(Selector)の中で、
     * gLFyfというクラス(".gLFyf")を持ち、
     * かつtitle属性()の値が検索()であるもの
     */
    const googleSearchTextArea = Selector(".gLFyf").withAttribute("title", "検索");
    
    /**
     * 定数(const)のグーグル検索検索ボタン(googleSearchButton)が指し示す(=)のは、
     * HTMLツリー上の要素(Selector)の中で、
     * gNO89bというクラス(".gNO89b")を持ち、
     * かつvalue属性()の値がGoogle 検索()であるもの
     */
    const googleSearchButton   = Selector(".gNO89b").withAttribute("value", "Google 検索");
    
    /*
     * テスト実施者(t)がグーグル検索テキスト入力欄(googleSearchTextArea)に、
     * TestCafeという文字列("TestCafe")を入力する(typeText)
     */
    await t.typeText(googleSearchTextArea, "TestCafe");
    /*
     * テスト実施者(t)がグーグル検索検索ボタン(googleSearchButton)をクリックする(click)
     */
    await t.click(googleSearchButton);
});

テストの実行

テスト実行のためのディレクトリ構成

C:\TestCafeTutorials直下に

GoogleSearch.test.tsというスクリプト名で、

上記シナリオを保存する。

テスト実行コマンド

以下のコマンドをコマンドプロンプトまたはPowerShell CoreまたはWindows PowerShellに入力する。

testcafe chrome .\GoogleSearch.test.ts

実行結果

実行結果は以下の通り。
ApowerRECというツールを使って録画している)

Recent News

Recent Tips

Tag Search