结对编程2——单元测试
结对编程--单元测试
李志强201421123028
林方言201421123023
一、需求分析
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;
}
}
c、测试结果

代码更新
#include "stdafx.h"
#include "CppUnitTest.h"
#include "Calc.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace MyUnitTest
{
TEST_CLASS(UnitTest1)
{
public:
Calc Test;
string test11 = "9/2";
string test12 = "10/3";
string test13 = "6";
string test14 = "3/4";
string test21 = "1/6";
string test22 = "-5/3";
string test23 = "5/3";
string test24= "2";
string test31 = "2";
string test32 = "1";
string test33 = "2/3";
string test34 = "1/6";
string test41 = "1/4";
string test42 = "8";
string test43 = "3/4";
string test44 = "1/2";
string test5 = "format error!";
string test6 = "Abnormal in Crash!";
string test7 = "Beyond the scope of numerical(-1000~1000)!";
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(TestCheckFormat)
{
Test.CheckInput("2/-2");
Assert::AreEqual(test5, Test.g_szErrIn);
}
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);
}
};
}
三、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++来进行,在网上也找了老半天。后来慢慢地按照要求和参考的资料,慢慢做了出来。
再把肉放上: 满纸荒唐言,一把辛酸泪。
看了上一周的代码,发现不太好直接进行测试,便比较大的改了许多代码。
在这次编程上,我们使用匈牙利命名方法对变量进行命名,解决了一些之前的编码不规范的问题。
然后再来一片面包:他日他山登蜀道,去时萧萧来时依。
经过这次的编程,我们对于代码规范和测试类有了一定了解,对于做好一个软件有了更加深刻的认识,一开始就应该有良好的设计,之后要做到代码的规范,必要的注释,与此同时,要与伙伴有良好的沟通,团结在一起。
posted on 2017-03-26 00:19 vanspumakappa 阅读(291) 评论(3) 收藏 举报
浙公网安备 33010602011771号