Run massively scalable performance tests on web, mobile, and APIs

Request a Demo
Oct. 10th, 2016

How to Automate Testing Using Selenium WebDriver, Jenkins and Allure (Selenium WebDriver、Jenkins、および Allure を使用してテストを自動化する方法)

継続的テスト(CT)のフローを作成するために、継続的統合(CI)環境で自動テストを作成するには、一連の自動化ツールとテスト ツールについて十分に理解する必要があります。本記事では、これらのツールを組み合わせて活用し、CI/CD でテストを実装して自動化する方法について説明します。

 

このブログ記事の以降の部分を十分に理解するには、あらかじめプログラミング言語と単体テストの基本を習得している必要があります。

 

数多くのツールや手法を CI 環境に統合することができます。BlazeMeter では、Selenium WebDriver Python を使用しており、これを Jenkins と統合しています。ここで扱うテスト フレームワークは PyTest です。このフレームワークでは、小規模なテストを簡単に記述できるだけでなく、アプリケーションやライブラリの複雑な機能テストのサポートまでスケールすることができます。

 

テストを記述して毎晩実行できるようになる前に、考慮すべきいくつかの前提条件があります。

 

環境の準備

 

テスト環境を準備するには、以下の手順を実行する必要があります。

 

1. ブラウザの選択

 

ここでは、概念実証として ChromeDriver を取り上げますが、他にも FirefoxDriver、InternetExplorerDriver、SafariDriver、OperaDriver、PhantomJS などのデスクトップ ブラウザを利用できます。ChromeDriver をダウンロードし、グローバルの /bin フォルダに保存します。ここでは、/python27/bin です。

 

2. プログラミング言語と IDE の選択

 

ここでは、BlazeMeter で主に使用される言語である Python を選択しますが、WebDriver によるバインディングがあれば任意の言語を選択できます。

 

  • Selenium WebDriver でサポートしている言語の詳細については、ここを参照してください

  • Python の詳細情報については、ここを参照してください

 

今回の目的に適した IDE (統合開発環境)は PyCharm です。

 

3. Selenium WebDriver の活用

 

Selenium WebDriver は、自動テスト用の主要なオープン ソース ツールの 1 つです。一般には、WebDriver はトップレベルの GUI テスト ツールの 1 つです。WebDriver について聞いたことがなければ、高品質で安定した自動テスト製品を利用するための詳細を知る良い機会になるでしょう。WebDriver の詳細については、ここを参照してください。

 

4. 必要なテスト フレームワークを決定する

 

次の手順は、選択したプログラミング言語に応じてテスト フレームワークを選択することです。ここでは、BlazeMeter で作業しているテスト フレームワークである Py.Test を取り上げます。

 

もちろん、他にも数多くのテスト フレームワークを選択できます。

 

この記事では、Py.Test を通じて作成されたテストについて説明します。Py.Test は test.py ファイルを解釈し、「test」を含む関数のみを解析します。PyTest の規約に基づいてテストを記述する方法の詳細については、ここを参照してください。

 

テストの作成

 

自動テスト用の環境を準備したら、最初のエンドツーエンド(E2E)フローの作成に進みます。コードの頻繁な変更(Web サイトへのログインや、一度サインインした URL の検証)に備えて、テストはできるだけ迅速かつ簡潔な内容にする必要があります。

 

テストを予想どおりに実行するには、py.test の構造を順守してください。

 

以下に、小規模なテスト用の短いサンプル コード(WebDriver Python と PyTest を使用)を示します。

 

login_scenario.py

 

import tests.tests as tests

# Test step 1 - Open URL
def test_open_url(driver, url):
   tests.open_url(driver, url)


# Test step 2 - Add credentials
def test_add_credentials(driver, username, password):
   tests.add_credentials(driver, username, password)


# Test step 3 - Submit form
def test_submit_form(driver):
   tests.submit_form(driver)


# Test step 4 - verify URL
def test_verify_url(driver, url):
   tests.verify_url(driver, url)

 

Tests.py

 

from selenium.webdriver.common.by import By

page = "page"
username_el = "username"
password_el = "password"
submit = "//input[@type='submit']"
expected_url = "my/"


def open_url(driver, url):
   driver.get(url)
   driver.find_element(By.ID, page)


def add_field(driver, value, field):
   username_field = driver.find_element(By.NAME, field)
   username_field.clear()
   username_field.send_keys(value)


def add_credentials(driver, username, password):
   add_field(driver, username, username_el)
   add_field(driver, password, password_el)


def submit_form(driver):
   driver.find_element(By.XPATH, submit).click()


def verify_url(driver, url):
   assert (url + expected_url) == driver.current_url

 

Conftest.py

 

import pytest
from selenium import webdriver

def pytest_addoption(parser):
   parser.addoption("--driver", action="store", default="chrome", help="Type in browser type")
   parser.addoption("--url", action="store", default="https://qa.moodle.net/", help="url")
   parser.addoption("--username", action="store", default="manager", help="username")
   parser.addoption("--password", action="store", default="test", help="password")


@pytest.fixture(scope="module", autouse=True)
def driver(request):
   browser = request.config.getoption("--driver")
   if browser == 'chrome':
       browser = webdriver.Chrome()
       browser.get("about:blank")
       browser.implicitly_wait(10)
       browser.maximize_window()
       return browser
   else:
       print 'only chrome is supported at the moment'


@pytest.fixture(scope="module")
def username(request):
   return request.config.getoption("--username")


