结对编程2--单元测试

201421123101 曾丽君 201421123109 王钧任

项目地址:https://coding.net/u/wjunren/p/TEST/git

a、需求分析:

在编写程序的过程中,我们经常会遇到这样的困惑,程序写着写着,就奇长无比,回头看,已经不知道这段代码为何物,百般思索过后终于想起来,但又忘记了当前代码写到了哪里。对于一个程序来说不仅要可用,还应该追求稳定,所以应该对程序的各部分功能进行测试,尽量修复bug。利用单元测试能够让我们写的代码更加健全,能够让程序能够不用牵一发而动全身,大大的改善后期维护花费的工作量。本次目标:

1.把计算模块提取出来,单独创建一个类。
2.针对提取出来的计算类的接口函数做单元测试。
3.通过单元测试代码,测试加法是否能正确工作;
4.通过单元测试代码,测试加减乘除功能。
5.通过单元测试代码,测试计算类对于各种参数的支持。

b、设计测试框架, 模拟测试数据:

由于前几次的代码是用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);
};

c、计算模块的测试用例及运行结果:

公约数测试:

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输入错误。

d、代码覆盖率:关于代码覆盖率,用的是VS2013自带的代码覆盖率分析,但不知道为什么出错了。如图


我跟队友都查询了很多资料,https://msdn.microsoft.com/library/jj159523.aspx 这是我们在网上找的比较好的教程,但是问题都没能得到解决,特此请教助教或老师知道的解决方法。

e、小结与感受

(1)以前学习java的时候记得老师有讲过测试这一块,但是懂得的也不多,代码覆盖率一开始不懂,我们都上网查了很多资料,但是按照网页教程操作,问题还是没能解决。基础不够扎实,还是需要反复多加练习,贵在持之以恒。

结对我觉得真的是不错的一种方式,自己做的话比较没有动力,如果是和别人一起,本来自己拖拖拉拉的也会因为考虑到队友而督促自己,提高效率,并且不懂的地方有人可以一起探讨。如果从大一开始有这种结对的方式,我相信现在的状况会改善很多。

(2)对伙伴的评价:

先来一片面包:因为以前课设等这类作业有跟队友合作过,也有了一定的经验,他一直都是个做事很注重效率的人,能够一直提醒我。不会和我一样爱拖拉。

中间的肉:基础不一样水平也有所差距,我的编程基础能力薄弱,有时候问题特别多会一直问,他有时候自己做不出来也比较烦躁,没耐心,我都不敢再一直问,不过都怪自己以前不认真,是自己造成的这个局面,但是是想学才会问,所以希望能够多点耐心。而且有时候他一直追求速度,不够细心,容易出现一些比较简单的错误。

再来一片面包:总的来说合作过程还是愉快的,因为学到了东西就会觉得内心比较踏实,虽然花费的时间也不短。希望一起取长补短,共同进步。

f、在隔了一周之后再看之前的代码,是否更能体会到下面这些东西

(1) 良好的设计
良好的设计能使我们在编写代码时减少很多不必要的问题。对于计算模块化之前做的还是不够好,程序之间的关系千丝万缕,动一点儿就要修改很多东西。例如我们本次的测试,如若发现bug,代码进行修改时,就得牵一发而动全身,这会使我们修改的非常痛苦。并且当我们阅读我们的代码程序时,模块化能让我们更加清楚快速的看懂我们写的是什么,而不是冗长的一段程序,使我们阅读时非常吃力。

(2) 编码规范
编码规范能加快代码的编写,尤其是合作写代码,如果代码不规范,会加重理解代码负担。如果我们在编码时,有考虑到一些编码上的规范,例如一些文件、方法、变量名的命名,编写时括号的对应,编码的格式等,会使得我们再次看我们的程序时,能够较好的理解。

(3) 必要的注释
注释真的很重要,过了一段时间看自己写过的东西会觉得陌生,这时候注释就很重要了。如果没有注释,回忆方法需要花费大量时间。添加注释,也可以让自己的小伙伴理解代码的作用。

照片

PSP表格

posted on 2017-03-29 13:01  曾丽君  阅读(259)  评论(1编辑  收藏  举报