筆者根據做業的介紹以及Visual Studio 2017 文檔的相關說明,進行了Visual Studio 單元測試的簡單應用。html
Tips | Link |
---|---|
課程連接 | 2019春季計算機學院軟件工程(羅傑)(北京航空航天大學) |
實驗做業連接 | [2019BUAA軟工助教]第0次代碼做業 |
實驗成果鏈接 | GitHub |
參考文獻 | Visual Studio 2017 文檔 |
單元測試從如下三方面展開:c++
#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"); } }; }
通過調試,對源程序的如下三個部分進行修復。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; } } // 如下略。