这是本人根据多年经验提出的衡量C/C++单元测试工具能否胜任实际项目的技术指标,供需要评估单元测试工具的朋友们参考。
1、 自动隔离测试目标
a. 可根据测试任务,设置指定的文件为测试目标;
b. 对于不测试,但可能大量依赖的文件,可以设为调用实际代码;
c. 对于不属于a和b的文件,自动生成桩代码。
2、 自动生成测试代码
a. 自动生成测试文件,以及执行测试所需的代码框架;
b. 自动为每个类、每个函数生成测试类、测试函数;
c. 可以根据指定的数据,生成对应的输入输出代码。
3、 自动表格化
a. 可以通过双击或类似的简便操作,将数据移到表格中;
b. 可以在表格中建立、删除、编辑用例。
4、 解决可测性问题
a. 可以在用例中直接设置底层函数的返回值、输出参数的值,以及底层函数所修改的全局变量的值;
b. 可以在用例中设置局部变量的值;
c. 对于a和b所设置的数据,可以移到表格中,与其他数据一起编辑和管理;
d. 可以判断局部变量的计算结果是否符合预期。
5、 白盒覆盖
a. 自动统计以下覆盖率:语句覆盖、条件覆盖、分支覆盖、C/DC、MC/DC、路径覆盖。
b. 未覆盖的逻辑单位标示清晰:在代码中标出未覆盖的语句、条件值、判断值、MC/DC;自动画出程序的逻辑结构图,标示未覆盖的分支与路径。
c. 提供协助找出遗漏用例的功能,例如,针对某个指定的未覆盖单位,自动从现有用例中计算出最近似的用例,并提供修改提示,或类似的功能,以解决难于实现高标准覆盖的问题。
6、 自动用例
a. 自动生成边界测试用例,检测崩溃、超时等极端错误。
7、 测试报告
a. 自动生成测试报告;
b. 测试报告需包括以下内容:所有函数的覆盖率数据;用例的代码、每个用例的输入与预期输出、每个用例的实际输出,并标示报错的用例。
8、 支持边开发边测试,促进开发效率的提升
a. 当产品代码修改时,同步更新测试代码,自动执行测试;
b. 测试结果直观地描述程序行为:输入是什么,该输入下执行了哪些代码,产生了什么输出。
===========================• 天气预报查询==========================
--------WebTianQi.aspx前台------------
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True"
Xonselectedindexchanged="DropDownList1_SelectedIndexChanged">
</asp:DropDownList>
<asp:DropDownList ID="DropDownList2" runat="server">
</asp:DropDownList>
<asp:Button ID="btnChaKan" runat="server" Xonclick="btnChaKan_Click" Text="查看" />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
---------WebTianQi.aspx-后台------------
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
cn.com.webxml.www.WeatherWebService weather = new
cn.com.webxml.www.WeatherWebService();
this.DropDownList1.DataSource=weather.getSupportProvince();
this.DropDownList1.DataBind();
}
}
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
cn.com.webxml.www.WeatherWebService weather = new cn.com.webxml.www.WeatherWebService();
BindCity(weather);
}
private void BindCity(cn.com.webxml.www.WeatherWebService weather)
{
this.DropDownList2.Items.Clear();
string[] strs = weather.getSupportCity(this.DropDownList1.SelectedValue);
foreach (string item in strs)
{
DropDownList2.Items.Add(new ListItem(item.Substring(0, item.IndexOf("("))));
}
}
protected void btnChaKan_Click(object sender, EventArgs e)
{
cn.com.webxml.www.WeatherWebService weather = new cn.com.webxml.www.WeatherWebService();
string[] strs=weather.getWeatherbyCityName(this.DropDownList2.SelectedValue);
this.Label1.Text = strs[0] + ":"+strs[1] + ":<br/>";
this.Label1.Text += "气温:" + strs[5] + ";风向和风力:" + strs[7];
}
=================• 列车时刻表查询 ===============================
------------WebLieCheShiKeBiao.aspx前台------
<body>
<form id="form1" runat="server">
<div>
<br />
发车站:<asp:TextBox ID="txtFaCheZhan" runat="server"></asp:TextBox>
<br />
到达站:<asp:TextBox ID="txtDaoDaZhan" runat="server"></asp:TextBox>
<br />
UserId:<asp:TextBox ID="txtUserId" runat="server"></asp:TextBox>
<span>商业用户ID(普通用户不需要)</span><br />
<asp:Button ID="btnChaXun" runat="server" Xonclick="btnChaXun_Click" Text="查询" />
<br />
<br />
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
</div>
</form>
</body>
-----------WebLieCheShiKeBiao.aspx.cs后台-----------------
protected void btnChaXun_Click(object sender, EventArgs e)
{
cn.com.webxml.www1.TrainTimeWebService train = new
cn.com.webxml.www1.TrainTimeWebService();
DataSet ds=train.getStationAndTimeByStationName(txtFaCheZhan.Text, txtDaoDaZhan.Text,
txtUserId.Text);
this.GridView1.DataSource = ds;
this.GridView1.DataBind();
}
==========================• 电话号码查询 ==========================
--------WebDianHuaHaoMa.aspx前台----------
<body>
<form id="form1" runat="server">
<div>
请输入手机号码:<asp:TextBox ID="txtHaoMa" runat="server"></asp:TextBox>
<br />
userID:<asp:TextBox ID="txtUserId" runat="server"></asp:TextBox>
<span>商业用户ID不用填写<br />
</span>
<asp:Button ID="btnChaXun" runat="server" Xonclick="btnChaXun_Click" Text="查询" />
<br />
<asp:Label ID="Label1" runat="server"></asp:Label>
</div>
</form>
</body>
--------WebDianHuaHaoMa.aspx.cs后台-------
protected void btnChaXun_Click(object sender, EventArgs e)
{
cn.com.webxml.webservice.MobileCodeWS mobile = new cn.com.webxml.webservice.MobileCodeWS
();
Label1.Text= mobile.getMobileCodeInfo(txtHaoMa.Text, txtUserId.Text);
}
==========================• 中英文翻译==========================
------WebZhongYingWenFanYi.aspx前台------------------------
<body>
<form id="form1" runat="server">
<div>
请输入英文或中文:<asp:TextBox ID="txtWord" runat="server"></asp:TextBox>
<asp:Button ID="btnFanYi" runat="server" Text="翻译" Xonclick="btnFanYi_Click" />
<br />
<asp:Label ID="Label1" runat="server" Text=""></asp:Label>
</div>
</form>
</body>
------WebZhongYingWenFanYi.aspx.cs后台------------------------
protected void btnFanYi_Click(object sender, EventArgs e)
{
cn.com.webxml.www2.TranslatorWebService translator = new
cn.com.webxml.www2.TranslatorWebService();
string[] strs=translator.getEnCnTwoWayTranslator(txtWord.Text);
Label1.Text = strs[0] + ";" + strs[1];
}
==========================• 验证码图片==========================
--------WebYanZhengMa.aspx前台----------------------
<body>
<form id="form1" runat="server">
<div>
请输入验证码(为英文/数字)
<asp:TextBox ID="txtYZM" runat="server"></asp:TextBox>
<br />
<br />
<asp:Button ID="btnShengCheng" runat="server" Xonclick="btnShengCheng_Click"
Text="生成" />
<br />
</div>
</form>
</body>
--------WebYanZhengMa.aspx.cs后台----------------------
protected void btnShengCheng_Click(object sender, EventArgs e)
{
System.IO.MemoryStream bstream = new System.IO.MemoryStream();
cn.com.webxml.www3.ValidateCodeWebService validate = new
cn.com.webxml.www3.ValidateCodeWebService();
byte[] Ary=validate.enValidateByte(txtYZM.Text);
HttpContext.Current.Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.ContentType = "image/Png";
HttpContext.Current.Response.BinaryWrite(Ary);
HttpContext.Current.Response.End();
}
-----------Web.config------------------
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup,
System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="_2013_1_6.Properties.Settings"
type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<connectionStrings>
<add name="studentConstr" connectionString="data source=.;initial catalog=student;user
id=sa;password=111111"/>
</connectionStrings>
<applicationSettings>
<_2013_1_6.Properties.Settings>
<setting name="_2013_1_6_cn_com_webxml_www_WeatherWebService"
serializeAs="String">
<value>http://www.webxml.com.cn/WebServices/WeatherWebService.asmx</value>
</setting>
<setting name="_2013_1_6_cn_com_webxml_www1_TrainTimeWebService&q
为什么要通过引用捕获异常,引用捕获异常相对值和指针捕获有何优点?
通过Item12学习可以看到首先,值捕获异常会调用拷贝构造函数2次,而引用捕获只有一次,效率方面,引用要高于值。可以按效率高低进行下排序,由高到低:指针->引用->值。
其次值传递在继承体系中会导致slice问题,即子类会被切割为基类。通过这两点就可以完全排除值捕获异常的可能性了。那么指针和引用相比,为什么要采用引用呢?
如果要是通过指针捕获异常的话,那么传递过来的指针是堆栈分配的?还是静态指针?还是栈对象的取地址操作获取的指针?根据不同的情况,会有不同的结果。如果是堆栈分配的指针,那么需要释放内存,如果通过局部对象的地址获取的指针,有可能在捕获到后,已经超过作用域,而指向一个已经销毁的对象,所以对catch来说,通过指针捕获异常,对异常的处理要复杂得多,也难以保持统一。而通过引用捕获异常却没有这些问题,所以当然最终选择最优的方案,通过引用捕获异常。