【selenium】pytest + jenkins でまとめてテスト実行


この記事は Selenium/Appium Advent Calendar 2018の12日目の記事です。

みなさん、今年もSeleniumのテストコードをたくさん書いたのではないでしょうか。
今年の集大成として、書いてきたコードをまとめて実行してみませんか!?
ということで、 pytest + jenkins で、実行とテスト結果をまとめる話をしていきます!

アジェンダ

  1. テストコードをpytestで実行・結果が出力されるような記述にする
  2. Jenkinsでseleniumを動かす設定をする

環境

MacBook Pro
バージョン: 10.14.1
Python: 3.7.0

1. pytestで実行・結果が出力されるような記述にする

pytestとは

pytestフレームワークは、小さなテストを簡単に作成するだけでなく、
アプリケーションやライブラリの複雑な機能テストもサポートしています。
( pytest公式より )

ということで、端的にいうとpython用のテストフレームワークです。

pytestは、テストが失敗したときの出力が特に分かりやすいこともあり、
自分はSeleniumと組み合わせて使っています。

ファイル名を 「test_○○」 で始める

pytestはテストコードが配置されているディレクトリで、
pytestとコマンド打つと、自動でtest_から始まるファイルをサーチして、
実行してくれます。

関数名を 「test_○○」 で始める

pytestは自動でtest_から始まるファイルをサーチして、
さらに、そのファイル内に入っているtest_から始まる関数をテスト対象として、
見つけ出して、実行してくれます。

ですので、pytestの実行ファイルは以下のような、コードになります。
サンプルとして、Selenium公式HPをテストしています。

test_seleniumhq_1.py
import unittest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import pytest
import requests


class GetRoot(unittest.TestCase):
    options = Options()
    # ヘッドレスモードで起動
    options.add_argument('--headless')
    driver = webdriver.Chrome(chrome_options=options)

    @classmethod
    def setUpClass(cls):
        # Seleniumの公式HPを指定
        cls.base_url = "https://www.seleniumhq.org/"
        cls.driver.implicitly_wait(30)
        cls.verificationErrors = []
        cls.accept_next_alert = True
        cls.driver.get(cls.base_url)

    @pytest.mark.parametrize()
    def test_get_page(self):
        driver = self.driver
        # HTTPステータスを確認
        r = requests.get(driver.current_url)
        self.assertEqual(r.status_code, 200)
        # ページのタイトルをチェック
        title_target = "Selenium - Web Browser Automation"
        print(driver.title)
        self.assertEqual(title_target, driver.title)

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()


if __name__ == "__main__":
    unittest.main()

pytestで実行すると以下のような出力で出てきます。
実行したファイル名の横のドットは、
PASSしたテスト(test_○○と名付けて実行した関数)です。
失敗するとドットではなく、Fになります。

$ pytest test_seleniumhq_1.py 
=========================== test session starts ===========================
platform darwin -- Python 3.7.0, pytest-3.8.0, py-1.6.0, pluggy-0.7.1
rootdir: /Users/XXXX/Documents, inifile:
plugins: remotedata-0.3.0, openfiles-0.3.0, doctestplus-0.1.3, arraydiff-0.2
collected 1 item                                                          

test_seleniumhq_1.py .                                              [100%]

======================== 1 passed in 4.70 seconds =========================

2. Jenkinsの設定をする

jenkinsのインストール方法については、過去記事や参考記事が色々あるので、割愛します。
HomebrewでJenkinsをインストール

jenkinsでpythonを実行できるようにする

ShiningPanda Plugin というプラグインをインストールします。

jenkinsのトップ画面 > Jenkinsの管理 > プラグインの管理

で、プラグインを設定するページへ遷移することができます。
利用可能のタブを選択して、 「ShiningPanda Plugin」 を探して、インストールします。

続いて、python3で動かせるように設定をします。

jenkinsのトップ画面 > Jenkinsの管理 > Global Tool Configuration

デフォルトは、2系しか入っていないため、ここに3系の情報を入れます。
自分の環境数台では、以下のような設定で動かせました。

chromedriverをパス指定無しで動かすための設定

/usr/local/bin にあるコマンドファイルを実行できるように、環境変数の設定をします。

jenkinsのトップ画面 > Jenkinsの管理 > システムの設定

環境変数にチェックボックスを入れて、テキストボックスを表示させたら以下のように記入します。

これで、ひとまずJenkins全体に関わる設定は終わりました。

ジョブの設定

今回はテストコードの管理を、Githubでおこなうので、
リポジトリのURLを入力して、jenkinsと連携させます。
各ジョブの画面で設定をクリックして、以下のようにリポジトリのURLを入れていきます。
(図はオープンリポジトリの場合です。プライベートリポジトリの場合は認証設定が必要です。)

次に、実行するコマンドを指定します。
pipでインストールするものは、自分の作成したコードに合わせて適宜、調整してもらえればと思います。

後は、ビルド実行してみましょう!!
今年書きためたテストが一気に実行されるはずです!!