LoginSignup
17
15

More than 5 years have passed since last update.

前回の投稿でタグに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)

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

17
15
0

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
17
15