首页 > 技术文章 > 20180925-4 单元测试,结对

94V587 2018-10-08 19:38 原文

此作业要求参见: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编译器进行测试还是非常方便的,各模块之间的测试方法也非常灵活。而在合作测试中我与于洋也多次出现配合上的问题,总结下来我们在以后的测试中应该先写单元测试用例,后写代码实现,并且可以考虑在设计接口时一起设计测试用例等。 

推荐阅读