@pytest.fixture(scope="module")
def password(request):
   return request.config.getoption("--password")


@pytest.fixture(scope="module")
def url(request):
   return request.config.getoption("--url")

 

GitHub のテスト リポジトリ全体は、ここで参照できます。

 

ローカルでのテスト実行

 

これらのテストは Py.Test の規約に従って作成されているので、ローカルの環境で実行する正しい方法は以下のようになります。

 

方法 1 - conftest.py ファイル内の parser.addoption で設定されたデフォルト値を使用します。

 

py.test test_name.py

 

結果は以下のようになります。

 

 

方法 2 - 以下のようなパラメータを使用してテストを実行します。

 

py.test --driver=chrome --url=http://qa.moodle.net --username=manager --password=test test_name.py

 

Jenkins を介したテストの実行

 

拡張可能な自動化サーバとして、Jenkins はシンプルな CI サーバとして使用することも、プロジェクトの継続的な配信ハブにすることもできます

 

注: Jenkins でテストを実装する前に、requirements.txt をインストールした事前設定済みの仮想環境でテストを実行することをお勧めします。

 

  1. 仮想環境の作成 - 仮想 Python 環境の作成方法とその使用方法については、ここを参照してください。

  2. プロジェクト要件のエクスポート - 関連するすべてのインストール済みモジュールを requirements.txt にエクスポートする方法の詳細については、ここを参照してください。

 

Allure レポート プラグインの Jenkins へのインストール

 

Allure はオープン ソースのフレームワークであり、テスト実行の出力がわかりやすく表示されたテスト実行レポートの作成を目的としています。Allure プラグインを使用すると、Jenkins ジョブの実行中に Allure レポートを自動的に生成して任意のビルドにアタッチすることができます。このプラグインをインストールして、Jenkins での作業を開始しましょう。

 

Jenkins ジョブの新規作成

 

作成する Jenkins ジョブには、以下のような前述のすべての手順が含まれている必要があります。

 

  1. 仮想環境の作成
  2. requirements.txt のインストール
  3. 仮想環境のアクティブ化
  4. テストの実行
  5. 仮想環境の非アクティブ化

 

以下の SHELL スクリプトを使用して、新しい Jenkins ジョブを作成します。

 

#!/bin/bash

echo '#### Create Virtual Environment ####'
VIRTUAL_ENV_NAME='virtual-environment'
virtualenv $VIRTUAL_ENV_NAME


echo '#### Activate Virtual Environment ####'
source $VIRTUAL_ENV_NAME/bin/activate


echo '#### Install requirements ####'
pip install -r ./gui_automation/requirements.txt


echo '#### Run tests ####'
py.test --alluredir=../../allure-results scenarios/login_scenario.py  

 
echo ### deactivate virtual environment ###
deactivate

 

以下のスクリーンショットのようになります。

 

 

テスト結果を Allure レポートで表示

 

プロジェクトが Jenkins に正常に統合されたら、次の課題は、テスト結果をわかりやすいユーザ フレンドリなレポートにエクスポートすることです。Allure では、環境変数を指定して、テスト状況に関する統計情報を表示できます。

 

また、画像、xml、json、txt、mp4、その他のさまざまな添付ファイルを埋め込むオプションもあります。

 

一連の py.test は、前述のようにパラメータを使用して実行されるか、またはデフォルト値で実行されます。

 

ここでは、以下のようにデフォルト値を使用します。

 

py.test --allure-dir="PATH_TO_DIR" login_scenario.py

 

 

Allure には、便利な機能やパラメータが多数用意されており、スクリーンショット、ログ ファイル、その他の多くの要素をライブ レポートに埋め込むことができます。

 

以下の GIF に、ビルドの完了後に Jenkins を介して Allure がどのように表示されるかを示します。

 

 

毎晩のジョブのスケジュール

 

CI 環境が毎晩、最新リリースに設定されていることを確認してください。Jenkins ジョブを特定のスケジュールで実行するように設定する方法の詳細については、ここを参照してください。

 

これで、すべてのテストが Jenkins で設定されました。残りの作業は、最新のビルドが含まれる CI 環境で、これらのテストが毎晩、自動的に実行されるようにスケジュールするだけです。

 

次のガイドでは、作成したこれらのジョブすべてを起動するマスタ ジョブを Jenkins 内に作成する方法について説明します。

 

次の手順

 

このチュートリアルがユーザの目標を達成するために役立つことを願っています。

 

注: この記事では、単体テストと機能テストに焦点を当てましたが、Jenkins は、Apache JMeterTaurus、そしてもちろん BlazeMeter のようなオープン ソース ツールと組み合わせることで、継続的なパフォーマンス テストにも最適なツールになります。まだお読みになっていない場合は、Jenkins で JMeter を実行する方法Jenkins Pipeline を介した JMeter テストの実行Jenkins でパフォーマンス テストを簡単に自動化する方法についての詳細を参照することをお勧めします。

 

BlazeMeter のパフォーマンス テストで Taurus、Selenium、Jenkins などのツールを活用する方法について、1 対 1 のライブ デモをリクエストすることもできます。

 

さらに詳しい情報については、ウェビナー「Using Taurus to Automate JMeter and Selenium Tests (Taurus を使用して JMeter と Selenium のテストを自動化する)」をご覧ください。

 

フィードバック、質問、その他の問題がある場合は、お気軽にお問い合わせください。

 

自動テストを存分に活用しましょう。

Interested in writing for our Blog? Send us a pitch!