结对编程2--单元测试

小组成员:郑莹   201421123097

          林清青  201421123095

代码地址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类中定义的方法。
  1. 通过单元测试代码,测试加法是否能正确工作;
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” 又怎么处理呢?

覆盖率:

import coverage
cov = coverage.coverage()
cov.start()
# .. run your code jaja.py..
cov.stop()
cov.save()

 

三、小结与感受

  • 通过测试,是否有效发现了程序计算模块的问题,并给予改进?

是的。这是第一次对已经完成的代码进行测试处理,一开始十分生疏。按照要求,我们将计算部分单独分开成一个类进行测试,这样工作量小了一点。然后我们通过老师给的框架和网上的一些资料,运用python中自身有的测试模块,对计算部分的代码进行了测试。一开始,引入unittest模块时并不是很顺利,不断修改后渐入佳境。我们对计算模块主要考虑的就是随机生成式的输入错误、除数为0的非法错误等,我们还设置了在出现这些错误时,对用户进行相应错误的提示语,同时也对代码出现的一些不成熟的地方做了相应的改进。

  • 在隔了一周之后再看之前的代码,是否更能体会到下面这些东西
            (1) 良好的设计
    • 设计对于程序来说是最为关键的,就像是房子的地基。无论房子建的多好,但如果地基不稳固,依旧面临这一夜崩塌的危险。测试环节就是对之前程序设计的一种检验,通过测试就能够很清楚的看出之前所设计程序的漏洞,并且及时的进行改进。
    • (2) 编码规范

 以前编写代码时常常不注意代码的规范使用,认为只要自己能看得懂,程序能够正常运行即可。但是,结对编程以后,编码不规范就会有很多的麻烦,队员看不懂各自代码的含义,时间长了,对原先代码进行修改时,也需要多花些时间进行理解。在以后的编程中会多加注意代码的规范性。

      (3) 必要的注释

在编码时,注释也是十分重要的。尤其是过一段时间再看之前所写的代码,有了注释不仅能够方便自己查找,也能够让他人一下子看出这段代码所需要实现的功能,方便提出建议和进行改进。

四、结对过程及照片

五、psp

SP2.1 Personal Software Process Stages Estimated time(h) actual time(h)
Planning 计划 4 3
· Estimate 估计这个任务需要多少时间 10 11
Development 开发 9.5 8
· Analysis 需求分析 (包括学习新技术) 1 0.5
· Coding Standard 代码规范 0.5 1
· Design 具体设计 2 1.5
· Coding 具体编码 3 2.5
· Code Review 代码复审 1 1.5
· Test 测试(自我测试,修改代码,提交修改) 2 1
Reporting 报告 1 2.5
posted on 2017-03-29 14:00  郑莹  阅读(195)  评论(1编辑  收藏  举报