四则运算-单元测试
李志强 201421123028 连永刚 201421123014 林方言 201421123023
coding 地址:https://git.coding.net/lizhiqiang0x01/sizeyunsuan-TestExample.git
一、题目要求
1、通过单元测试代码,测试加法是否能正确工作;
2、通过单元测试代码,测试加减乘除功能。
3、通过单元测试代码,测试计算类对于各种参数的支持:
a. 输入是有错误的,例如 “1 ++ 2”,
b. 在数值范围是 -1000 .. 1000 的时候,传进去 “10000 + 32768”,
c. 或者是 “ 248 / 0” 怎么办?
d. 怎么告诉函数的调用者 “你错了”? 把返回的字符串定义为 “-1” 来表示?
e. 那么如果真的计算结果是 “-1” 又怎么处理呢?
4、通过增量修改的方式,改进程序, 完成对各种错误情况的处理。
二、实验步骤
a、需求分析
通过单元测试代码,测试程序加减乘除功能是否正确工作,对于格式错误、数值溢出、除零异常是否能检测的到。
b、设计测试框架,模拟测试数据
- 测试加减乘除功能
TEST_METHOD(TestAdd) //测试加法 { Test.CheckInput("1/2+4"); Assert::AreEqual(test11,Test.add()); } TEST_METHOD(TestAdd1) { Test.CheckInput("3+1/3"); Assert::AreEqual(test12, Test.add()); } TEST_METHOD(TestAdd2) { Test.CheckInput("2+4"); Assert::AreEqual(test13, Test.add()); } TEST_METHOD(TestAdd3) { Test.CheckInput("1/2+1/4"); Assert::AreEqual(test14, Test.add()); } TEST_METHOD(TestSub) //测试减法 { Test.CheckInput("1/2-1/3"); Assert::AreEqual(test21, Test.sub()); } TEST_METHOD(TestSub1) { Test.CheckInput("1/3-2"); Assert::AreEqual(test22, Test.sub()); } TEST_METHOD(TestSub2) { Test.CheckInput("2-1/3"); Assert::AreEqual(test23, Test.sub()); } TEST_METHOD(TestSub3) { Test.CheckInput("5-3"); Assert::AreEqual(test24, Test.sub()); } TEST_METHOD(TestMul) //测试乘法 { Test.CheckInput("1×2"); Assert::AreEqual(test31, Test.mul()); } TEST_METHOD(TestMul1) { Test.CheckInput("1/2×2"); Assert::AreEqual(test32, Test.mul()); } TEST_METHOD(TestMul2) { Test.CheckInput("2×1/3"); Assert::AreEqual(test33, Test.mul()); } TEST_METHOD(TestMul3) { Test.CheckInput("1/3×1/2"); Assert::AreEqual(test34, Test.mul()); } TEST_METHOD(TestDiv) //测试除法 { Test.CheckInput("1/2÷2"); Assert::AreEqual(test41, Test.div()); } TEST_METHOD(TestDiv1) { Test.CheckInput("4÷1/2"); Assert::AreEqual(test42, Test.div()); } TEST_METHOD(TestDiv2) { Test.CheckInput("1/2÷2/3"); Assert::AreEqual(test43, Test.div()); } TEST_METHOD(TestDiv3) { Test.CheckInput("1÷2"); Assert::AreEqual(test44, Test.div()); }
- 测试格式错误、数值溢出、除零异常功能
TEST_METHOD(TestCheckFormat1) //测试格式错误 { Test.CheckInput("2--2"); Assert::AreEqual(test5, Test.g_szErrIn); } TEST_METHOD(TestCheckFormat2) { Test.CheckInput("2+÷2"); Assert::AreEqual(test5, Test.g_szErrIn); } TEST_METHOD(TestCheckFormat3) { Test.CheckInput("2+×2"); Assert::AreEqual(test5, Test.g_szErrIn); } TEST_METHOD(TestCheckFormat4) { Test.CheckInput("2+×"); Assert::AreEqual(test5, Test.g_szErrIn); } TEST_METHOD(TestCheckFormat5) { Test.CheckInput("2+/2"); Assert::AreEqual(test5, Test.g_szErrIn); } TEST_METHOD(TestCheckNum61) //测试非法数值 { Test.CheckInput("1÷0"); Test.div(); Assert::AreEqual(test6, Test.g_szErrNum); } TEST_METHOD(TestCheckNum62) { Test.CheckInput("1/0"); Test.div(); Assert::AreEqual(test6, Test.g_szErrNum); } TEST_METHOD(TestCheckNum63) { Test.CheckInput("1/2+2/0"); Test.add(); Assert::AreEqual(test6, Test.g_szErrNum); } TEST_METHOD(TestCheckBey71) //测试时数值溢出 { Test.CheckInput("-2000+2"); Test.add(); Assert::AreEqual(test7, Test.g_szErrBey); } TEST_METHOD(TestCheckBey72) { Test.CheckInput("-2000"); Test.add(); Assert::AreEqual(test7, Test.g_szErrBey); } TEST_METHOD(TestCheckBey73) { Test.CheckInput("-200+2/3000"); Test.add(); Assert::AreEqual(test7, Test.g_szErrBey); }
- 单元测试加减乘除功能
string Calc::add() //测试加法 { size_t iPos = g_szInput.find('+'); g_szX = g_szInput.substr(0, iPos); g_szY = g_szInput.substr(iPos+1, g_szInput.length()-1-iPos); size_t iPosInX = g_szX.find('/'); g_iFirNer = stoi(g_szX.substr(0, iPosInX)); if (iPosInX == -1) { g_iFirDer = 1; } else { g_iFirDer = stoi(g_szX.substr(iPosInX+1, g_szInput.length() - 1 - iPosInX)); } size_t iPosInY = g_szY.find('/'); g_iSecNer = stoi(g_szY.substr(0, iPosInY)); if (iPosInY == -1) { g_iSecDer = 1; } else { g_iSecDer = stoi(g_szY.substr(iPosInY+1, g_szInput.length() - 1 - iPosInY)); } simplify(g_iFirNer, g_iFirDer, g_iSecNer, g_iSecDer); g_iRusNer = g_iFirNer*g_iSecDer + g_iFirDer*g_iSecNer; g_iRusDer = g_iFirDer*g_iSecDer; init(g_iRusNer, g_iRusDer); g_szRusDer = ""; g_szRusNer = ""; if (g_iRusDer == 1) { g_szRusNer += to_string(g_iRusNer); return g_szRusNer; } else{ g_szRusDer += to_string(g_iRusDer); g_szRusNer += to_string(g_iRusNer); return g_szRusNer + "/" + g_szRusDer; } } string Calc::sub() //测试加法 { size_t iPos = g_szInput.find('-'); g_szX = g_szInput.substr(0, iPos); g_szY = g_szInput.substr(iPos + 1, g_szInput.length() - 1 - iPos); size_t iPosInX = g_szX.find('/'); g_iFirNer = stoi(g_szX.substr(0, iPosInX)); if (iPosInX == -1) { g_iFirDer = 1; } else { g_iFirDer = stoi(g_szX.substr(iPosInX + 1, g_szInput.length() - 1 - iPosInX)); } size_t iPosInY = g_szY.find('/'); g_iSecNer = stoi(g_szY.substr(0, iPosInY)); if (iPosInY == -1) { g_iSecDer = 1; } else { g_iSecDer = stoi(g_szY.substr(iPosInY + 1, g_szInput.length() - 1 - iPosInY)); } simplify(g_iFirNer, g_iFirDer, g_iSecNer, g_iSecDer); g_iRusNer = g_iFirNer*g_iSecDer - g_iFirDer*g_iSecNer; g_iRusDer = g_iFirDer*g_iSecDer; init(g_iRusNer, g_iRusDer); g_szRusDer = ""; g_szRusNer = ""; if (g_iRusDer == 1) { g_szRusNer += to_string(g_iRusNer); return g_szRusNer; } else{ g_szRusDer += to_string(g_iRusDer); g_szRusNer += to_string(g_iRusNer); return g_szRusNer + "/" + g_szRusDer; } } string Calc::mul() //测试乘法 { size_t iPos = g_szInput.find('×'); g_szX = g_szInput.substr(0, iPos); g_szY = g_szInput.substr(iPos + 1, g_szInput.length() - 1 - iPos); size_t iPosInX = g_szX.find('/'); g_iFirNer = stoi(g_szX.substr(0, iPosInX)); if (iPosInX == -1) { g_iFirDer = 1; } else { g_iFirDer = stoi(g_szX.substr(iPosInX + 1, g_szInput.length() - 1 - iPosInX)); } size_t iPosInY = g_szY.find('/'); g_iSecNer = stoi(g_szY.substr(0, iPosInY)); if (iPosInY == -1) { g_iSecDer = 1; } else { g_iSecDer = stoi(g_szY.substr(iPosInY + 1, g_szInput.length() - 1 - iPosInY)); } simplify(g_iFirNer, g_iFirDer, g_iSecNer, g_iSecDer); g_iRusNer = g_iFirNer*g_iSecNer; g_iRusDer = g_iFirDer*g_iSecDer; init(g_iRusNer, g_iRusDer); g_szRusDer = ""; g_szRusNer = ""; if (g_iRusDer == 1) { g_szRusNer += to_string(g_iRusNer); return g_szRusNer; } else{ g_szRusDer += to_string(g_iRusDer); g_szRusNer += to_string(g_iRusNer); return g_szRusNer + "/" + g_szRusDer; } } string Calc::div() //测试除法 { size_t iPos = g_szInput.find('÷'); g_szX = g_szInput.substr(0, iPos); g_szY = g_szInput.substr(iPos + 1, g_szInput.length() - 1 - iPos); size_t iPosInX = g_szX.find('/'); g_iFirNer = stoi(g_szX.substr(0, iPosInX)); if (iPosInX == -1) { g_iFirDer = 1; } else { g_iFirDer = stoi(g_szX.substr(iPosInX + 1, g_szInput.length() - 1 - iPosInX)); } size_t iPosInY = g_szY.find('/'); g_iSecNer = stoi(g_szY.substr(0, iPosInY)); if (iPosInY == -1) { g_iSecDer = 1; } else { g_iSecDer = stoi(g_szY.substr(iPosInY + 1, g_szInput.length() - 1 - iPosInY)); } simplify(g_iFirNer, g_iFirDer, g_iSecNer, g_iSecDer); g_iRusNer = g_iFirNer*g_iSecDer; g_iRusDer = g_iFirDer*g_iSecNer; init(g_iRusNer, g_iRusDer); g_szRusDer = ""; g_szRusNer = ""; if (g_iRusDer == 1) { g_szRusNer += to_string(g_iRusNer); return g_szRusNer; } else{ g_szRusDer += to_string(g_iRusDer); g_szRusNer += to_string(g_iRusNer); return g_szRusNer + "/" + g_szRusDer; } }
c、测试结果
三、PSP
PSP2.1 | Personal Software Process Stages | Estimated time(h) | actual time(h) |
Planning | 计划 | 1 | 1.5 |
· Estimate | 估计这个任务需要多少时间 | 10 | 15 |
Development | 开发 | 8 | 10 |
· Analysis | 需求分析 (包括学习新技术) | 0.5 | 1 |
· Design Spec | 生成设计文档 | 2 | 2 |
· Design Review | 设计复审 | 0.3 | 0.5 |
· Coding Standard | 代码规范 | 0.5 | 0.4 |
· Design | 具体设计 | 1.5 | 1.3 |
· Coding | 具体编码 | 8 | 7 |
· Code Review | 代码复审 | 0.5 | 1 |
· Test | 测试(自我测试,修改代码,提交修改) | 0.2 | 0.5 |
Reporting | 报告 | 2 | 2 |
· | 测试报告 | 0.5 | 0.5 |
· | 计算工作量 | 0.5 | 1 |
· | 并提出过程改进计划 | 2 | 4 |
四、总结
先来一片面包:队友之前作业都是用c++写的,使用c++单元测试。
再把肉放上:我们首先将各个功能模块做了分割,并对相应的模块进行多组测试,达到要进行单元测试的目的,在做分割的过程中,我们解决了之前变量太乱的诟病,在此次单元测试上,我们在代码规范做了很大的改进,我们使用匈牙利命名方法对变量进行命名,比如 g_iFirNer g_iFirDer g_szRusDer 等,在属性+类型+描述这种结构下,很容易理解这个变量所表达的含义,在交替写代码过程中明显加快了团队的速度,在随后的编程之路,我们会更加注重代码的规范。
然后再来一片面包:经过这次的单元测试,我们对软件工程有了更加深刻的认识,原来发布一个软件需要许多过程来逐步完善的,需要默契的团队合作。