作业 20180925-4 单元测试

此作业要求参见: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

二.单元测试代码

import unittest
from f4 import *
class TestMathFunc(unittest.TestCase):
    def test_f4(self):
        pass

    # 表达式求值功能测试
    def test_f4_answer(self):
        print("expression_to_value函数单元测试开始:")
        _eq = input("输入一个四则运算:")
        _eq_ans = input("输入一个正确的答案:")
        self.assertEqual(_eq_ans ,f4()._f4_answer(eq = _eq))
        print("expression_to_value函数单元测试结束。", end='

')
        print("表达式求值功能测试完成", end='

')

    # 循环出题功能测试
    def test_f4_input(self):
        print("circular_problem函数单元测试开始:")
        self.assertEqual(0,f4()._f4_input())
        print("circular_problem函数单元测试结束。", end='

')
        print("循环出题功能测试完成", end='

')

    # 规范化出题功能测试
    def test_f4_integer_parser(self):
        print("normalize_exp函数单元测试开始:")
        x = input("输入命令行参数:")
        self.assertEqual(0,f4()._f4_integer_parser(x))
        print("normalize_exp函数单元测试结束。", end='

')
        print("规范化出题功能测试完成", end='

')

# 单元测试入口
if __name__ ==  "__main__":
    unittest.main()

表达式求值功能的测试结果如下,主要包括中缀表达式转后缀表达式,后缀表达式计算等功能。

在求值时测试用例出现了bug,产生了格式不匹配的问题,实例如下:

修改了格式部分的代码如下:

      theAnswer = input()
         # 判断“?”字符是否存在
         if '?' in theAnswer:
             theAnswer = theAnswer.replace('?', '')
         do_judge(float(theAnswer), value)

修改过后单元测试顺利通过,效果如下:

循环出题功能的测试结果如下:

通过命令行参数规范化出题功能的测试结果如下:

测试结果:

在修改过格式问题后未出现较大bug,各项数据都是一次通过

一次性通过的代码如下:

# 将中缀表达式转换为后缀表达式
def middle_to_after(s):
    expression = []
    ops = []
    
    for item in s:
        if item in ['+', '-', '*', '/']:
            while len(ops) >= 0:
                if len(ops) == 0:
                    ops.append(item)
                    break
                op = ops.pop()
                if op == '(' or ops_rule[item] > ops_rule[op]:
                    ops.append(op)
                    ops.append(item)
                    break
                else:
                    expression.append(op)
        elif item == '(':
            ops.append(item)
        elif item == ')':
            while len(ops) > 0:
                op = ops.pop()
                if op == '(':
                    break
                else:
                    expression.append(op)
        else:
            expression.append(item)

    while len(ops) > 0:
        expression.append(ops.pop())

    return expression

# 计算后缀表达式
def expression_to_value(expression):
    stack_value = []
    for item in expression:
        if item in ['+', '-', '*', '/']:
            n2 = stack_value.pop()
            n1 = stack_value.pop()
            result = cal(n1, n2, item)
            stack_value.append(result)
        else:
            stack_value.append(int(item))
    return stack_value[0]

# 四则运算规则
def cal(n1, n2, op):
    if op == '+':
        return n1 + n2
    if op == '-':
        return n1 - n2
    if op == '*':
        return n1 * n2
    if op == '/':
        return n1 / n2

三. 在单元测试中的心得体会

在测试中了解到了测试的目的1.确保代码的质量;2确保代码的可维护性;3.确保代码的可扩展性。而且因为此次测试提高了我们的代码质量,方便我们以后更好的维护代码更好的设计系统,使每个成员的功能模块能更透明化,解决耦合度高的问题,尽量使代码处于低耦合状态。 

原文地址:https://www.cnblogs.com/nenusoft/p/9756768.html