分享

初试nose

 昵称21368145 2015-03-16

        阅读《Practical Programming -An Introduction to Computer Science Using Python》一书时,在第4章提到了使用Nose对Python代码进行测试,因而小试牛刀了一下。


---------------------------------------------------------------------------------------------------------


安装


        正常情况下,安装步骤如下:




  • 首先,下载:setuptools-->安装   
  • 其次,打开cmd-->进入命令提示行,此时保持电脑可以上外网,在命令提示行中输入 C:\Python27\Scripts\easy_install nose 回车,此时会从网上自动下载东西,不用管它,Nose会自动安装完成。

           注:这里的C:\Python27,是指python所在的文件夹,如果不同可以更改!



        


        但是,现在我这里有两个问题:




  1. 我安装的是python3.3,但是setuptools没有支持3.3的官方版本
  2. 待我安装了python2.7和setuptools-py2.7后,按照上述方法在线安装nose时,又一直卡在那“reading xxx”,半天没反应(难道是我网速原因?)

        没办法,只有去找别的安装nose的方法,于是找到了这篇博文,介绍的安装的方法不是通过setuptools在线安装,而是如下:



  • 下载nose包,于是我下了一个支持python3.3的nose1.2.1
  • 把下载的在python安装路径\Lib\site-packages下加压,必须把加压目录下的‘nose'文件夹放在 \Lib\site-packages路径下
  • 点击setup


        按此步骤试了,不过setup后却提示安装error了,运行如下代码测试时果然有问题:

  1. import nose  
  2. from temperature import to_celsius  
  3.   
  4. def test_roundoff ():  
  5.     '''''Test that roundoff works'''  
  6.     assert to_celsius(100) == 38'Returning an unrounded result' #not 37.77...  
  7.   
  8. if __name__ == "__main__":  
  9.     nose.runmodule()  

        运行后提示:

  1. Traceback (most recent call last):  
  2.   File "test_temperature.py", line 29in <module>  
  3. AttributeError: 'module' object has no attribute 'runmodule'  




        网上找了半天还是没找到啥问题,也是是nose就没安装上。没办法,只好从头再来,到了晚上用上面说的正常情况下的安装步骤进行安装,这次竟然成功了~ 不过是安装python2.7版本的nose。

---------------------------------------------------------------------------------------------------------

使用


        本次使用主要是用书上的例子进行的测试。测试文件的名字以“test”开始,Nose运行时,它会自动寻找以“test”开始的文件。每个Nose测试模块都应该包含以下内容:



  • 用于引入Nose及待测模块的语句
  • 实际用于测试我们模块的函数
  • 用于触发那些测试函数的函数的调用

        测试函数的名称也必须以“test”开头。

        待测模块temperature.py代码如下:

  1. def to_celsius (t):  
  2.     return round ( (t-32.0)*5.0/9.0 )  
  3.   
  4. def above_freezing (t):  
  5.     return t>0  
        

        测试模块test_temperature.py代码如下:




  1. import nose  
  2. from temperature import to_celsius  
  3. from temperature import above_freezing  
  4.   
  5. def test_above_freezing ():  
  6.     '''''Test above_freezing '''  
  7.     assert above_freezing(89.4), 'A temperature above freezing'  
  8.     assert not above_freezing(-42), 'A temperature below freezing'  
  9.     assert not above_freezing(0), 'A temperature at freezing'  
  10.   
  11. def test_boiling ():  
  12.     '''''Test boiling point'''  
  13.     assert to_celsius(212) == 100  
  14.   
  15. def test_roundoff ():  
  16.     '''''Test that roundoff works'''  
  17.     assert to_celsius(100) == 38'Returning an unrounded result'   #not 37.77...  
  18.   
  19. if __name__ == "__main__":  
  20.     nose.runmodule()  
        

        上面这段代码执行之后,每个测试都会得出以下三种结果之一:



  • 通过(pass)。实际值跟期望值相符。
  • 失败(fail)。实际值跟期望值不相符。
  • 出错(error)。测试本身出了问题;也就是说,测试代码中含有bug。在这种情况下,测试将无法告诉我们任何有关被测系统的信息。


        上面的函数test_above_freezing中有3条assert语句,但Nose还是会认为这只是一个测试,这是因为,对Nose而言,每个函数就是一个测试,一个函数想要测试多少东西那是函数自己的事情。这样有个缺点就是当其中的某个断言失败时,python就会立即停止执行它所在的函数。也就是说,如果test_above_freezing中的第一个测试就失败了,我们将无法得到其他测试的任何信息。因此通常的做法是编写许多小的测试函数,分别只测试少量的东西,而不是在其中放上一大堆各种各样的断言。

---------------------------------------------------------------------------------------------------------

参考


1. 《Practical Programming -An Introduction to Computer Science Using Python











    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多