⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dev2.htm

📁 这是一个能够自动生成文档的程序
💻 HTM
📖 第 1 页 / 共 2 页
字号:
					,很多时候,要针对特殊输入进行调试都是很大费时的;<br>
					&nbsp;&nbsp;&nbsp;
					由于是公共输入源,输入数据很难管理,尤其是条件断点更不可能无限期地保存,以后需要再次调试时可能要做很多重复工作。<br>
					&nbsp;&nbsp;&nbsp;
					如上所述,自然驱动并不省时,不过这种方式的时间消耗隐藏在调试过程中,通常不会引起重视,其实&quot;隐藏于调试过程中&quot;,其成本更大,因为分散了开发人员的注意力,影响思维的连续性。<br>
					&nbsp;&nbsp;&nbsp;
					自然驱动的更主要问题是不全面,开发人员常常会将思维局限于现有的输入源,导致一些可能输入根本就没有考虑到,在本例中,很可能只是试一下解析一两个文件,检查得到的结果是否正确,如果文件中没有
					带数组的参数,那这种输入很可能就被忽略掉。这种不全面,导致代码功能不齐,健壮性差,后期测试和维护成本居高不下,甚至导致项目的失败,因此,这是看起来高效,实际上很低效的方式,读者可以在看完后面两种方式的介绍后,自
					已尝试并对比一下,可以拿任何有一定复杂度的代码编写来对比,不局限于这里所举的例子。<br>
					<br>
					<br>
					<center><b>专门驱动</b></center>
					
					<br>
					&nbsp;&nbsp;&nbsp;
					专门驱动离单元测试只有一步之遥了,只要在驱动代码中添加判断预期输出的语句就构成了完整的测试代码,因此,在实际工作中,采用专门驱动最好是边编码边测试,并使用测试代码作为调试驱动。下面是为函数CExFunction::ParseOneParameter 
					()编写的调试驱动代码:<br>
					<br>
					{CExFunction* pObj = <font color="#0000FF">new</font> CExFunction();<br>
					CTokenList iList;<br>
					CTokenReader reader;<br>
					reader.ReadTokenList(iList, &quot;int i&quot;);<br>
					PARAMETER* ret = pObj-&gt;ParseOneParameter(iList) ;<br>
					ASSERT( ret-&gt;type == &quot;int&quot; );<br>
					ASSERT( ret-&gt;name == &quot;i&quot; );<br>
					reader.ClearTokenList(iList); <br>
					<font color="#0000FF">delete</font> pParam;<br>
					<font color="#0000FF">delete</font> pObj;}<br>
					<br>
					&nbsp;&nbsp;&nbsp;
					上面的代码其实是一个测试用例的完整代码,测试代码通常都是很简单的,功能无非是使被测试的代码得于执行,被测试代码通常都涉及到外部数据,如参数、成员变量、全局变量什么的,这些数据当然要设定初始值,例如,上面的测试用例是将字符串&quot;int 
					i&quot;经过CTokenReader对象的ReadTokenList方法转换成CToken对象指针的列表作为参数iList的输入。<br>
					<br>
					&nbsp;&nbsp;&nbsp;
					在实际工作中,函数的输入输出常常不是简单的数据类型,而是某些对象甚至是对象的集合,本例中,输入的数据就是CToken对象
					指针的列表。这种情况下, 
					一般借助现有的代码来生成数据,通常,这些&quot;现在代码&quot;都是存在的,因为即使不做测试,也总有代码要调用该函数的,调用代码本来就需要生成相应的数据。本例中,CTokenReader::ReadTokenList()函数就是把字符串转换为CToken对象指针的列表。<br>
					<br>
					&nbsp;&nbsp;&nbsp;
					只要写完了第一个测试用例的代码,更多的用例就简单了,只要拷贝并对输入输出数据进行修改就行。细心的读都可能已注意到,第一个测试用例的前后加了{},这是为了多个测试用例可以使用相同的变量名。<br>
					<br>
					&nbsp;&nbsp;&nbsp;
					使用这种方法,建立测试代码通常是很快的。编写很简单的函数时不需要调试,当然也不需要测试代码。测试代码的组织也很简单:一个产品工程对应一个测试工程,一个产品类对应一个测试类,一个需要测试的产品函数对应一个测试函数。测试工程可以加一个简单的界面,以便执行指定的测试,也可以使用相应的工具如CppUnit。<br>
					<br>
					&nbsp;&nbsp;&nbsp;
					再回到我们的主题:调试。有了测试代码,调试就简单了,要调试某种输入,只要在相应的测试用例中加断点就行了。使用这种方式,仅就调试来说,好处也是非常明显的:<br>
					&nbsp;&nbsp;&nbsp;
					所有输入在一起列出来,调试比较全面,程序员的思维也会比较全面;<br>
					&nbsp;&nbsp;&nbsp;
					要调试指定的输入很容易,通常不需要高级断点,更不需要通过反复跟踪来捕捉需要的输入;<br>
					&nbsp;&nbsp;&nbsp;
					调试数据可以永久保存,避免了以后修改代码时的重复工作。<br>
					<br>
					<br>
					</p>
					<center><b>自动驱动</b></center>
					<br>
					&nbsp;&nbsp;&nbsp;
					在Visual Unit的支持下编码调试,除了兼具自然驱动和专门驱动的优点外,还能享受Visual 
					Unit的独特殊功能带来的便利。<br>
					<br>
					&nbsp;&nbsp;&nbsp;
					首先我们用个人版来说明,个人版是免费的版本,并且开发商也提供免费的基本技术支持。<br>
					<br>
					&nbsp;&nbsp;&nbsp;
					Visual 
					Unit具有丰富的文档,包括视频教程,这里不再叙述其基本使用方法。只要选择要测试(调试)的类和函数(如果使用企业版的IDE插件,会根据当前文档和光标位置自动选择),VU就会生成测试代码,并弹出测试用例编译器。VU是自动生成测试代码,而不是自动生成测试用例,也就是说,输入输出数据是由用户指定的,不过VU已经生成了输入输出数据的声明。下面是本例中VU生成的第一个测试用例的输入输出:<br>
					<br>
					输入部分:<br>
					CTokenList iList = <br>
					<br>
					输出部分:<br>
					ret ==<br>
					<br>
					&nbsp;&nbsp;&nbsp;
					这里的“=”和“==”仅仅表示可能需要赋值或判断输出,对于基本数据类型,可以直接填写数值,高级数据类型需要灵活处理(详细信息请查看帮助或教程)。只要把输入输出改为这样就完成了第一个测试用例的建立:<br>
					<br>
					输入部分:<br>
					CTokenList iList = <font color="#008000">//多余的=会自动删除</font><br>
					CTokenReader reader<br>
					reader.ReadTokenList(iList, &quot;int i&quot;)<br>
					<br>
					输出部分:<br>
					ret-&gt;type == &quot;int&quot;<br>
					ret-&gt;name == &quot;i&quot;<br>
					<br>
					&nbsp;&nbsp;&nbsp;
					更多的测试用例,只要点击&quot;新建&quot;,就会自动拷贝当前用例,只要修改输入输出就行了。这里没有涉及到成员变量和变局全量,不过都很简单的(成员变量用点操作符访问,全局变量直接访问),请查看帮助。<br>
					<br>
					&nbsp;&nbsp;&nbsp;
					可以看出,使用VU建立调试支持环境是很快速的:对于第一个测试用例,输入输出比较复杂时需要写少量简单的代码,输入输出简单时直接填写输入输出数值,其他测试用例只需点击一个按钮拷贝现有测试用例并修改输入输出就行,可以选择相近的用例来生成新的用例,这样通常只需要修改一两个数据就可以得到想要的用例。<br>
					<br>
