结对编程2——单元测试
组员:
王钧任 201421123109
曾丽君 201421123101
题目描述:
上一周大家为四则运算程序设计了2-3个新功能,本次在隔了一周之后,我们循序渐进地进阶。本次目标:
把计算模块提取出来,单独创建一个类。
针对提取出来的计算类的接口函数做单元测试。
通过单元测试代码,测试加法是否能正确工作;
通过单元测试代码,测试加减乘除功能。
通过单元测试代码,测试计算类对于各种参数的支持。
需求分析:单元测试能够让我们写的代码更加健全,能够让程序能够不用牵一发而动全身,大大
的改善了后期的维护花费的工作量。
设计测试框架, 模拟测试数据:
因为我前几次是用C写的,这次测试将计算模块抽出写成了C++。
类的定义:
class TrivialCalculator
{
public:
double Add(double x, double y);
double Subtract(double x, double y);
double Multiply(double x, double y);
double Divide(double x, double y);
int gcd(int x, int y);
string cal(char op,int z,int y);
string zfcal(char op, int z1, int y1, int z2, int y2);
string calinput(string s);
};
计算模块的测试用例及运行结果:
公约数测试
TEST_METHOD(gcdTest)
{
//TrivialCalculator test;
int actual = test->gcd(6,3);
int expected = 3;
Assert::AreEqual(expected, actual);
}
整数计算测试
TEST_METHOD(calTest)
{
string actual = test->cal('+', 3, 4);
string expected = "7";
Assert::AreEqual(expected, actual);
actual = test->cal('+', 3, 4);
expected = "8";
Assert::AreNotEqual(expected, actual);
actual = test->cal('-', 9, 8);
expected = "1";
Assert::AreEqual(expected, actual);
actual = test->cal('-', 9, 8);
expected = "2";
Assert::AreNotEqual(expected, actual);
actual = test->cal('*', 9, 8);
expected = "72";
Assert::AreEqual(expected, actual);
actual = test->cal('-', 9, 8);
expected = "2";
Assert::AreNotEqual(expected, actual);
actual = test->cal('/', 9, 7);
expected = "9/7";
Assert::AreEqual(expected, actual);
actual = test->cal('/', 9, 8);
expected = "2";
Assert::AreNotEqual(expected, actual);
}
真分数计算测试
TEST_METHOD(zfcalTest)
{
//TrivialCalculator test;
string actual = test->zfcal('+', 1, 3,1,3);
string expected = "6/9";
Assert::AreEqual(expected, actual);
actual = test->zfcal('+', 1, 3, 1, 3);
expected = "1/3";
Assert::AreNotEqual(expected, actual);
actual = test->zfcal('-', 2, 3, 1, 3);
expected = "3/9";
Assert::AreEqual(expected, actual);
actual = test->zfcal('-', 2, 3, 1, 3);
expected = "2";
Assert::AreNotEqual(expected, actual);
actual = test->zfcal('*', 2, 3, 1, 3);
expected = "2/9";
Assert::AreEqual(expected, actual);
actual = test->zfcal('*', 2, 3, 1, 3);
expected = "2";
Assert::AreNotEqual(expected, actual);
actual = test->zfcal('/', 2, 3, 1, 3);
expected = "6/3";
Assert::AreEqual(expected, actual);
actual = test->zfcal('*', 2, 3, 1, 3);
expected = "2";
Assert::AreNotEqual(expected, actual);
}
输入问题测试
TEST_METHOD(calinputTest)
{
//TrivialCalculator test;
string actual = test->calinput("1++2");
string expected = "输入错误!";
Assert::AreEqual(expected, actual);
actual = test->calinput("1++2");
expected = "输入正确!";
Assert::AreNotEqual(expected, actual);
actual = test->calinput("1/2+8/0");
expected = "输入错误!";
Assert::AreEqual(expected, actual);
}
这里未通过是因为我将expected输入错误。
代码覆盖率:
关于代码覆盖率,我用的是VS2013自带的代码覆盖率分析,但不知道为什么出错了。如图
根据图中显示,进入网页查询。代码覆盖率疑难解答
按照网页教程操作仍未解决。如果助教或老师知道解决方法,烦请告知,不胜感激。
小结与感受:
之前的代码我们已经做到了至少是好一些的规划,每每要用到一个新方法时候,都不在这个方法里面直接写,而是重新写一个目标方法,单元测试我觉得很有意义,
能够让我写代码时候能够把一个方法写到尽量完美无缺,减少了以后的修改量,还是得代码,条理清晰,一看到就能知道功能,不用再从头开始想,这段代码的意义。
在隔了一周之后再看之前的代码,是否更能体会到下面这些东西
(1) 良好的设计
良好的设计能使我们在编写代码时减少很多不必要的问题。之前的题目中就是因为一开始的设计不好结果功能出现了很多问题。
(2) 编码规范
编码规范能加快代码的编写,尤其是合作写代码,如果代码不规范,会加重理解代码负担。
(3) 必要的注释
注释真的很重要,过了一段时间看这些自己写过的还真的有点东西很陌生,这时候注释就很重要了。如果没有这些注解,回忆这些方法还真需要一些时间。
也可以让同一项目的人理解代码的作用。