Visual Studio 单元测试的简单应用

写在前面

  笔者根据作业的介绍以及Visual Studio 2017 文档的相关说明,进行了Visual Studio 单元测试的简单应用。

Tips Link
课程链接 2019春季计算机学院软件工程(罗杰)(北京航空航天大学)
实验作业链接 [2019BUAA软工助教]第0次代码作业
实验成果连接 GitHub
参考文献 Visual Studio 2017 文档

单元测试代码

  单元测试从以下三方面展开:

  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修复

  经过调试,对源程序的以下三个部分进行修复。

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码,导致插入临时栈的为数字字符串而非运算符字符串。

[2019BUAA软工]第0次代码作业的更多相关文章

  1. [BUAA软工]第0次个人作业

    [BUAA软工]第0次个人作业 本次作业所属课程 : 2019BUAA软件工程 本次作业要求: 第0次个人作业 我在本课程的目标: 熟悉软件工程流程,规范开发习惯 本次作业的帮助: 熟悉课程流程 Pa ...

  2. [2017BUAA软工]第0次个人作业

    第一部分:结缘计算机 1.你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 我觉得我选择计算机系完全是误打误撞吧.当时我的分数上北航是没问题的,所以填专业时就是机械,电气,自动化,计算机等 ...

  3. 2017[BUAA软工]第0次个人作业

    第一部分:结缘计算机 1.你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? ●其实填写志愿之前并不知道要学什么专业,当初选择计算机是因为计算机就业前景好.方向多.计算机应用的领域无处不在, ...

  4. [2019BUAA软工助教]第0次代码作业

    [2019BUAA软工助教]第0次代码作业 前言 本博客为完成结对项目所需的先导知识,题目不难,请认真对待 :) 欢迎来到软件工程 :) 注:本次实验为附加作业,不做不扣分,做了有附加分 Part 0 ...

  5. [2019BUAA软工助教]第0次个人作业

    [2019BUAA软工助教]第0次个人作业 一.前言 我认为人生就是一次次地从<存在>到<光明>. 二.软件工程师的成长 博客索引 同学们在上这门课的时候基本都是大三,觉得在大 ...

  6. [2019BUAA软工助教]结对编程 - 小结

    [2019BUAA软工助教]结对编程 - 小结 一.评分规则 博客 博客共五十分 序号 要求 分值 1 在文章开头给出Github项目地址 1 2 在开始实现程序之前,在下述PSP表格记录下你估计将在 ...

  7. [2019BUAA软工助教]第一次阅读 - 小结

    [2019BUAA软工助教]第一次阅读 - 小结 一.评分规则 总分 16 分,附加 2 分,共 18 分 markdown格式统一且正确 - 2分 不统一:扣 1 分 不正确:扣 1 分(例如使用代 ...

  8. 《软工实践》第零次作业 - 一些QA

    <软工实践>第零次作业 - 一些QA Q&A (1)回想一下你初入大学时对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的? 你认为过去两年中接触到的课程是否符合你对计算机 ...

  9. [2019BUAA软工助教]Alpha阶段无人转出申请审核结果

    [2019BUAA软工助教]Alpha阶段无人转出申请审核结果 一.队伍信息 队伍名 项目 人数 红太阳 社团 8(6+2) pureman 博客园 6 水哥牛逼 招募 6 葫芦娃 拖拽Pytorch ...

随机推荐

  1. HDU 2955 变形较大的01背包(有意思,新思路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 Robberies Time Limit: 2000/1000 MS (Java/Others) ...

  2. MacOS在Finder中建立快速新建txt的workflow

    Mac是不支持右键直接新建txt的,因此有时候需要用到文本文稿的时候会比较麻烦.   因此这里提供一种个人认为比较方便的方法,让Mac也能很简洁的新建txt文件.   工具介绍: Automator ...

  3. 使用zabbix发送邮件的简易设置流程(存档用)

    1.安装邮件软件 (一般默认安装sendmail,这样apache也不用重新设置.) $sudo yum install sendmail 2.在zabbix上设置发送邮件用的本地邮箱 选择管理-&g ...

  4. Docker:unauthorized: incorrect username or password.

    用VS2017编译DockerCompose项目,显示错误:unauthorized: incorrect username or password. 打开命令行工具,输入docker login命令 ...

  5. sqlplus 中 各列对齐设定

    设置列标题的对齐方式 JUSTFIFY  {L[EFT]|C[ENTER]|R[IGHT]} SQL> col ename justify center SQL> /

  6. 三层BP神经网络的python实现

    这是一个非常漂亮的三层反向传播神经网络的python实现,下一步我准备试着将其修改为多层BP神经网络. 下面是运行演示函数的截图,你会发现预测的结果很惊人! 提示:运行演示函数的时候,可以尝试改变隐藏 ...

  7. 洛谷 P1350 车的放置

    洛谷 P1350 车的放置 题目描述 有下面这样的一个网格棋盘,a,b,c,d表示了对应边长度,也就是对应格子数. 当a=b=c=d=2时,对应下面这样一个棋盘 要在这个棋盘上放K个相互不攻击的车,也 ...

  8. 初窥Linux之我最常用的20条命令

    1.cd命令   这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径.如: cd /root/Docements # 切 ...

  9. 网络设备重的loopback接口

    回环接口在我们做试验的过程有典型的应用,几乎可以离不开它,一个虚拟的接口,给我带来了很大的方便,有了回环接口,你可以不用为你的PC,来添加第二块物理网卡,就可以完成VM,服务器搭建,群集,VPN等试验 ...

  10. 微信小程序——手把手教你写一个微信小程序

    前言 微信小程序年前的跳一跳确实是火了一把,然后呢一直没有时间去实践项目,一直想搞但是工作上不需要所以,嗯嗯嗯嗯嗯emmmmm..... 需求 小程序语音识别,全景图片观看,登录授权,获取个人基本信息 ...