&nbsp;&nbsp;&nbsp; 那么,还可以得到哪些好处呢?<br>
					&nbsp;&nbsp;&nbsp;
					方便地进入调式:在被调试函数的入口加断点,并调试测试工程即可进入调试;<br>
					&nbsp;&nbsp;&nbsp;
					方便地选择输入:在测试用例编辑器中轻点鼠标即可指定要调试的输入,如果执行了测试,只要点击出错的测试,就会自动选择相应的输入;<br>
					&nbsp;&nbsp;&nbsp;
					方便地切换输入:调试过程中,不需要退出调试,就可以切换到其他输入:只要在测试用例编辑器中选择另一个测试用例,用调试器的&quot;执行到光标所在行&quot;命令回到函数入口,即可切换到新的输入;<br>
					&nbsp;&nbsp;&nbsp;
					无限制后退重复:用调试器的&quot;执行到光标所在行&quot;命令可以自由地后退和重复执行,其实现的原理是&quot;重来&quot;,后退时相关数据也会&quot;还原&quot;,感觉上是真正的&quot;后退&quot;,这个奇特而有用的功能是VU生成的测试代码自动实现的。<br>
					<br>
					&nbsp;&nbsp;&nbsp;
					上述是免费的个人版所具有功能,VU企业版除了具有这些功能外,还具有&quot;描述程序行为&quot;的功能:<br>
					&nbsp;&nbsp;&nbsp; 
					自动输出参数、成员变量的输入输出值,返回值,用户也可以用简单的语法输出任何变量或表达式的值。这些数值都是上下文相关的,也就是说,同一个用例的相关值放在一起;<br>
					&nbsp;&nbsp;&nbsp;
					显示在任一个用例下程序所执行的代码,可以很方便地查看程序是否按预想的流程执行。<br>
					&nbsp;&nbsp;&nbsp;
					程序无论多复杂,无非就是执行一些代码,读写、计算一些数据,因此,上述两方面信息已完整地描述了程序行为,很容易看出&quot;程序干了什么&quot;。这个功能大幅度地提高了开发人员的工作效率:<br>
					&nbsp;&nbsp;&nbsp;
					帮助整理、验证编程思路:写几行代码,就可以看看&quot;程序干了什么&quot;,轻松判断&quot;现在所写的对不对&quot;,也比较容易想清楚&quot;接下来要怎么写&quot;。<br>
					&nbsp;&nbsp;&nbsp;
					快速找出程序错误:根据输入输出数据和所执行的代码,通常可以很快判断程序是否按预期工作并找到出错原因,比单步调试要快得多。<br>
					&nbsp;&nbsp;&nbsp;
					编程的时间消耗主要不在于敲键盘,而在于编程思路和调试,VU企业版可谓&quot;对症下药&quot;,在这两方面大量提高工作效率。<br>
					<br>
					&nbsp;&nbsp;&nbsp;
					以上所述,都是针对软件开发过程中无可逃避的工作:编码调试。仅从时间上来说,对于编写调试有一定复杂度的程序,使用专门驱动,可能比自然驱动多费一点时间,但也是完全合算的,至于自动驱动,如果使用VU个人版,大概能省时10%,如果使用企业版,则可以省时20-50%!读者可以自行尝试比较一下。是否省时还不是最重要的,更高的价值在于:使用专门驱动或自动驱动编码调试,实际上也已经把令人望而生畏的单元测试工作完成了一半,并清除了实施单元测试的最主要障碍。<br>
 </p>
					<table border="0" width="641" id="table1" cellspacing="1" cellpadding="0">
					<tr>
						<td width="320">
						<p align="center">上一页:<a href="Dev1.htm">“千般路”与“磨豆腐”</a></td>
						<td width="320">
						<p align="justify">下一页:<a href="Dev3.htm">实现彻底单元测试</a></td>
					</tr>
					</table>
					</td></tr></table>
				</td>
              </tr>
              <tr> 
                <td height="10" bgcolor="#ffffff"></td>
              </tr>
              <tr> 
                <td height="30" bgcolor="#f2f2f2" align=right valign=center><a href="javascript:history.back()"><img src="pic/back.gif" alt="返回上页" border="0"></a></td>
              </tr>
            </table></td>
        </tr>
      </table></td>
    <td width="57" valign="top" bgcolor="#c3daec"> </td>
  </tr>
