测试用例设计思路:路径测试法
因为计算表达式的值分为了两个函数:中缀转后缀、和对后缀表达式求值。而如果对这两个函数一块做测试的话路径测试法会十分复杂。。所以这里分成了两个部分,分别进行路径测试:
① 中缀转后缀的路径测试:
首先画出流图
所以有7条线性独立路径:
1-2
1-3-8-1-。。。
1-3-4-9-1-。。。
1-3-4-5-10-1-。。。
1-3-4-5-6-11-1-。。。
1-3-4-5-6-7-12-7-。。。
1-3-4-5-6-7-1-。。。
对应的测试用例
1-2 : 空字符串,不符合要求,无用例
1-3-8-1-。。。: 1, 期望输出为1
1-3-4-9-1-。。。: 1 + 2, 期望输出为1 2 +
1-3-4-5-10-1-。。。 :1 + (1 + 2),期望输出为1 1 2 + +
1-3-4-5-6-11-1-。。。: 1 + (1 + 2),期望输出为1 1 2 + +
1-3-4-5-6-7-12-7-。。。 1 + 2 * 3,期望输出为 1 2 3 * +
1-3-4-5-6-7-1-。。。 1 * 2 + 3, 期望输出为 1 2 * 3 +
②后缀表达式计算的路径测试
流图:
3条线性独立路径,和对应的测试用例
1-2 :无用例
1-3-4-5-1-。。。 : 1 2 + (其中的运算符要替换成所有种类的运算符)
1-3-4-6-1-。。。 : 1 2 +
在此基础上,还对整个模块进行了黑盒测试,部分用例如下:
Test1: 1 + (2 + 3) 预计输出:6
Test2: 2 * (3 * 4 * (1 + 1)) 预计输出:48
Test3: (13 / 20) + 8 * 2 / 24 - 2/3 + 2 ** 2 预计输出: 93/20
以及对随机生成的表达式进行求值
单元测试设计思路:同上,白盒测试,路径覆盖法
测试用例:
化简函数Simplify():
(1, 100); 预计输出:1, 100, false
(10, 100); 预计输出:1, 10, false
(100, 28); 预计输出:25, 7, false
(100, 2); 预计输出:50, 1, true
(0, 100); 预计输出:0, 1, true
加法函数:
TEST_METHOD(Add)
{
Fraction a, b, c;
a.Set(1, 1); b.Set(1, 1);
Assert::AreEqual(a.Add(b).GetNumerator(), 2);
Assert::AreEqual(a.Add(b).GetDenominator(), 1);
Assert::AreEqual(a.Add(b).IsInteger(), true);
a.Set(1, 2); b.Set(1, 2);
Assert::AreEqual(a.Add(b).GetNumerator(), 1);
Assert::AreEqual(a.Add(b).GetDenominator(), 1);
Assert::AreEqual(a.Add(b).IsInteger(), true);
a.Set(1, 2); b.Set(1, 3);
Assert::AreEqual(a.Add(b).GetNumerator(), 5);
Assert::AreEqual(a.Add(b).GetDenominator(), 6);
Assert::AreEqual(a.Add(b).IsInteger(), false);
a.Set(1, 4); b.Set(1, 6);
Assert::AreEqual(a.Add(b).GetNumerator(), 5);
Assert::AreEqual(a.Add(b).GetDenominator(), 12);
Assert::AreEqual(a.Add(b).IsInteger(), false);
}
减法
TEST_METHOD(Subtract)
{
Fraction a, b, c;
a.Set(1, 1); b.Set(1, 1);
Assert::AreEqual(a.Subtract(b).GetNumerator(), 0);
Assert::AreEqual(a.Subtract(b).GetDenominator(), 1);
Assert::AreEqual(a.Subtract(b).IsInteger(), true);
a.Set(5, 6); b.Set(1, 6);
Assert::AreEqual(a.Subtract(b).GetNumerator(), 2);
Assert::AreEqual(a.Subtract(b).GetDenominator(), 3);
Assert::AreEqual(a.Subtract(b).IsInteger(), false);
a.Set(5, 6); b.Set(0, 1);
Assert::AreEqual(a.Subtract(b).GetNumerator(), 5);
Assert::AreEqual(a.Subtract(b).GetDenominator(), 6);
Assert::AreEqual(a.Subtract(b).IsInteger(), false);
}
乘法
TEST_METHOD(Multiply)
{
Fraction a, b, c;
a.Set(1, 1); b.Set(1, 1);
Assert::AreEqual(a.Multiply(b).GetNumerator(), 1);
Assert::AreEqual(a.Multiply(b).GetDenominator(), 1);
Assert::AreEqual(a.Multiply(b).IsInteger(), true);
a.Set(1, 2); b.Set(2, 3);
Assert::AreEqual(a.Multiply(b).GetNumerator(), 1);
Assert::AreEqual(a.Multiply(b).GetDenominator(), 3);
Assert::AreEqual(a.Multiply(b).IsInteger(), false);
a.Set(1, 2); b.Set(4, 1);
Assert::AreEqual(a.Multiply(b).GetNumerator(), 2);
Assert::AreEqual(a.Multiply(b).GetDenominator(), 1);
Assert::AreEqual(a.Multiply(b).IsInteger(), true);
}
除法
TEST_METHOD(DividedBy)
{
Fraction a, b, c;
a.Set(1, 1); b.Set(1, 1);
Assert::AreEqual(a.DividedBy(b).GetNumerator(), 1);
Assert::AreEqual(a.DividedBy(b).GetDenominator(), 1);
Assert::AreEqual(a.DividedBy(b).IsInteger(), true);
a.Set(1, 2); b.Set(3, 2);
Assert::AreEqual(a.DividedBy(b).GetNumerator(), 1);
Assert::AreEqual(a.DividedBy(b).GetDenominator(), 3);
Assert::AreEqual(a.DividedBy(b).IsInteger(), false);
a.Set(1, 2); b.Set(1, 4);
Assert::AreEqual(a.DividedBy(b).GetNumerator(), 2);
Assert::AreEqual(a.DividedBy(b).GetDenominator(), 1);
Assert::AreEqual(a.DividedBy(b).IsInteger(), true);
}
乘方
TEST_METHOD(Power)
{
Fraction a, b, c;
a.Set(1, 1);
Assert::AreEqual(a.Power(3).GetNumerator(), 1);
Assert::AreEqual(a.Power(3).GetDenominator(), 1);
Assert::AreEqual(a.Power(3).IsInteger(), true);
a.Set(1, 2);
Assert::AreEqual(a.Power(3).GetNumerator(), 1);
Assert::AreEqual(a.Power(3).GetDenominator(), 8);
Assert::AreEqual(a.Power(3).IsInteger(), false);
a.Set(2, 1);
Assert::AreEqual(a.Power(3).GetNumerator(), 8);
Assert::AreEqual(a.Power(3).GetDenominator(), 1);
Assert::AreEqual(a.Power(3).IsInteger(), true);
a.Set(2, 1);
Assert::AreEqual(a.Power(0).GetNumerator(), 1);
Assert::AreEqual(a.Power(0).GetDenominator(), 1);
Assert::AreEqual(a.Power(0).IsInteger(), true);
}
};