项目代码地址 / 合作伙伴iFurySt博文链接
jahowz(201421123013) & iFurySt(201421123018)
需求分析
本次程序将原有四则运算器的计算模块单独抽离出来,写成一个独立的类.
然后再写一个测试模块对这个独立的计算模块进行全方位的测试
测试模块使用的是Python下的unittest单元测试
测试框架设计&模拟测试数据
测试模块功能如下:
- 加减乘除功能测试(支持整数,小数,分数,及混合)
- 非法输入反馈测试
- 除0错误反馈测试
-
加减乘除功能测试:
def test_plus(self):
ques = ['1+2','2.7+1','2.5+3.6','2/3+3/4','2/3+3']
key = ['3','3.7','6.1','17/12','11/3']
for i in range(4):
test = str(Calc(ques[i]))
self.assertEqual(test, key[i])
def test_sub(self):
ques = ['4-3','2.7-1','3.5-2.6','3/4-2/3','3-2/3']
key = ['1','1.7','0.9','1/12','7/3']
for i in range(4):
test = str(Calc(ques[i]))
self.assertEqual(test, key[i])
def test_mult(self):
ques = ['4*3','2.7*1','3.5*2.6','3/4*2/3','2/3*3']
key = ['12','2.7','9.1','1/2','2']
for i in range(4):
test = str(Calc(ques[i]))
self.assertEqual(test, key[i])
def test_div(self):
ques = ['4/3','2.7/1','3.5/0.7','3/4/2/3','2/3/3']
key = ['4/3','2.7','5.0','9/8','2/9']
for i in range(4):
test = str(Calc(ques[i]))
self.assertEqual(test, key[i])
加减乘除分别写在四个不同的函数里
每个函数内的ques列表即测试数据,key列表即应有的测试结果.
若测试加减乘除功能后得出的结果等于key中的结果,则通过测试,反之不通过
-
非法输入反馈测试:
def test_error_arg(self):
ques = ['1++2','+1+2','.1.5*2','5-6+']
for i in range(4):
test = str(Calc(ques[i]))
self.assertEqual(test, 'error')
对各种非法输入进行判断,若计算模块反馈为字符串'error',则测试通过
def __calc_main(self):
reg1 = r'(\d+(\.\d+)?)([-*/\+]{1})(\d+(\.\d+)?)'
reg2 = r'(\d+(/\d+)?)([-*/\+]{1})(\d+(/\d+)?)'
QuesReg1 = re.compile(reg1)
QuesReg2 = re.compile(reg2)
result1 = QuesReg1.match(self.ques_str)
result2 = QuesReg2.match(self.ques_str)
...
if result1 and result1.group(0)==self.ques_str:
...
elif result2 and result2.group(0)==self.ques_str:
...
else:
return 'error'
以上是计算模块中使用正则表达式的对非法输入的参数进行判断的部分代码
-
除0错误反馈测试:
def test_ZeroDivisionError(self):
ques = ['5/0','1.5/0','1/5/0']
for i in range(3):
test = str(Calc(ques[i]))
self.assertEqual(test, 'zero_error')
当进行除法计算时,若除数为0,应反馈'zero_error',对其进行测试,验证其反馈结果
def __calcbox(self,a,b,sign_index):
try:
if type(a)==float or type(b)==float:
cal_result =[a+b,a-b,a*b,a/b]
else:
cal_result =[a+b,a-b,a*b,Fraction(a,b)]
return cal_result[sign_index]
except ZeroDivisionError:
return 'zero_error'
以上是计算模块中对除0情况的处理,直接是使用了异常捕获
-
测试过程遇到的问题以及解决方案:
整个测试过程并没有遇到什么特别大的问题,算是比较顺利
可能是因为计算模块在写的时候已经经过了数次排查测试,功能已经很完善 -
单元测试展示
-
代码覆盖率
运行测试模块test.py 顺利通过加减乘除,非法输入反馈,除0反馈六个功能测试
结对过程&非摆拍照片
在两人的共同讨论下对原有计算模块进行分离改写为独立的类
再轮流分工编写了测试模块的代码
小结&感受
单元测试十分实用,当以后对函数代码做了修改,只需要再跑一遍单元测试,如果通过,说明我们的修改没有对函数原有的行为造成影响,如果测试不通过,说明我们的修改与原有行为不一致,要么修改代码,要么修改测试。
在经过了一周之后,再看代码吧,并没有生疏的感觉,可能是变量名起的好,也可能是我记忆力比较好吧
代码规范确实很重要,因为这样代码才看的舒服,编程才可以很快乐
必要的注释也很重要,但是这次程序没有,因为程序比较简单小型,如果程序比较大的话,我应该会打上注释吧