36
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

コードを1行も書かずにpytestを実行する

Last updated at Posted at 2019-03-02

pytest-playとは

コードを書かずにテストできる

テストコードは必要だけど作るのは大変ですよね。まるで確定申告のようです。
pytest-playはYAMLファイルを書くだけでテストを実行できるライブラリです。
コードを書く必要がないため、プログラマじゃない人にテストの委託もできそうです。

機能

下記のような機能があります。

  • 実行時間の計測
  • JUnit XML report
  • StatsD/graphiteを用いたテストメトリクスの監視
  • プラグイン
    • play_selenium
    • play_requests
    • play_sql
    • play_cassandra
    • play_dynamodb
    • play_websocket
    • play_mqtt

play_requestsやplay_seleniumを使うと、DjangoやFlaskなどのWebサーバのテストが行なえます。WebサーバはPython製である必要もなく、Railsなどで作られたWebサーバでも構いません。

インストール

pipでインストールします。

pip install pytest-play

Pythonがインストールされていない環境でも、Dockerから実行できます。

docker run -i --rm -v $(pwd):/src davidemoro/pytest-play

使ってみる

簡単なテストをしてみます。pytestと同様にtestで始まるファイル名のYAMLファイルがテスト対象となります。

test_add.yml
- comment: 足し算のテスト
  provider: python
  type: assert
  expression: "1 + 1 == 2"

上記のtest_add.ymlを作成してテストを実行します。pytestコマンドがそのまま使えます。

$ pytest 
======================================== test session starts =========================================
platform linux -- Python 3.6.7, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
rootdir: /home/driller/work/pytest-play, inifile:
plugins: variables-1.7.1, play-2.2.0
collected 1 item                                                                                     

test_add.yml .                                                                                 [100%]

====================================== 1 passed in 0.05 seconds ======================================

YAMLの設定項目を大雑把に説明するとこんな感じです。

  • provider: 実行するコマンドを指定します、pythonseleniumなどがあります
  • type: providerのサブカテゴリのようなものです(うまく説明できない)
  • expression: 評価式を渡します
  • comment: コメントです

変数

typestore_variablenameに変数名、expressionに値を指定します。
expressionはクォートで囲む必要があります。

test_var.yml
- comment: 変数を代入
  provider: python
  type: store_variable
  name: spam
  expression: "'ham'"
- comment: 変数をテスト
  provider: python
  type: assert
  expression: "'$spam' * 2 == 'hamham'" 
$ pytest 
======================================== test session starts =========================================
platform linux -- Python 3.6.7, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
rootdir: /home/driller/work/pytest-play, inifile:
plugins: variables-1.7.1, play-2.2.0
collected 2 items                                                                                    

test_add.yml .                                                                                 [ 50%]
test_var.yml .                                                                                 [100%]

====================================== 2 passed in 0.06 seconds ======================================

requestsを使ったテスト

requestを使ってWebサイトのテストをする場合にはplay_requestsをインストールします。

pip install play_requests

例として、Weather HacksのAPIをテストしてみます。
インストールしたplay_requestsproviderに指定します。
city=040020は宮城県白石市のIDです。pinpointLocationの最初には仙台市西部が入っていることをテストします。

test_weather_hacks.yml
- comment: 白石市の天気
  provider: play_requests
  type: GET
  url: http://weather.livedoor.com/forecast/webservice/json/v1?city=040020
  assert: response.status_code == 200
  variable: json
  variable_expression: response.json()
- comment: "json"
  type: assert
  provider: python
  expression: "variables['json']['pinpointLocations'][0]['name'] == '仙台市西部'"

$ pytest 
======================================== test session starts =========================================
platform linux -- Python 3.6.7, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
rootdir: /home/driller/work/pytest-play, inifile:
plugins: variables-1.7.1, play-2.2.0
collected 3 items                                                                                    

test_add.yml .                                                                                 [ 33%]
test_var.yml .                                                                                 [ 66%]
test_weather_hacks.yml .                                                                       [100%]

====================================== 3 passed in 0.20 seconds ======================================

seleniumを使ったテスト

play_seleniumを使います。
インストール方法は同じですが、別途Webdriverが必要になります。

pip install play_selenium

例としてgoogle.comに検索ワードを入力してみます。

test_google.yml
- comment: Google.comにアクセス
  provider: selenium
  type: get
  url: https://google.com
- comment: 検索ワードを入力
  type: setElementText
  provider: selenium
  locator:
    type: name
    value: q
  text: "cp932撲滅"
- type: sendKeysToElement
  provider: selenium
  locator:
    type: name
    value: q
  text: ENTER
- comment: 画面をじっくり眺める時間
  type: pause
  provider: selenium
  waitTime: 10000
$ pytest 
======================================== test session starts =========================================
platform linux -- Python 3.6.7, pytest-4.3.0, py-1.8.0, pluggy-0.9.0
rootdir: /home/driller/work/pytest-play, inifile:
plugins: variables-1.7.1, splinter-2.0.1, pypom-navigation-2.0.3, play-2.2.0
collected 4 items                                                                                    

test_add.yml .                                                                                 [ 25%]
test_google.yml .                                                                              [ 50%]
test_var.yml .                                                                                 [ 75%]
test_weather_hacks.yml .                                                                       [100%]

===================================== 4 passed in 14.53 seconds ======================================

実行するとブラウザが起動して検索結果の画面が表示されます。

雑感

ざっと使ってみた感想としては、コードを書く手間が省けることよりも、YAMLにすることで見た目がすっきりするというのが利点のように感じました。
紹介していない機能がたくさんありますが、機会があれば紹介したいと思います。

36
44
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?