shivency

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1、一直在纠结编译器是如何找到所要导入的module的;类似于math这些已有的module可以在/Libs/site-package里导入,而自己定义的模块呢

而后发现在pydev下同一源文件下的模块可以直接导入- -

 

2、练习

1)

 1 import math
 2 
 3 a = math.fabs(-4.3)         #4.3
 4 b = math.sin(34.5)          #0.0574874781049
 5 c = math.floor(-4.3)        #-5.0
 6 d = math.ceil(-4.3)         #-4.0
 7 e = math.ceil(4.1)          #5.0
 8 
 9 
10 help(math.floor)
11 help(math.ceil)


  几个挺有用的math函数。

  顺便:假如想找math.ceil()的作用,在help(math)中找ceil的作用可以,直接help(math.ceil)也可以。[当然,在导入模块后才能使用help() - -]

 1 Help on built-in function floor in module math:
 2 
 3 floor(...)
 4     floor(x)
 5     
 6     Return the floor of x as a float.
 7     This is the largest integral value <= x.
 8 
 9 Help on built-in function ceil in module math:
10 
11 ceil(...)
12     ceil(x)
13     
14     Return the ceiling of x as a float.
15     This is the smallest integral value >= x.


2)自己编写help

  上述的help是库函数内的,假如自己要为自己写的模块写help呢?

  这是我的文件树,可以看下/src下有两个.py,其中一个为自定义的模块,另一个为测试文件。

    

 

代码:

 1 #test.py
 2 
 3 import test_module
 4 help(test_module)
 5 
 6 
 7 #test_module.py
 8 
 9 def to_celsius(t):
10     '''it is a function'''
11     return (t - 32.0) * 5.0 / 9.0

而后的显示:

 1 Help on module test_module:
 2 
 3 NAME
 4     test_module
 5 
 6 FILE
 7     c:\users\dsdn\workspace_python\test\src\test_module.py
 8 
 9 FUNCTIONS
10     to_celsius(t)
11         it is a function


test_module.py中的三引号中的内容已经可以显示在help()中了

 

3)代码测试

  使用nose模块来测试代码——python自带库unittest也可以,以后我试着写下。

源码【平时测试时最好不要只写一条assert(line 8),写多种特殊结果保证测试】

 1 #test.py
 2 
 3 import nose
 4 from test_module import to_celsius
 5 #import test_module
 6 
 7 def test_to_celsius():      #def test_to_celsius(t):
 8     assert to_celsius(32) == 34
 9 
10 if __name__ == '__main__':
11     nose.runmodule()
12 
13 #test_module.py
14 
15 def to_celsius(t):
16     '''it is a function'''
17     return (t + 1)

为了方便些写测试,我把to_celsius()这个函数的return 改为简单的 t+1 了。

几点需要注意:

1、要使用line 4的导入而非line 5的导入,不然会报错

 1 E
 2 ======================================================================
 3 ERROR: __main__.test_to_celsius
 4 ----------------------------------------------------------------------
 5 Traceback (most recent call last):
 6   File "C:\Python27\lib\site-packages\nose\case.py", line 197, in runTest
 7     self.test(*self.arg)
 8   File "C:\Users\dsdn\workspace_python\test\src\test.py", line 10, in test_to_celsius
 9     assert to_celsius(32) == 34
10 NameError: global name 'to_celsius' is not defined
11 
12 ----------------------------------------------------------------------
13 Ran 1 test in 0.001s
14 
15 FAILED (errors=1)

line 10指出函数to_celsius 这个未定义。

使用line 4也可以,不过测试的时候得具体指出(line 8处)

assert test_module.to_celsius(32) == 34


2、line 7处,不要使用注释掉的函数,即测试函数不能接受参数。

 

3、其实这段代码执行起来会报错。

 1 F
 2 ======================================================================
 3 FAIL: __main__.test_to_celsius
 4 ----------------------------------------------------------------------
 5 Traceback (most recent call last):
 6   File "C:\Python27\lib\site-packages\nose\case.py", line 197, in runTest
 7     self.test(*self.arg)
 8   File "C:\Users\dsdn\workspace_python\test\src\test.py", line 10, in test_to_celsius
 9     assert test_module.to_celsius(32) == 34
10 AssertionError
11 
12 ----------------------------------------------------------------------
13 Ran 1 test in 0.001s
14 
15 FAILED (failures=1)


我已经贴了两个报错的调试信息,不同的是,第一个为 NameError, 提示为E;第二个报错为AssertionError,提示为F。

原因,就是我故意把“assert test_module.to_celsius(32) == 33“写成”assert test_module.to_celsius(32) == 34“了= =

 

测试代码执行后会得出下列三种结果之一:

1、Pass,即实际值与期望值相符;

2、Error,即测试本身出了问题,代码中有bug,就像import module之后调用方法得module.method;

3、Fail,即实际值与期望值不符。

 

4、关于AssertionError

  assert test_module.to_celsius(32) == 34, ‘wrong’

我们可以通过这样显示报错信息,这里只是随手写了一个wrong,以后具体情况具体提示。

 

4)关于测试的练习

  这本书有一点,有很多开放性题目,而我往往回答不上来- -

sorry for no conments :(

 1 #test.py
 2 
 3 import nose
 4 from test_module import distance
 5 
 6 def close(left, right):
 7     return abs(left - right) < 1.0e-6
 8 
 9 def test_distance():
10     assert close(distance(1.0, 0.0, 1.0, 0.0), 0.0), 'Identical points fail.'
11     assert close(distance(0.0, 0.0, 1.0, 0.0), 1.0), 'Unit distance fail.'
12     
13 
14 if __name__ == '__main__':
15     nose.runmodule()
16 
17 #test_module.py
18 
19 import math
20 
21 def distance(x0, y0, x1, y1):
22     return math.sqrt((x1 - x0) ** 2 + (y1 - y0) **2 )

简单来说,就是测两点间距离的。

Q1:test_module.py中,函数返回一浮点数,说明为什么这样会使测试变得更加困难。【私以为是浮点数比较麻烦,浮点数的比较,计算,存储什么的挺复杂】

Q2:test.py中,这样的测试有哪几个缺点【我觉得挺好,要说不足,测试太少,加个distance(0.0, 0.0, 0.0, 0.0)的测试如何?】

 

 

 

 

  

 

 

 

posted on 2013-06-27 18:37  shivency  阅读(300)  评论(0编辑  收藏  举报