Numpy(六)制御、テスト

5859 ワード

TDD(Test Driven Development、テストドライバの開発)はソフトウェア開発史上最も重要なマイルストーンの一つである.TDDは主に自動ユニットテストに焦点を当て、テストコードを最大限自動化することを目標としている.コードが変更された場合も、テストを実行して問題をキャプチャできます.すなわち、テストは、既存の機能モジュールに対して依然として有効である.
内容:
ユニットテスト;
断言メカニズム;
浮動小数点数精度.
1、断言関数
ユニットテストでは、通常、テストの構成部分として断言関数が使用されます.数値計算を行う際,2つの近似的に等しい浮動小数点数を比較するという基本的な問題によく遭遇する.整数間の比較は簡単ですが、浮動小数点数はそうではありません.これは、コンピュータの浮動小数点数の表現自体が不正確であるためです.numpy.testingパッケージには,浮動小数点数比較の問題を考慮した実用的なツール関数が多く,前提が成立するかどうかをテストできる.
関数の説明:
assert_almost_equal 2つの数字の近似度が指定精度に達していない場合、異常を投げ出す
assert_approx_equal 2つの数値の近似が指定した有効な数値に達していない場合、異常を放出します.
assert_array_almost_equal 2つの配列の要素の近似度が指定精度に達していない場合、異常を放出します.
assert_array_equal 2つの配列オブジェクトが異なる場合、例外を放出します.
assert_array_lessの2つの配列は形状が一致し、最初の配列の要素が2番目の配列の要素より厳格に小さい必要があります.そうしないと、異常が放出されます.
assert_equal 2つのオブジェクトが異なる場合、例外を放出します.
assert_raises入力したパラメータ呼び出し関数で指定した異常が投げ出されなかった場合、テストは合格しません
assert_warnsが指定した警告を投げ出さなかった場合、テストは合格しません.
assert_string_equalは2つの文字列変数が完全に同じであると断言する
assert_allclose 2つのオブジェクトの近似が指定した許容差限界を超えた場合、例外が放出されます.
import numpy as np
#  NumPy testing   assert_almost_equal                   0.123456789 0.123456780      
# (1)     ,       (    7 ):
print 'Decimal 7',np.testing.assert_almost_equal(0.123456789,0.123456780,decimal=7)
# (2)     ,       (    9 ):
print 'Decimal 9',np.testing.assert_almost_equal(0.123456789,0.123456780,decimal=9)

# (1)     ,          :
print "Significance 8", np.testing.assert_approx_equal(0.123456789,0.123456780,significant=8)
# (2)     ,          :
print "Significance 9", np.testing.assert_approx_equal(0.123456789, 0.123456780,significant=9)

# (1)     ,       :
print "Decimal 8", np.testing.assert_array_almost_equal([0, 0.123456789], [0,0.123456780], decimal=8)
# (2)     ,       :
print "Decimal 9", np.testing.assert_array_almost_equal([0, 0.123456789], [0,0.123456780], decimal=9)


# (1)   assert_allclose  :
print "Pass", np.testing.assert_allclose([0, 0.123456789, np.nan], [0, 0.123456780,np.nan], rtol=1e-7, atol=0)
# (2)   assert_array_equal  :
print "Fail", np.testing.assert_array_equal([0, 0.123456789, np.nan], [0, 0.123456780,np.nan])

# (1)   assert_array_less              :
print "Pass", np.testing.assert_array_less([0, 0.123456789, np.nan], [1, 0.23456780,np.nan])
# (2)   assert_array_less  ,      :
print "Fail", np.testing.assert_array_less([0, 0.123456789, np.nan], [0, 0.123456780,np.nan])

#   assert_equal  :
print "Equal?", np.testing.assert_equal((1, 2), (1, 3))

# (1)   assert_string_equal  ,           。  ,      :
print "Pass", np.testing.assert_string_equal("NumPy", "NumPy")

# (2)   assert_string_equal  ,                            。        :
print "Fail", np.testing.assert_string_equal("NumPy", "Numpy")


# (1)   finfo        :
eps = np.finfo(float).eps
print "EPS", eps

# (2)   assert_array_almost_equal_nulp              1.0 1.0+ eps(epsilon),   1.0 + 2 * eps      :
print "1",
np.testing.assert_array_almost_equal_nulp(1.0, 1.0 + eps)
print "2",
np.testing.assert_array_almost_equal_nulp(1.0, 1.0 + 2 * eps)

# (1)   finfo        :
eps = np.finfo(float).eps
print "EPS", eps

# (2)     “    ”        ,       assert_array_max_ulp      maxulp   :
print "1", np.testing.assert_array_max_ulp(1.0, 1.0 + eps)
print "2", np.testing.assert_array_max_ulp(1.0, 1 + 2 * eps, maxulp=2)

2、ユニットテスト
ユニットテストは、コードの一部を自動化してテストするユニットであり、通常は関数または方法である.Pythonにはユニットテスト用のPyUnit API(アプリケーションプログラムインターフェース)があります.
import numpy
import unittest

def factorial(n):
    if n == 0:
        return 1

    if n < 0:
        raise ValueError, "Don't be so negative"

    return numpy.arange(1, n+1).cumprod()

class FactorialTest(unittest.TestCase):
    def test_factorial(self):
        #  3       ,     
        self.assertEqual(6, factorial(3)[-1])
        numpy.testing.assert_equal(numpy.array([1, 2, 6]), factorial(3))

    def test_zero(self):
        #  0       ,     
        self.assertEqual(1, factorial(0))

    def test_negative(self):
        #            ,      
        #          ValueError     ,         IndexError     
        self.assertRaises(IndexError, factorial(-10))

if __name__ == '__main__':
    unittest.main()
実行:
.E.
======================================================================
ERROR: test_negative (__main__.FactorialTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/Python_Opencv/Test/One/func.py", line 598, in test_negative
    self.assertRaises(IndexError, factorial(-10))
  File "C:/Users/Administrator/Desktop/Python_Opencv/Test/One/func.py", line 581, in factorial
    raise ValueError, "Don't be so negative"
ValueError: Don't be so negative

----------------------------------------------------------------------
Ran 3 tests in 0.013s

FAILED (errors=1)

noseとテスト装飾器:
鼻(nose)は口の上に生えている器官で、人や動物の呼吸や嗅ぎはそれに依存している.NoseはPythonフレームワークでもあり、テストが容易になります.noseはテストコードを組織するのに役立ちます.noseの文書によれば、「testMatch正規表現(デフォルトでは(?:^|[b_.-])[Tt]est)に一致するPythonソースファイル、フォルダ、ライブラリは、テスト用に収集されます」.Noseは装飾器(decorator)を十分に利用しています.Python装飾器は一定の意味を持つ関数や方法に対する注釈である.numpy.testingモジュールにはアクセサリーがたくさんあります.アクセサリーの説明
numpy.testing.decorators.deprecatedテストの実行時に期限切れの警告をフィルタリング
numpy.testing.decorators.knownfailureif条件に従ってKnownFailureTest異常を放出
numpy.testing.decorators.setastest関数をテスト関数または非テスト関数としてマークする
numpy.testing.decorators. skipif条件によりSkipTest異常を投げ出す
numpy.testing.decorators.slowテスト関数を「遅い実行」とマーク
参照先:http://python.jobbole.com/81683/
            https://www.zhihu.com/question/26930016