Numpy(六)控制、测试

2021-01-06 17:47:17 浏览数 (1)

参考链接: Python中的numpy.less_equal

TDD(Test Driven Development,测试驱动的开发)是软件开发史上最重要的里程碑之一。TDD主要专注于自动单元测试,它的目标是尽最大限度自动化测试代码。如果代码被改动,我们仍可以运行测试并捕捉可能存在的问题。换言之,测试对于已经存在的功能模块依然有效。 

        内容:  

  单元测试; 

  断言机制; 

  浮点数精度。 

 1、断言函数

        单元测试通常使用断言函数作为测试的组成部分。在进行数值计算时,我们经常遇到比较两个近似相等的浮点数这样的基本问题。整数之间的比较很简单,但浮点数却非如此,这是由于计算机对浮点数的表示本身就是不精确的。numpy.testing包中有很多实用的工具函数考虑了浮点数比较的问题,可以测试前提是否成立。  

        函 数 描 述:  

 assert_almost_equal 如果两个数字的近似程度没有达到指定精度,就抛出异常 

 assert_approx_equal 如果两个数字的近似程度没有达到指定有效数字,就抛出异常 

 assert_array_almost_equal 如果两个数组中元素的近似程度没有达到指定精度,就抛出异常 

 assert_array_equal 如果两个数组对象不相同,就抛出异常 

 assert_array_less 两个数组必须形状一致,并且第一个数组的元素严格小于第二个数组的元素,否则就抛出异常 

 assert_equal 如果两个对象不相同,就抛出异常 

 assert_raises 若用填写的参数调用函数没有抛出指定的异常,则测试不通过 

 assert_warns 若没有抛出指定的警告,则测试不通过 

 assert_string_equal 断言两个字符串变量完全相同 

 assert_allclose 如果两个对象的近似程度超出了指定的容差限,就抛出异常 

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(Application Programming Interface,应用程序编程接口)。  

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

0 人点赞