第一次接触“单元测试”这个要求,我和队友学习了一些示例后开始操作。如下展示一些建立单元测试的过程。
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系统可执行文件添加环境变量使其跨终端和目录执行

    在命令行终端输入:echo $PATH 回车可打印出PATH变量对应的路径 现有一可执行文件qtFirstC,文件所在目录为:/home/lolors/qtFirstC 此时test只能在此目录下运行 ...

  2. 纯JS实现轮播图特效——详解

    <div id="slider"> <div id="sliderImgs"> <img src="img/mi04.j ...

  3. python 视频配音、剪辑

    一.FFmpeg的使用 首先下载FFmpeg然后将FFmpeg添加到环境路径中.运行cmd 输入ffmpeg无报错表示成功. 二.python中的使用 在python中执行cmd命令需要调用subpr ...

  4. IO流之字符流

    字符流产生的原因: 1.每次只能够读取一个字节或者一个字节数组,每次在需要转换成字符或者字符串的时候不是很方便2.不同的操作系统针对换行符的处理不方便3.有的时候会出现中文乱码(中文占两个字节,如果针 ...

  5. JAVA 使用Comparator接口实现自定义排序

    1.原则 Comparator接口可以实现自定义排序,实现Comparator接口时,要重写compare方法: int compare(Object o1, Object o2) 返回一个基本类型的 ...

  6. sql server 常用sql语句

    --删除约束 alter table productInfo drop constraint 约束名称 --删除列alter table productInfo drop column 列名 --添加 ...

  7. 从零开始一个http服务器(一)-开始

    从零开始一个http服务器 (一) 代码地址 : https://github.com/flamedancer/cserver git checkout step1 一个简单的socket serve ...

  8. nodejs module/require

    1. wrap up a module using module.exports, name the file to a.js var fun1=function(){ var stylus = re ...

  9. day 11 绘制轮廓

    #-*- coding:utf-8 -*- import cv2 import numpy as np #1.导入图像 #img = cv2.imread("home.jpg",0 ...

  10. 屏蔽Drupal中的“Notice: Undefined index”警告

    原因:drupal默认使用E_ALL,即输出所有错误和警告.我们只需要修改错误显示级别即可. 方法: 1. 打开\sites\default\settings.php 追加一行 ini_set('er ...