Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
14
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

Organization

pytestメモ

前回の投稿でタグにpytestと書いておきながら「pytest使ってます」しか書いてなかったので、忘備録的なものを。

準備

pip install pytest
pip install pytest-django
pip install pytest-pythonpath

あとはpytest用のsettingsファイルを作成。

基本

test_hoge.pyというファイルを作成して

test_hoge.py
import pytest

@pytest.mark.django_db(transaction=True)
def test_hoge(self):
  result = foo.get_money(id=1)
  assert result == 100

そして

py.test test_hoge.py --create-db(もしくは--reuse-db)

でテストを実行。ファイル名でなく、ディレクトリを指定するとそのディレクトリ内のテストすべてを実行します。
メソッド名の「test_」を取るとそのテストは実行しません。

よく使うもの

テスト用のファイルに記述されているテストすべてに対して、実行する前にこのsetup()が行われます。
よくやるのはユーザ作成とか、テストの前準備の処理。

setup()

def setup(self):
  hoge()

teardown()

各テストの終了時に実行する処理を記述します。
setup()でマスタデータをテスト用のデータに置き換えてテストをした場合、元に戻す処理を入れてます。

def teardown():
  foo()

pytest.raises(Exception)

例外がきちんと発生しているかチェックするときに使います。
Exceptionが発生すればテストは正常結果が返ります。

hoge.py
[テスト対象]
class Hoge():
  def foo(id):
    try:
      return ItemMaster.get(id)
    except DoesNotExist:
      raise IllegalIdError
test_hoge.py
import pytest
import IllegalIdError

@pytest.mark.django_db(transaction=True)
def test_foo():
  with pytest.raises(IllegalIdError):
    Hoge.foo(-100000)

pytest.mark.skipif("条件")

条件を指定してテストをスキップさせます。
テストを実行した際にスキップされると結果に「s」が表示されるので、メソッド名の「test_」を取って実行させないよりも「テストが行われなかった」というのが分かりやすいです。

test_hoge.py
@pytest.mark.skipif("True")
def test_hoge(self):
  assert is_hoo(id=1)

↑この場合は必ずスキップされます。

Why not register and get more from Qiita?
  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
14
Help us understand the problem. What are the problem?