1. ホーム
  2. python

[解決済み】pytestでコンソールに印刷する方法は?

2022-02-16 14:44:16

質問内容

でTDD(テスト駆動開発)を行おうとしています。 pytest . pytest はないでしょう print を使用すると、コンソールに print .

を使っています。 pytest my_tests.py を実行してください。

は、その documentation は、デフォルトで動作するはずだと言っているようです。 http://pytest.org/latest/capture.html

でも

import myapplication as tum

class TestBlogger:

    @classmethod
    def setup_class(self):
        self.user = "alice"
        self.b = tum.Blogger(self.user)
        print "This should be printed, but it won't be!"

    def test_inherit(self):
        assert issubclass(tum.Blogger, tum.Site)
        links = self.b.get_links(posts)
        print len(links)   # This won't print either.

標準出力コンソールには何も出力されません(通常の進行状況と、いくつのテストがパスしたか/失敗したかだけです)。

そして、私がテストしているスクリプトには、printが含まれています。

class Blogger(Site):
    get_links(self, posts):
        print len(posts)   # It won't get printed in the test.

unittest モジュールでは、デフォルトですべてが印刷されます。これはまさに私が必要としていることです。しかし、私は pytest というのは、他の理由からです。

print文が表示されるようにする方法をご存知の方はいらっしゃいますか?

どのように解決するのですか?

デフォルトでは py.test は標準出力結果をキャプチャし、どのように出力するかを制御できるようにします。もしそうしなければ、どのようなテストがそのテキストを出力したかという文脈なしに、たくさんのテキストが吐き出されることになります。

しかし、テストが失敗した場合、結果のレポートに、その特定のテストで標準出力に何が出力されたかを示すセクションが含まれることになります。

例えば

def test_good():
    for i in range(1000):
        print(i)

def test_bad():
    print('this should fail!')
    assert False

結果は以下のように出力されます。

>>> py.test tmp.py
============================= test session starts ==============================
platform darwin -- Python 2.7.6 -- py-1.4.20 -- pytest-2.5.2
plugins: cache, cov, pep8, xdist
collected 2 items

tmp.py .F

=================================== FAILURES ===================================
___________________________________ test_bad ___________________________________

    def test_bad():
        print('this should fail!')
>       assert False
E       assert False

tmp.py:7: AssertionError
------------------------------- Captured stdout --------------------------------
this should fail!
====================== 1 failed, 1 passed in 0.04 seconds ======================

注意 Captured stdout の部分を削除します。

を表示させたい場合は print ステートメントが実行されるときに -s フラグを py.test . ただし、この場合、解析が困難になることがあるので注意が必要です。

>>> py.test tmp.py -s
============================= test session starts ==============================
platform darwin -- Python 2.7.6 -- py-1.4.20 -- pytest-2.5.2
plugins: cache, cov, pep8, xdist
collected 2 items

tmp.py 0
1
2
3
... and so on ...
997
998
999
.this should fail!
F

=================================== FAILURES ===================================
___________________________________ test_bad ___________________________________

    def test_bad():
        print('this should fail!')
>       assert False
E       assert False

tmp.py:7: AssertionError
====================== 1 failed, 1 passed in 0.02 seconds ======================