单元测试作业地址:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2146
一、内容
单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。本次四则运算的实现使用了python语言,对于python的单元测试,我们参考了下述链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143191629979802b566644aa84656b50cd484ec4a7838000
编写单元测试时,只需要引入Python自带的unittest模块。
二、单元测试代码
1 # -*- coding: utf-8 -*-
2 import unittest
3 from f4 import *
4
5
6 class F4Test(unittest.TestCase):
7 def test_f4(self):
8 pass
9
10 def test01_create_equation(self): # 测试顺序按函数名字字典顺序进行
11 print("create_equation函数单元测试开始:")
12 self.assertIsNotNone(create_equation())
13 print("OK")
14 print("create_equation函数单元测试结束。\n")
15
16 def test02_reverse_polish(self):
17 eq = []
18 print("reverse_polish函数单元测试开始:")
19 equation = input("输入一个四则运算(括号请使用英文版的括号):")
20 _eq_ans = input("输入正确的逆波兰表达式:")
21 list(equation) # 输入的表达式是str类型,该函数处理的是含有整型和字符型的list类型
22 for temp in equation:
23 if '0' <= temp <= '9':
24 eq.append(int(temp))
25 else:
26 eq.append(temp)
27 re_equation = reverse_polish(eq)
28 str_equation = "".join('%s' % id for id in re_equation)
29 self.assertEqual(_eq_ans, str_equation)
30 print("OK")
31 print("reverse_polish函数单元测试结束。\n")
32
33 def test03_calculate(self):
34 eq = []
35 print("calculate函数单元测试开始:")
36 equation = input("输入一个可计算的逆波兰表达式:")
37 _eq_ans = input("输入该表达式的正确结果:")
38 list(equation) # 输入的表达式是str类型,该函数处理的是含有整型和字符型的list类型
39 for temp in equation:
40 if '0' <= temp <= '9':
41 eq.append(int(temp))
42 else:
43 eq.append(temp)
44 result = calculate(eq)
45 self.assertEqual(float(_eq_ans), result)
46 print("OK")
47 print("calculate函数单元测试结束。\n")
48
49
50 if __name__ == "__main__":
51 unittest.main()
三、测试结果
对生成算式、将算式转为逆波兰表达式、计算算式结果3个函数设计如下单元测试:
测试1(表达式不带括号):
测试2(表达式包含括号):
测试结果均正确。
四、关键代码
1.随机生成四则运算式:
1 def create_equation(): # 随机生成算式
2 eq = []
3
4 for i in range(3):
5 eq.append(random.randint(0, 10))
6 eq.append(operator[random.randint(0, 3)])
7 eq.append(random.randint(0, 10))
8 p = random.randint(1, 5)
9 if p is 1:
10 eq.insert(0, "(")
11 eq.insert(4, ")")
12 elif p is 2:
13 eq.insert(0, "(")
14 eq.insert(6, ")")
15 elif p is 3:
16 eq.insert(2, "(")
17 eq.insert(6, ")")
18 elif p is 4:
19 eq.insert(2, "(")
20 eq.append(")")
21 elif p is 5:
22 eq.insert(4, "(")
23 eq.append(")")
24 return eq
2.将算式转化为逆波兰表达式
1 def reverse_polish(equation): # 将算式转换为逆波兰表达式
2 result = []
3 c = []
4 slist = [i for i in equation]
5
6 for item in slist:
7 if item in range(0, 100):
8 result.append(item)
9 elif not c and item in cal.keys():
10 c.append(item)
11 continue
12 elif c and item in cal.keys():
13 for x in range(c.__len__()):
14 z = c[-1]
15 temp = cal[z] if z in cal else cal1[z]
16 if temp >= cal[item]:
17 result.append(c.pop())
18 else:
19 c.append(item)
20 break
21 if not c:
22 c.append(item)
23 elif item is ")":
24 for x in range(c.__len__()):
25 if c[-1] == "(":
26 c.pop()
27 break
28 else:
29 result.append(c.pop())
30 elif item is "(":
31 c.append(item)
32 # print(result,c)
33 for x in range(c.__len__()):
34 result.append(c.pop())
35 return result
3.计算逆波兰表达式
1 def calculate(re_equation): # 计算逆波兰表达式
2 stack = PyStack()
3 sumEnd = 0
4
5 if len(re_equation) is 0:
6 return sumEnd
7 for i in re_equation:
8 if i in range(0, 100):
9 stack.push(float(i))
10 elif '+' is i:
11 a = stack.pop()
12 b = stack.pop()
13 stack.push(b + a)
14 elif '-' is i:
15 a = stack.pop()
16 b = stack.pop()
17 stack.push(b - a)
18 elif '*' is i:
19 a = stack.pop()
20 b = stack.pop()
21 stack.push(b * a)
22 elif '÷' is i:
23 a = stack.pop()
24 b = stack.pop()
25 if a == 0:
26 return False #print('%d/%d分子不能为0' % (b, a))
27 else:
28 stack.push(b / a)
29 return stack.pop()
五、版本控制
git地址:https://git.coding.net/liu-xin/f4.git