8

noseを使用して単体テストを作成していますが、関数が警告を発するかどうかを確認したいと思います(関数はを使用しますwarnings.warn)。これは簡単にできることですか?

4

2 に答える 2

9
def your_code():
    # ...
    warnings.warn("deprecated", DeprecationWarning)
    # ...

def your_test():
    with warnings.catch_warnings(record=True) as w:
        your_code()
        assert len(w) > 1

もちろん、長さを確認するだけでなく、詳細に確認することもできます。

assert str(w.args[0]) == "deprecated"

Python 2.7以降では、次のように最後のチェックでこれを行うことができます。

assert str(w[0].message[0]) == "deprecated"

于 2010-08-27T19:41:26.763 に答える
1

これを行うには(少なくとも)2つの方法があります。テスト中のので警告をキャッチするかlist、モジュールにインポートされたものに使用できます。warnings.WarningMessagemockpatchwarnings

patchバージョンはもっと一般的だと思います。

raise_warning.py:

import warnings

def should_warn():
    warnings.warn('message', RuntimeWarning)
    print('didn\'t I warn you?')

raise_warning_tests.py:

import unittest
from mock import patch
import raise_warning

class TestWarnings(unittest.TestCase):

    @patch('raise_warning.warnings.warn')
    def test_patched(self, mock_warnings):
        """test with patched warnings"""
        raise_warning.should_warn()
        self.assertTrue(mock_warnings.called)

    def test_that_catches_warning(self):
        """test by catching warning"""
        with raise_warning.warnings.catch_warnings(True) as wrn:
            raise_warning.should_warn()
            # per-PEP8 check for empty sequences by their Truthiness 
            self.assertTrue(wrn) 
于 2015-08-19T07:30:40.153 に答える