</table>

<!--PAGE_TAIL_BEGIN-->
<table width="800" height="107" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr> 
    <td height="107" valign="top" bgcolor="#c3daec"> 
      <table width="687" height="37" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" class="td2">

                <tr> 
                  <td  background="pic/foot_back.gif" style="letter-spacing:1pt;"><div align="center"><a href="/">首 页</a> | <a href="/products/"> 产品介绍</a> |                                    
                      <a href="/download/"> 下载中心</a> | <a href="/teaching/">                                                
                      演示与教程</a> | <a href="/bbs/"> 技术论坛</a> | <a href="/faq/"> 问题解答</a> | <a href="/contactus.htm"> 联系我们</a></div></td>                                                
                </tr>        
      </table>
      <table width="687" height="70" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" class="td2">
        <tr> 
          <td background="pic/foot_back2.gif" bgcolor="#FFFFFF"> 
            <table width="90%" border="0" align="center" cellpadding="0" cellspacing="0">
              <tr> 
                <td><div align="center"><font color="#333333">Copyright &copy;                                
                    2006 KaileSoft.cn All Rights Reserved </font></div></td>                                                
              </tr>
              <tr> 
                <td><div align="center"><font color="#333333">广州市凯乐软件技术有限公司</font></div></td>                               
              </tr>
            </table></td>
        </tr>
      </table></td>
  </tr>
</table>
<!--PAGE_TAIL_END-->

</body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -