小组成员: 林清青 201421123095
郑 莹 201421123097
代码地址:https://coding.net/u/zy97/p/pp2/git/tree/master/
一、测试需求分析
a.把计算模块提取出来,单独创建一个类。
b.针对提取出来的计算类的接口函数做单元测试.
c.测试相关单元模块运算错误:
输入错误。例如:“1 ++ 2”的随机算式,或者“*”“/”在第一个的错误算式。
除数为0的非法表达式错误。例如:除数为0的错误算式。
向用户提示错误类型。
二、测试框架
Python语言的开发人员可以使用Steve Purcell编写的PyUnit作为单元测试框架,通过将单元测试融合到PyUnit这一测试框架里,Python程序员可以更容易地增加、管理、执行测试用例,并对测试结果进行分析。此外,使用PyUnit还可以实现自动单元测试(回归测试)
我们在采用PyUnit这一单元测试框架后,用于测试的代码做了相应的改动:
用import语句引入unittest模块。
让所有执行测试的类都继承于TestCase类,可以将TestCase看成是对特定类进行测试的方法的集合。
在setUp()方法中进行测试前的初始化工作,并在tearDown()方法中执行测试后的清除工作,setUp()和tearDown()都是TestCase类中定义的方法。
通过单元测试代码,测试加法是否能正确工作。
def test_add(self): startnum=0 rightnum=0 countnum = int( input("请输入你想做的题数:") ) for startnum in range(0,countnum): r1=random.randint(0,99) r2=random.randint(1,99) r3=random.randint(0,99) r4=random.randint(1,99) shu1= random.randint(0,99) #or Fraction(r1, r2) shu2= 5 random.randint(0,99) #h1=str((shu1))+random.choice('-+*/')+str(shu2) #print random.choice('-+*/') fuhao=random.choice('+') h2=str((shu1))+fuhao+'('+str((shu2))+')' h3=h2+'=' print h3 h4=str(float(shu1))+fuhao+'('+str(float(shu2))+')' biaozhun=eval(h4) answer = raw_input("请输入你的答案:") right=float('%.3f'%biaozhun) if answer.find('/')!=-1: #answer2=float(answer) #print "ddddddddddddd" reg=r'(.+)/' first=re.findall(reg,answer) y=str(first) k=y.replace('\'', '') x=str(k) x1=x.replace('[', '') x2=str(x1) x3=x2.replace(']', '') x4=str(x3) x5=x4.replace('\"','') ss=str(x5) #o=eval(ss+"'") #print str(ss) firstnum= float(ss) #print firstnum #namelist=re.findall(name) #print name reg1=r'/(.+)' last=re.findall(reg1,answer) y1=str(last) k1=y1.replace('\'', '') x1=str(k1) x2=x1.replace('[', '') x3=str(x2) x4=x3.replace(']', '') x5=str(x4) x6=x5.replace('\"','') ss1=str(x6) #o=eval(ss+"'") #print str(ss1) lastnum= float(ss1) #print lastnum #namelist=re.findall(name) #print name #firstnum=eval(reg) #lastnum=eval(reg1) answer5=firstnum/lastnum #print 'rrrrrrrrrrr' print answer5 if right==float('%.3f'%answer5): print "你的答案正确!" rightnum=rightnum+1 else : print "你的答案错误,正确的答案为" print float('%.3f'%biaozhun) else: answer2=float(answer) #print "ssssssssssssss" if right==float('%.3f'%answer2): print "你的答案正确!" rightnum=rightnum+1 else: print "你的答案错误,正确的答案为" print float('%.3f'%biaozhun) #print h1 print "命中率为" print rightnum print countnum
测试截图:
2.通过单元测试代码,测试加减乘除功能。(代码详见coding)
3.通过单元测试代码,测试计算类对于各种参数的支持
输入错误。例如:“1 ++ 2”的随机算式,或者“*”“/”在第一个的错误算式。
除数为0的非法表达式错误
向用户提示错误类型,总共测试了六个模块:
告诉函数的调用者 “你错了”? 把返回的字符串定义为 “-1” 来表示?
如果真的计算结果是 “-1” 又怎么处理呢?
覆盖率:
三、小结与感受
通过测试,是否有效发现了程序计算模块的问题,并给予改进?
首先一开始的时候我觉得单元测试并没有用,但是经过一晚上的测试我不仅学会使用pyunit,而且明白了一个真正的软件的产生是怎么样的一个过程。而且在这个过程中我不仅对这些代码更加熟悉、更理解这个框架,更具有条理性。
感受:
对于这次结对编程的作业我知道了单元测试的意义。我也遇到一些问题,例如我不明白单元的测试的意义在哪里,因为Python中有太多的单元测试框架和工具,什么unittest, testtools, subunit, coverage, testrepository, nose, mox, mock, fixtures, discover,再加上setuptools, distutils等等这些,先不说如何写单元测试,光是怎么运行单元测试就有N多种方法,再因为它是测试而非功能,是很多人没兴趣触及的东西,起初我也是如此想的。但是经过这次编程我明白了单元测试的重要性,明白了一个TestCase的实例就是一个测试用例。
四、结对过程及照片
五、 psp
SP2.1 | Personal Software Process Stages | Estimated time(h) | actual time(h) |
Planning | 计划 |
3
|
2 |
· Estimate | 估计这个任务需要多少时间 | 12 | 12 |
Development | 开发 | 9 | 5 |
· Analysis | 需求分析 (包括学习新技术) | 2 | 0.5 |
· Coding Standard | 代码规范 | 0.5 | 1 |
· Design | 具体设计 | 1 | 1.5 |
· Coding | 具体编码 | 2 | 3 |
· Code Review | 代码复审 | 1.5 | 1 |
· Test | 测试(自我测试,修改代码,提交修改) | 1 | 1 |
Reporting | 报告 | 2 | 1 |