Help us understand the problem. What is going on with this article?

【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とは

pytest1.png

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の設定をする

256.png

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

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

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

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

で、プラグインを設定するページへ遷移することができます。
利用可能のタブを選択して、 「ShiningPanda Plugin」 を探して、インストールします。
スクリーンショット 2018-12-10 14.46.33.png

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

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

デフォルトは、2系しか入っていないため、ここに3系の情報を入れます。
自分の環境数台では、以下のような設定で動かせました。
スクリーンショット 2018-12-10 18.49.14.png

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

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

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

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

スクリーンショット 2018-12-10 18.55.32.png

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

ジョブの設定

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

スクリーンショット 2018-12-10 14.36.17.png

次に、実行するコマンドを指定します。
pipでインストールするものは、自分の作成したコードに合わせて適宜、調整してもらえればと思います。
スクリーンショット 2018-12-10 18.58.46.png

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away