项目代码地址 / 合作伙伴Jahowz博文链接
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情况的处理,直接是使用了异常捕获
-
测试过程遇到的问题以及解决方案:
整个测试过程并没有遇到什么特别大的问题,算是比较顺利
可能是因为计算模块在写的时候已经经过了数次排查测试,功能已经很完善 -
单元测试展示
顺利通过加减乘除,非法输入反馈,除0反馈六个功能测试
结对过程&非摆拍照片
在两人的共同讨论下对原有计算模块进行分离改写为独立的类
再轮流分工编写了测试模块的代码
小结&感受
单元测试模块很实用,模块化的思想在里面,每次对代码有改动的话,只要在测试模块测试通过没有任何bug的话,便可以上线新功能了。
代码的规范是相当有必要的,因为两个合作的话,要看对方的代码,所以代码要是规范了之后,能少掉很多成本,更快的进行合作。另外代码里的注释是很有必要的,不管是给同伴看还是给自己看都是很有必要的,自己写的代码一两周之后,自己可能都看得不是很明白了,所以在关键的地方注释还是很有必要的。