第一次接触“单元测试”这个要求,我和队友学习了一些示例后开始操作。如下展示一些建立单元测试的过程。
Step1:右键单击【解决方案】->左键单击【添加(D)】->【新建项目(N)】。

Step2:我的程序是c++项目,所以我依次点选【Visual C++】->【测试】->【本机单元测试】->【填写自己测试的名称(自己定义)】->【确定】。

Step3:这时需要写入测试的函数的来源文件和你要测试的语句。

Ps:在#include后的是该文件的相对路径:上一级文件夹中的主函数。
AreEqual()中第一个参数是函数的返回值,第二个参数是函数及其输入。

Step4:在此对所有的单元进行测试,依次点击【测试】->【调试】->【所有测试】。

Step5针对测试进行修改,如下截取2附图,运行通过或者不通过的情况。根据不同情况我们应该对本函数进行修改。
图一,未通过:

图二,通过测试

图三,多个测试依次次运行。

在开始测试的过程中经历了很多的坎坷,其中包括各种对之前代码的修改尝试,根据学习的教程的指引走的弯路(不按照教程的过程反而可以运行)等等。

在此博客中我学到了很多c++单元测试应用!感谢分享经验,我体会到了作为程序员“写博客”和“看博客”的重要性。

http://blog.csdn.net/qq_16542775/article/details/51860371

在此博客中,我学习到了有关“Assert”的方法。

而断言的正确与否只需要通过测试工具测试即可。如果测试通过说明此断言是正确的,反之就说明这个测试失败了。

断言有很多种,包括上面普通的Assert,还有字符串断言,集合断言等等。

注意Assert.AreEqual(expected, actual)这一行代码,Assert.AreEqua是测试expected和actual是不是相等,相等就认为成功,不相等就认为失败。同样用来判定的方法共有以下几个:
Assert.AreEqual() 测试指定的值是否相等,如果相等,则测试通过;
Assert.Inconclusive() 表示一个未验证的测试;
Assert.IsTrue() 测试指定的条件是否为True,如果为True,则测试通过;
Assert.IsFalse() 测试指定的条件是否为False,如果为False,则测试通过;
Assert.IsNull() 测试指定的对象是否为空引用,如果为空,则测试通过;
Assert.IsNotNull() 测试指定的对象是否为非空,如果不为空,则测试通过;

如下再粘贴一些相关的博客以备他日之需。

http://zhujiangtao.com/?p=1046

https://msdn.microsoft.com/zh-cn/library/hh694604.aspx(这个是官方文档!)

https://msdn.microsoft.com/en-us/library/hh694604.aspx
(English~)

要求1 对每个功能,先给出测试用例,然后再编码功能。请注意把测试用例视为功能需求完成的检验指标。 (40分)

功能1:判断是否是正整数。

测试用例包括:“负数”“小数”“字符”“字符串”“带空格的数”等等。(带空格的数其实需要其他的条件去判断)。

若为通过检验,说明输入的不是正整数,若通过检验说明输入的是真正数。

功能2:判断括号是否正确。

测试用例包括:多组2维数据([0-8][0-7])。输出若符合则说明匹配正确,不符合则说明匹配错误。

备注:因为使用的是数组,那么(4,0)代表的是第5行,第1列的内容。数量太多,做了4次测试

功能3:判断是否相等。

仅仅测试了其返回值。若返回1则说明正确,返回其他值说明错误(其实只能返回1,本测试用例用于测试“单元测试功能如何使用”)

功能X:

因为设计思路不同吧,我在进行编程的过程中,可以使用单元测试的函数并不多,主要原因在于一个“随机数”的问题,程序的第一步是生成算式,第二步是得到结果。运行生成算式的时候数字是随机的,那就意味着没有哪个数值是固定的,所以感觉“单元测试”不知道该怎么使用。

另一种情况就是我的模块做的“太大了”,以至于某个函数过于冗杂,“模块化”“功能化”不强,导致单元测试利用率不高。功能划分不明确导致的结果吧。

要求2 在博客报告测试用例全部fail 到 全部pass 的过程,报告事实 (fail到修改代码或者测试用例,到pass) 以及收获。 除了最初的框架,测试用例中存在一次性pass没有经过fail的,也报告一次性通过,给出如此优秀地实现了这部分功能的代码。(40分)

