• 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) <= 0)
            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

     

  • 相关阅读:
    Oracle Exadata和Exalogic利弊分析
    几个经常使用的正则验证
    開始开发 Dashboard Widget【翻译】文件夹
    j2ee 框架搭建所需jar包的作用
    【jQuery】复选框的批量处理:全选、非全选
    将 Android* x86 NDK 用于 Eclipse* 并移植 NDK 演示样例应用
    Socket connect error 99(Cannot assign requested address)
    解决w3wp.exe占用CPU和内存问题
    解决w3wp.exe占用CPU和内存问题
    解决w3wp.exe占用CPU和内存问题
  • 原文地址:https://www.cnblogs.com/-Rio56/p/7649906.html
Copyright © 2020-2023  润新知