第一次接触“单元测试”这个要求,我和队友学习了一些示例后开始操作。如下展示一些建立单元测试的过程。
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. Ubuntu 16.04LTS 更新清华源

    1 备份原来的更新源 cp /etc/apt/sources.list /etc/apt/sources.list.backup 如果提示权限不够就输入下面两行,先进入到超级用户,再备份 sudo - ...

  2. 转:30分钟学会如何使用Shiro

    引自:http://www.cnblogs.com/learnhow/p/5694876.html 本篇内容大多总结自张开涛的<跟我学Shiro>原文地址:http://jinniansh ...

  3. C#获取本地磁盘信息

    直接上干货简单易懂 //磁盘监控(远程/本地) //需要引用System.Management.dll public class RemoteMonitoring { private static s ...

  4. Yii中实现分页

    $criteria = new CDbCriteria(); // 查询字段 $criteria->select = 'id, name, create_time'; // 排序 $criter ...

  5. Spark_安装配置_运行模式

    一.Spark支持的安装模式: 1.伪分布式(一台机器即可) 2.全分布式(至少需要3台机器) 二.Spark的安装配置 1.准备工作 安装Linux和JDK1.8 配置Linux:关闭防火墙.主机名 ...

  6. vue.js使用axios

    使用axios的两种调用方式 1.安装axios $ cnpm install axios 2.在vue入口文件main.js中引入(推荐全局引入),或是在当前页面中引入(局部) import axi ...

  7. tcp滑动窗口与拥塞控制

    TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现.一.滑动窗口协议     所谓滑动窗口协议,自己理解有两点:1. “窗口 ...

  8. 北京Uber优步司机奖励政策(12月15日)

    用户组:人民优步及电动车(适用于12月15日) 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:htt ...

  9. 成都Uber优步司机奖励政策(1月7日)

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

  10. python 水仙花

    #简单def narcissus(): for n in range(100, 1000, 1): a, b, c = n//100, (n//10)%10, (n%100)%10 if a ** 3 ...