在进行单元测试的过程中,我使用了比较蠢笨的方法来依次测试某个函数功能:注释一句,测试一句。如图左显示,最终我的单元测试都以通过结尾。

功能一:判断是否为正整数。在我输入“非正整数”时,测试一直现实fail,直到输入正整数的测试用例时,它才pass。如下展示代码:

/*判断是否是正整数*/

bool isInteger(char* s) {
string str = s;
stringstream sin(str);
int a;
char b;
if (!(sin >> a))
return false;
if (sin >> b)
return false;
if (atoi(s) <= )
return false;
return true;
}

功能2:判断括号位置。

该功能我们在实现的过程中想法是这样的,因为我们的数字比较少,运算比较简单,所以我们采用的是手动写加括号的方式。turnBracket()函数就是将数组转换成对应位置的括号。

//turnBracket函数核心内容:

string turnBracket(int n, int m) {
switch (bracket_arr[n][m])
{
case 0:
return "";
case -1:
return "(";
case 1:
return ")";
case -2:
return "((";
case 2:
return "))";
default:
break;
}
} //手工模拟的括号数组:
/*
手动模拟加括号情况
0 无
-1 (
1 )
-2 ((
2 ))
*/
const int bracket_arr[9][8] = {
{ 0, 0, 0, 0, 0, 0, 0, 0 },
{ -1, 0, 0, 1, 0, 0, 0, 0 },
{ 0, 0, -1, 0, 0, 1, 0, 0 },
{ 0, 0, 0, 0, -1, 0, 0, 1 },
{ -1, 0, -1, 0, 0, 2, 0, 0 },
{ -2, 0, 0, 1, 0, 1, 0, 0 },
{ -1, 0, 0, 1, -1, 0, 0, 1 },
{ 0, 0, -2, 0, 0, 1, 0, 1 },
{ 0, 0, -1, 0, -1, 0, 0, 2 }
};
//进行拼接字符串的过程:
this->express = "";
this->express += (turnBracket(this->brackets, 0) + to_string(this->num[0]));
for (int i = 0, j = 1; i < M; i++, j += 2) {
this->express += (turnBracket(this->brackets, j) + this->character[i] + turnBracket(this->brackets, j + 1) + to_string(this->num[i]));
}
this->express += turnBracket(this->brackets, 7);

 代码展示结束,以上是我们进行单元测试的过程。

总结:面临新的问题,要勇敢的迎难而上。但是更多的需要去了解所有资料之后再启动,而不是像愣头青一样。要知其然,还要知其所以然!多学多看才有收获。

代码地址:

https://git.coding.net/Rio56/f4.git

 

2017秋-软件工程第四次作业(2)-结对使用TDD框架完成单元测试的更多相关文章

  1. Thunder-Beta发布-事后诸葛亮会议-2017秋-软件工程第十一次作业

    小组名称:Thunder项目名称:爱阅APP小组成员:王航 李传康 翟宇豪 邹双黛 苗威 宋雨 胡佑蓉 杨梓瑞一.设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有 ...

  2. 17秋 软件工程 第六次作业 Beta冲刺 Scrum1

    17秋 软件工程 第六次作业 Beta冲刺 Scrum1 各个成员冲刺期间完成的任务 重新梳理项目架构与当前进展,并且对我们的Alpha版本项目进行完整测试,将测试过程中发现的问题列入Github i ...

  3. 17秋 软件工程 第六次作业 Beta冲刺 Scrum2

    17秋 软件工程 第六次作业 Beta冲刺 Scrum2 我们组转会成员:杰麟: 我们组新成员:宏庆. 各个成员冲刺期间完成的任务 世强:完成分页功能的演示: 陈翔:完成超级管理员后端login模块: ...

  4. 17秋 软件工程 第六次作业 Beta冲刺 Scrum3

    17秋 软件工程 第六次作业 Beta冲刺 Scrum3 各个成员冲刺期间完成的任务 世强:完成手势签到模块,重构活动详情页面: 陈翔:完善超级管理员后端login模块,完成logout模块: 树民: ...

  5. 17秋 软件工程 第六次作业 Beta冲刺 Scrum4

    17秋 软件工程 第六次作业 Beta冲刺 Scrum4 各个成员冲刺期间完成的任务 世强:完成APP用户签到模块.群发短信模块前端界面: 陈翔:恢复Github项目,完成Scrum博客: 树民:和超 ...

  6. 17秋 软件工程 第六次作业 Beta冲刺 Scrum5

    17秋 软件工程 第六次作业 Beta冲刺 Scrum5 各个成员冲刺期间完成的任务 世强:完成APP端相册.部员管理.手势签到模块: 陈翔:完成Scrum博客.总结博客,完成超级管理员前后端对接: ...

  7. 17秋 软件工程 第六次作业 Beta冲刺 总结博客

    题目:团队作业--Beta冲刺 17秋 软件工程 第六次作业 Beta冲刺 总结博客 Beta冲刺过程中各个成员的贡献百分比 世强:15.5% 陈翔:14.5% 树民:12.0% 媛媛:14.0% 港 ...

  8. 数据采集与融合第四次作业:多线程以及scrapy框架的使用

    数据采集第四次作业:多线程以及scrapy框架的使用 任务一:单多线程的使用 单线程代码: from bs4 import BeautifulSoup from bs4 import UnicodeD ...

  9. 2017秋-软件工程第十二次作业(一)-PSP总结

    [回顾]:回顾开学时的博客并回答相关问题 1.回想一下你曾经对计算机专业的畅想当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么?答:当初的决定是以前的事情,没有改变.经历 ...

随机推荐

  1. Linux下安装 Redis

    一.部署前准备 1.首先上官网下载Redis 最新稳定的压缩包 2.通过远程管理工具,将压缩包拷贝到Linux服务器中,执行解压操作 [root@CentOS6 ~]# tar zxvf redis- ...

  2. MySQL必知必会 读书笔记三:检索数据和数据排序

    检索数据 SELECT语句 它的用途是从一个或多个表中检索信息. 为了使用SELECT检索表数据,必须至少给出两条信息--想选择什 么,以及从什么地方选择. 检索单个列 SELECT col_1 FR ...

  3. layui form表单 input输入框获取焦点后 阻止Enter回车自动提交

    最简单的解决办法,不影响其他操作,给提交按钮增加 type="button" 属性 完美解决 <button type="button" class=&q ...

  4. PHP实现openSug.js参数调试

    这是一款利PHP对百度搜索下拉框提示免费代码实现参数配置调试的程序源代码. 由想要对网站进行搜索下拉调试的站长朋友们进行方便.快速的效果演示,具体参考下面的PHP代码. 如何使用? 请新建一份PHP文 ...

  5. C#的哈希表Hashtable同步方法

    在多线程环境的操作中对Hashtable进行操作需要进行同步控制,有两种方法,一种是由.Net自动控制:一种是在代码中自己控制. 1.使用Hashtable.Synchronized进行同步 Hash ...

  6. Lingo解决最优化问题

    目录 Lingo解决优化问题 前言 一.优化模型介绍 二.运输问题 2.1 问题描述 2.2 问题分析 2.2 优化模型构建 2.3 模型求解 2.4 求解结果 三.待更新 Lingo解决优化问题 @ ...

  7. 使用 Linux 下的的logrotate进行日志的切割

    实际生产中,使用一个log文件来记录所有信息的话,一方面,时间过久,就会占用很大的空间:另一方面,就是一个文件记录对于后期日志的查看非常不利.为了解决查看了一下资料,发现linux里面有一个logro ...

  8. PHP.52-TP框架商城应用实例-前台4-商品详情页-面包屑导航、AJAX浏览历史

    面包屑导航  思路:根据商品的主分类向上取出所有上级分类即可 1.在分类模型中增加取出所有上级分类的方法 /********** [面包屑导航]取出一个分类所有上级分类 **********/ pub ...

  9. 北京Uber优步司机奖励政策(3月30日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  10. stm32中如何进行printf重定向用于串口调试输出

    1 在main中包含stdio.h 文件 2 Target选项框里选Use MicroLib 选项 3 在main中添加UART1_Configuration()初始化的代码 Uart1初始化,voi ...