zoukankan      html  css  js  c++  java
  • 四则运算-单元测试

    四则运算-单元测试

    李志强 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);
            }
    View Code
    • 单元测试加减乘除功能
    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 等,在属性+类型+描述这种结构下,很容易理解这个变量所表达的含义,在交替写代码过程中明显加快了团队的速度,在随后的编程之路,我们会更加注重代码的规范。

          然后再来一片面包:经过这次的单元测试,我们对软件工程有了更加深刻的认识,原来发布一个软件需要许多过程来逐步完善的,需要默契的团队合作。

     

  • 相关阅读:
    [抄书]The Pipes and Filters pattern
    [抄书]The Layers pattern
    OpenGL Step by Step (1)
    [HOOPS]二维点向三维空间投影
    心仪已久的工具:BoundsChecker v7.2
    [HOOPS]用HC_Show_...获取正确的点的坐标位置
    小试zlib
    XML (2) Document Type Definitions (DTD)
    UML (1) 设计模式及作业附图
    XML (1) 什么是XML
  • 原文地址:https://www.cnblogs.com/lizhiqiang0/p/6638962.html
Copyright © 2011-2022 走看看