在没有任何返回值的非OOP代码上运行单元测试

时间:2018-07-16 20:27:34

标签: python unit-testing oop testing python-unittest

我有这种形式的脚本,可以在程序中调用(从另一个类似的函数)。我需要使用unittest模块为此功能编写测试。

  • 它不返回任何东西,但会改变很多全局变量
  • 需要输入
  • 我现在无法将其更改为OOP代码
  • 我想测试更改某个全局变量的情况,看看TOTFRAC是否为正。 我已经阅读了针对OOP代码的测试,在其中我将每个变量都称为对象参数,但是如果我的代码不是面向对象的,该怎么办。

注意:我已经删除了很多代码行,因为它很长,所以事情可能没有任何意义

import numpy
import math
def SETUP(LAST):
    def GOTO999():
        print(' ERROR IN GAS INPUT : NGAS=',NGAS,'\n')
        for J in range(1,6):
            # print(J)
            print(' N=',J,' NGAS=',NGASN[J],' FRAC=',FRAC[J])
        LAST=1                                                            
        return
    # A lot of globals
    # Initialising variables 
    NBREM=[]
    EBRTOT=[]
    for K in range(1,6):
        NBREM.append(0)
        EBRTOT.append(0.0)


    NGAS=int(input('NGAS'))
    NEVENT=int(input('NEVENT'))
    IMIP=int(input('IMIP'))
    NDVEC=int(input('NDVEC'))
    NSEED=int(input('NSEED'))
    ESTART=float(input('ESTART'))
    ETHRM=float(input('ETHRM'))
    ECUT=float(input('ECUT'))
    ICOUNT=0
    if(IMIP == 1):
        ICOUNT=1 
    if(NGAS == 0):
        LAST=1
        return  
    if(ESTART > 3.0*(10**6) and IMIP == 3):
        print(' SUBROUTINE STOPPED: X-RAY ENERGY=','%.3f' % ESTART,'EV. MAXIMUM ENERGY 3.0MEV')
        sys.exit() 

    if(IMIP != 1 and NEVENT > 10000):
        print(' SUBROUTINE STOPPED: NUMBER OF EVENTS =',NEVENT,' LARGER THAN ARRAY LIMIT OF 10000')
        sys.exit()


    NGASN=[]
    for i in range(1,6):
        NGASN.append(int(input('NGASN'+str(i))))

    FRAC=[]
    for i in range(1,6):
        FRAC.append(round(float(input('FRAC')),4))               
    TEMPC=round(float(input('TEMPC')),4)                         
    TORR=round(float(input('TORR')),4)                           


    # more inputs 
    if(IWRITE != 0):
        outputfile=open("DEGRAD.OUT","w")
    EBIG=0.05*ESTART/1000. 
    EFINAL=ESTART*1.0001+760.0*EBIG/TORR*(TEMPC+ABZERO)/293.15*EFIELD
    if(EFINAL < (1.01*ESTART)):
        EFINAL=1.01*ESTART 
    #   CHECK INPUT
    TOTFRAC=0.00
    if(NGAS == 0 or NGAS > 6):
            GOTO999()
    for J in range(1,NGAS):
        print('J',J)
        if(NGASN[J]== 0 or FRAC[J] == 0.00):
            GOTO999()
        TOTFRAC=TOTFRAC+FRAC[J]

    if(abs(TOTFRAC-100.00)> 1*(10**-6)):
        print(TOTFRAC)
        GOTO999()
    if(NDVEC): #22594
        PHI=0
        THETA=0
    elif(NDVEC==-1):
        PHI=0
        THETA=numpy.arccos(-1)
    elif(NDVEC==0):
        PHI=0.0
        THETA=API/2.0
    elif(NDVEC==2):
        R3=DRAND48(0.0,1.0)
        PHI=TWOPI*R3
        R4=DRAND48(1.5, 1.9)
        THETA=numpy.arccos(1.0-2.0*R4)
    else :
        print('DIRECTION OF BEAM NOT DEFINED NDVEC =',NDVEC)
        sys.exit()

    if(NSEED != 0):
        RM48(NSEED,0,0)                           
    CORR=ABZERO*TORR/(ATMOS*(ABZERO+TEMPC)*100.00)                    


    GOTO999()                                                            
    # end                                                               

1 个答案:

答案 0 :(得分:0)

正如@hoefling指出的那样,现在的代码几乎不可测试。但这不是因为它不是面向对象的。只要具有合适的结构,就可以轻松测试非面向对象的代码。这意味着将长函数分解为较小的函数,使用函数参数并返回值,而不是全局变量等。-这与OOP无关。实际上,您的代码违反了OOP流行之前(1974年)就已经知道并制定的许多编码原则,请参见https://en.wikipedia.org/wiki/The_Elements_of_Programming_Style

我建议您阅读以下其中一本书:

  • 代码完成,由史蒂夫·麦康奈尔(Steve McConnell)-有关如何编写出色代码的经典书籍。
  • Martin Fowler的重构-如何从不太好的代码迁移到更好的代码。
  • 罗伯特·C·马丁(Robert C. Martin)的清洁代码-再次,如何编写出色的代码。