Pytestの簡単なTips
Pytest の Tips
完全に自分用メモレベルで書いておく。普段開発をしていて、こういうことできないかな、と思ったことを調べた結果をまとめておくだけ。
特定のテストクラスのみ実行したい
普段 unittest
ベースのテストの書き方をしているので、テストメソッドはクラスに属している。なのでこのクラスのテストのみ実行したいことはたまにある。これはコマンドラインからクラスを指定するだけでいい。
たとえば、次のようなテストファイル test_file.py
という名前で存在しているとしよう。
import unittest
class TestFoo(unittest.TestCase):
def test_foo(self):
self.assertEqual(1, 1)
class TestBar(unittest.TestCase):
def test_bar(self):
self.assertEqual(1, 1)
このとき、次のようにクラスを test_file.py::<class_name>
という形で指定すれば指定のクラスのテストだけ実施できる。
$ pytest path/to/test_file.py::TestFoo
上の例の場合は TestFoo
に属している test_foo
メソッドで定義されているテストのみ実行される。
特定のメソッドのみ実行したい
ひとつのクラスに複数のテストが存在していて、だいたいひとつ失敗すると全部失敗する(そして失敗するのも成功するのもそれなりに時間がかかる)ので、成功するか失敗するのかわからない場合はひとつだけ実行したい、という状況があった。
こんなときは mark
をつける。テストファイルを下記のように用意をする。
import unittest
import pytest
class TestFoo(unittest.TestCase):
def test_foo(self):
self.assertEqual(1, 1)
@pytest.mark.foo
def test_foo2(self):
self.assertEqual(2, 2)
class TestBar(unittest.TestCase):
def test_bar(self):
self.assertEqual(1, 1)
この @pytest.mark.foo
で foo
というマークがついた状態になっている。pytest
コマンドの -m
オプションでこの foo
マークを指定する。
$ pytest -m foo test_file.py
============================================================ test session starts ============================================================
platform darwin -- Python 3.6.5, pytest-3.8.1, py-1.6.0, pluggy-0.7.1
rootdir: /Users/hikaru/blogs/tech-memo, inifile:
collected 3 items / 2 deselected
hoge.py . [100%]
================================================== 1 passed, 2 deselected in 0.02 seconds ===================================================
この collected 3 items / 2 deselected
のように、 1 つだけが選択される。つまりこの foo
マークがついているテストのみが実行されたことになる。
ちなみにクラスをまたいでも、同じマーク(ここでは foo
)をつければ同時に実行できる。
Warning summary を消す
Warning は基本消すべきではないが、ものによっては大量の警告が出てエラーの内容がわからないほど出てしまうこともある。
ということで Warning Summary を出さないようにしたいが、これは -p no:warnings
オプションを指定すればよい。
$ pytest -p no:warnings path/to/test_file.py