此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2146
一. 测试相关事项
git地址:https://git.coding.net/tianl364/Arithmetic_Demo.git
单元测试代码详见上述git地址中的Unit_Test.py
结对伙伴:于洋
集成环境:pycharm
编程语言:python
测试框架:Unittest
二.单元测试代码
1 import unittest 2 from f4 import * 3 class TestMathFunc(unittest.TestCase): 4 def test_f4(self): 5 pass 6 7 # 表达式求值功能测试 8 def test_f4_answer(self): 9 print("expression_to_value函数单元测试开始:") 10 _eq = input("输入一个四则运算:") 11 _eq_ans = input("输入一个正确的答案:") 12 self.assertEqual(_eq_ans ,f4()._f4_answer(eq = _eq)) 13 print("expression_to_value函数单元测试结束。", end='\n\n') 14 print("表达式求值功能测试完成", end='\n\n') 15 16 # 循环出题功能测试 17 def test_f4_input(self): 18 print("circular_problem函数单元测试开始:") 19 self.assertEqual(0,f4()._f4_input()) 20 print("circular_problem函数单元测试结束。", end='\n\n') 21 print("循环出题功能测试完成", end='\n\n') 22 23 # 规范化出题功能测试 24 def test_f4_integer_parser(self): 25 print("normalize_exp函数单元测试开始:") 26 x = input("输入命令行参数:") 27 self.assertEqual(0,f4()._f4_integer_parser(x)) 28 print("normalize_exp函数单元测试结束。", end='\n\n') 29 print("规范化出题功能测试完成", end='\n\n') 30 31 # 单元测试入口 32 if __name__ == "__main__": 33 unittest.main()
表达式求值功能的测试结果如下,主要包括中缀表达式转后缀表达式,后缀表达式计算等功能。
在求值时测试用例出现了bug,产生了格式不匹配的问题,实例如下:
修改了格式部分的代码如下:
1 theAnswer = input() 2 # 判断“?”字符是否存在 3 if '?' in theAnswer: 4 theAnswer = theAnswer.replace('?', '') 5 do_judge(float(theAnswer), value)
修改过后单元测试顺利通过,效果如下:
循环出题功能的测试结果如下:
通过命令行参数规范化出题功能的测试结果如下:
测试结果:
在修改过格式问题后未出现较大bug,各项数据都是一次通过
一次性通过的代码如下:
1 # 将中缀表达式转换为后缀表达式 2 def middle_to_after(s): 3 expression = [] 4 ops = [] 5 6 for item in s: 7 if item in ['+', '-', '*', '/']: 8 while len(ops) >= 0: 9 if len(ops) == 0: 10 ops.append(item) 11 break 12 op = ops.pop() 13 if op == '(' or ops_rule[item] > ops_rule[op]: 14 ops.append(op) 15 ops.append(item) 16 break 17 else: 18 expression.append(op) 19 elif item == '(': 20 ops.append(item) 21 elif item == ')': 22 while len(ops) > 0: 23 op = ops.pop() 24 if op == '(': 25 break 26 else: 27 expression.append(op) 28 else: 29 expression.append(item) 30 31 while len(ops) > 0: 32 expression.append(ops.pop()) 33 34 return expression 35 36 # 计算后缀表达式 37 def expression_to_value(expression): 38 stack_value = [] 39 for item in expression: 40 if item in ['+', '-', '*', '/']: 41 n2 = stack_value.pop() 42 n1 = stack_value.pop() 43 result = cal(n1, n2, item) 44 stack_value.append(result) 45 else: 46 stack_value.append(int(item)) 47 return stack_value[0] 48 49 # 四则运算规则 50 def cal(n1, n2, op): 51 if op == '+': 52 return n1 + n2 53 if op == '-': 54 return n1 - n2 55 if op == '*': 56 return n1 * n2 57 if op == '/': 58 return n1 / n2
三. 在单元测试中的收获及心得体会
已经好久没有做单元测试了,而且对于python这门新的语言我从头学习了测试用例框架Unittest,通过Unittest框架配合pycharm编译器进行测试还是非常方便的,各模块之间的测试方法也非常灵活。而在合作测试中我与于洋也多次出现配合上的问题,总结下来我们在以后的测试中应该先写单元测试用例,后写代码实现,并且可以考虑在设计接口时一起设计测试用例等。