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.foofoo というマークがついた状態になっている。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

参考