この記事は Selenium/Appium Advent Calendar 2018の12日目の記事です。
みなさん、今年もSeleniumのテストコードをたくさん書いたのではないでしょうか。
今年の集大成として、書いてきたコードをまとめて実行してみませんか!?
ということで、 pytest + jenkins で、実行とテスト結果をまとめる話をしていきます!
###アジェンダ
- テストコードをpytestで実行・結果が出力されるような記述にする
- 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をテストしています。
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 =========================
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でインストールするものは、自分の作成したコードに合わせて適宜、調整してもらえればと思います。
後は、ビルド実行してみましょう!!
今年書きためたテストが一気に実行されるはずです!!