2017秋-软件工程第四次作业(2)-结对使用TDD框架完成单元测试
第一次接触“单元测试”这个要求,我和队友学习了一些示例后开始操作。如下展示一些建立单元测试的过程。
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框架完成单元测试的更多相关文章
- Thunder-Beta发布-事后诸葛亮会议-2017秋-软件工程第十一次作业
小组名称:Thunder项目名称:爱阅APP小组成员:王航 李传康 翟宇豪 邹双黛 苗威 宋雨 胡佑蓉 杨梓瑞一.设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有 ...
- 17秋 软件工程 第六次作业 Beta冲刺 Scrum1
17秋 软件工程 第六次作业 Beta冲刺 Scrum1 各个成员冲刺期间完成的任务 重新梳理项目架构与当前进展,并且对我们的Alpha版本项目进行完整测试,将测试过程中发现的问题列入Github i ...
- 17秋 软件工程 第六次作业 Beta冲刺 Scrum2
17秋 软件工程 第六次作业 Beta冲刺 Scrum2 我们组转会成员:杰麟: 我们组新成员:宏庆. 各个成员冲刺期间完成的任务 世强:完成分页功能的演示: 陈翔:完成超级管理员后端login模块: ...
- 17秋 软件工程 第六次作业 Beta冲刺 Scrum3
17秋 软件工程 第六次作业 Beta冲刺 Scrum3 各个成员冲刺期间完成的任务 世强:完成手势签到模块,重构活动详情页面: 陈翔:完善超级管理员后端login模块,完成logout模块: 树民: ...
- 17秋 软件工程 第六次作业 Beta冲刺 Scrum4
17秋 软件工程 第六次作业 Beta冲刺 Scrum4 各个成员冲刺期间完成的任务 世强:完成APP用户签到模块.群发短信模块前端界面: 陈翔:恢复Github项目,完成Scrum博客: 树民:和超 ...
- 17秋 软件工程 第六次作业 Beta冲刺 Scrum5
17秋 软件工程 第六次作业 Beta冲刺 Scrum5 各个成员冲刺期间完成的任务 世强:完成APP端相册.部员管理.手势签到模块: 陈翔:完成Scrum博客.总结博客,完成超级管理员前后端对接: ...
- 17秋 软件工程 第六次作业 Beta冲刺 总结博客
题目:团队作业--Beta冲刺 17秋 软件工程 第六次作业 Beta冲刺 总结博客 Beta冲刺过程中各个成员的贡献百分比 世强:15.5% 陈翔:14.5% 树民:12.0% 媛媛:14.0% 港 ...
- 数据采集与融合第四次作业:多线程以及scrapy框架的使用
数据采集第四次作业:多线程以及scrapy框架的使用 任务一:单多线程的使用 单线程代码: from bs4 import BeautifulSoup from bs4 import UnicodeD ...
- 2017秋-软件工程第十二次作业(一)-PSP总结
[回顾]:回顾开学时的博客并回答相关问题 1.回想一下你曾经对计算机专业的畅想当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么?答:当初的决定是以前的事情,没有改变.经历 ...
随机推荐
- 【读书笔记 - Effective Java】03. 用私有构造器或者枚举类型强化Singleton属性
实现Singleton(代表本质上唯一的系统组件)的三种方法: 1. 保持私有构造器,导出公有的静态成员,客户端访问该类的唯一实例. 2. 保持私有构造器,公有的成员是静态工厂方法. 3. 单元素的枚 ...
- Tornado异步与延迟任务
最近一直在研究Tornado异步操作,然而一番研究后发现要使一个函数异步化的最好方法就是采用相关异步库,但目前很多功能强大的库都不在此列.经过一番查找文档和搜索示范,终于发现了ThreadPoolEx ...
- mysql8.0新增用户及密码加密规则修改
MySQL8.0已经发布GA版,当前最新GA版本为8.0.12.虽然相对于之前版本,MySQL8.0没有加入新元素,但是,经过代码重构,MySQL8.0的优化器更加强大,同时也有一些新特性,如支持索引 ...
- php ecshop 二级域名切换跳转时session不同步,解决session无法共享同步导致无法登陆或者无法退出的问题
echshop基础上做了单点登录的 一级域名与二级域名 退出时 清空session 都是一级域名的session 因为二级域名的session是设置在二级域名上的 echshop基础上没有做单点登录的 ...
- 【NXP开发板应用—智能插排】4. PWM驱动
[前言] 首先感谢深圳市米尔科技有限公司举办的这次活动并予以本人参加这次活动的机会,以往接触过嵌入式,但那都是皮毛,最多刷个系统之类的,可以说对于嵌入式系统开发这件事情是相当非常陌生的,这次活动为我提 ...
- 1010 一元多项式求导 (25 分) C语言
设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为nxn−1.) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数).数字间以空格分隔. ...
- angularjs transitions
http://angular-transitions.mgechev.com/#/view/page1 https://scotch.io/tutorials http://stackoverflow ...
- python的bif介绍
Python是面向对象的解释性程序设计语言,Python的语法简洁,特点是用空白符作为语句缩进. BIF(bulit in function)内置函数,就是Python自身提供的函数功能,编程者直接使 ...
- 如何实现最佳的跨平台游戏体验?Unity成亮解密实时渲染
7月31日,2018云创大会游戏论坛在杭州国际博览中心103B圆满举行.本场游戏论坛聚焦探讨了可能对游戏行业发展有重大推动的新技术.新实践,如AR.区块链.安全.大数据等. Unity大中华区技术经理 ...
- 在Linux CentOS7系统中搭建LNMP
LNMP就是Linux+Nginx+MySQL+PHP,既然是在Linux CentOS7那么Linux就是已经安装好了.所以接下百度一下接下来的教程,整理测试如下: 教程是centos6.2的有点老 ...