[2019BUAA軟工]第0次代碼做業

Visual Studio 單元測試的簡單應用

寫在前面

  筆者根據做業的介紹以及Visual Studio 2017 文檔的相關說明,進行了Visual Studio 單元測試的簡單應用。html

Tips Link
課程連接 2019春季計算機學院軟件工程(羅傑)(北京航空航天大學)
實驗做業連接 [2019BUAA軟工助教]第0次代碼做業
實驗成果鏈接 GitHub
參考文獻 Visual Studio 2017 文檔

單元測試代碼

  單元測試從如下三方面展開:c++

  1. 四則運算正確性;
  2. 四則運算組合後計算的正確性;
  3. 要求範圍內全部整數運算的正確性;
#include "stdafx.h"
#include "CppUnitTest.h"
#include "../Calculator/Calculator.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace CalculatorUnitTest
{       
    TEST_CLASS(Test)
    {
    public:
        Calculator* calc;

        TEST_METHOD_INITIALIZE(initCal) 
        {
            calc = new Calculator();
        }

        TEST_METHOD_CLEANUP(CleanCal)
        {
            delete calc;
            calc = NULL;
        }

        /*
            簡單測試
        */

        TEST_METHOD(SimpleADD)
        {
            string ret = calc->Solve("11+22");
            Assert::AreEqual(ret, (string)"11+22=33");
        }

        TEST_METHOD(SimpleSUB)
        {
            string ret = calc->Solve("77-33");
            Assert::AreEqual(ret, (string)"77-33=44");
        }

        TEST_METHOD(SimpleMUL)
        {
            string ret = calc->Solve("55*66");
            Assert::AreEqual(ret, (string)"55*66=3630");
        }

        TEST_METHOD(SimpleDIV)
        {
            string ret = calc->Solve("99/33");
            Assert::AreEqual(ret, (string)"99/33=3");
        }

        /*
            組合測試
        */

        TEST_METHOD(ADD_ADD)
        {
            string ret = calc->Solve("22+33+11");
            Assert::AreEqual(ret, (string)"22+33+11=66");
        }

        TEST_METHOD(ADD_SUB)
        {
            string ret = calc->Solve("22+33-11");
            Assert::AreEqual(ret, (string)"22+33-11=44");
        }

        TEST_METHOD(ADD_MUL)
        {
            string ret = calc->Solve("22+33*11");
            Assert::AreEqual(ret, (string)"22+33*11=385");
        }

        TEST_METHOD(ADD_DIV)
        {
            string ret = calc->Solve("22+33/11");
            Assert::AreEqual(ret, (string)"22+33/11=25");
        }

        TEST_METHOD(SUB_ADD)
        {
            string ret = calc->Solve("99-66+77");
            Assert::AreEqual(ret, (string)"99-66+77=110");
        }

        TEST_METHOD(SUB_SUB)
        {
            string ret = calc->Solve("99-22-55");
            Assert::AreEqual(ret, (string)"99-22-55=22");
        }

        TEST_METHOD(SUB_MUL)
        {
            string ret = calc->Solve("77-6*11");
            Assert::AreEqual(ret, (string)"77-6*11=11");
        }

        TEST_METHOD(SUB_DIV)
        {
            string ret = calc->Solve("77-88/2");
            Assert::AreEqual(ret, (string)"77-88/2=33");
        }

        TEST_METHOD(MUL_ADD)
        {
            string ret = calc->Solve("22*33+11");
            Assert::AreEqual(ret, (string)"22*33+11=737");
        }

        TEST_METHOD(MUL_SUB)
        {
            string ret = calc->Solve("22*33-11");
            Assert::AreEqual(ret, (string)"22*33-11=715");
        }

        TEST_METHOD(MUL_MUL)
        {
            string ret = calc->Solve("22*33*99");
            Assert::AreEqual(ret, (string)"22*33*99=71874");
        }

        TEST_METHOD(MUL_DIV)
        {
            string ret = calc->Solve("22*33/11");
            Assert::AreEqual(ret, (string)"22*33/11=66");
        }

        TEST_METHOD(DIV_ADD)
        {
            string ret = calc->Solve("99/9+11");
            Assert::AreEqual(ret, (string)"99/9+11=22");
        }

        TEST_METHOD(DIV_SUB)
        {
            string ret = calc->Solve("99/9-10");
            Assert::AreEqual(ret, (string)"99/9-10=1");
        }

        TEST_METHOD(DIV_MUL)
        {
            string ret = calc->Solve("99/9*22");
            Assert::AreEqual(ret, (string)"99/9*22=242");
        }

        TEST_METHOD(DIV_DIV)
        {
            string ret = calc->Solve("99/9/11");
            Assert::AreEqual(ret, (string)"99/9/11=1");
        }

        /*
            運算數長度
        */
        TEST_METHOD(Length_1)
        {
            string ret = calc->Solve("9/3*2+8");
            Assert::AreEqual(ret, (string)"9/3*2+8=14");
        }

        TEST_METHOD(Length_2)
        {
            string ret = calc->Solve("90/3*22+8");
            Assert::AreEqual(ret, (string)"90/3*22+8=668");
        }

        TEST_METHOD(Length_3)
        {
            string ret = calc->Solve("90/30*2+89");
            Assert::AreEqual(ret, (string)"90/30*2+89=95");
        }
    };

}

Bug修復

  通過調試,對源程序的如下三個部分進行修復。git

string Calculator::Solve(string formula) {
    vector<string>* tempStack = new vector<string>();
    stack<char>* operatorStack = new stack<char>();
    int len = formula.length();
    int k = 0;
    for (int j = -1; j < len - 1; j++) {
        char formulaChar = formula[j + 1];
        if (j == len - 2 || formulaChar == '+' || formulaChar == '-' ||
            formulaChar == '*' || formulaChar == '/') {
            if (j == len - 2) {
                tempStack->push_back(formula.substr(k));
            }
            else {
                if (k <= j) {   // 判斷條件錯誤:k < j ===> k <= j
                    /*
                        substr 使用錯誤:
                        tempStack->push_back(formula.substr(k, j + 1));
                    */
                    /*----------修改後----------*/
                    tempStack->push_back(formula.substr(k, j - k + 1)); 
                    /*--------------------------*/
                }
                if (operatorStack->empty()) {
                    operatorStack->push(formulaChar);
                }
                else {
                    char stackChar = operatorStack->top();
                    if ((stackChar == '+' || stackChar == '-')
                        && (formulaChar == '*' || formulaChar == '/')) {
                        operatorStack->push(formulaChar);
                    }
                    else {
                        /*
                            to_string 使用錯誤:
                            tempStack->push_back(to_string(operatorStack->top()));  
                        */
                        /*----------修改後----------*/
                        string tempOp(1, operatorStack->top());
                        tempStack->push_back(tempOp);
                        /*--------------------------*/
                        operatorStack->pop();
                        operatorStack->push(formulaChar);
                    }
                }
            }
            k = j + 2;
        }
    }
// 如下略。
  • 錯誤一致使一位數計算時沒法將字符串中的數字截取插入臨時棧(tempStack)。
  • 錯誤二致使截取數字時截取到錯誤的長度的子串。
  • 錯誤三會將運算符轉換爲相應的ASCII碼,致使插入臨時棧的爲數字字符串而非運算符字符串。
相關文章
相關標籤/搜索