软件测试技术(四)——闰年判断器+ int.Parse错误如何解决
目标程序
本次所测试的目标程序是一个闰年判断器,我们知道,一般情况下年份被4整除就可以了,但是如果遇到百年的时候还需要被400整除,于是有了如下的逻辑判断:
if (year > 0)
{
if ((year % 100 == 0 && year % 400 == 0) || (year % 100 != 0 && year % 4 == 0))
{
isRunNian = true;
}
}
测试方法介绍—Syntax-Based Testing
BFF范式——巴科斯范式,是一种用于表示上下文无关文法的语言,上下文无关文法描述了一类形式语言。它是由约翰·巴科斯(John Backus)和彼得·诺尔(Peter Naur)首先引入的用来描述计算机语言语法的符号集。(来源于维基百科)
它有些类似于我们学过的正则文法,不过正则文法对应于乔姆斯基层级的3型文法,也叫正规文法,对应于有限状态自动机。而BFF范式是2型文法,也叫上下文无关文法。我们知道,0-3型文法每下一层多一个限制条件,更加简单。我也搜索一下资料,BFF范式更多的应用于研究,正则文法则是各种语言都做了库函数,可以方便地调用进行文法的编写,字符串的匹配。
有了文法之后,我们就可以进行输入字符串的判断了。正如书中所说的“One of the interesting things that grammars do is describe what an input is not. ”作者提出了3种覆盖标准:MC、MOC、MPC
(1)Mutation Coverage (MC): For each mutant m ∈ M, T R contains exactly one requirement, to kill m.
(2)Mutation Operator Coverage (MOC): For each mutation operator, TR contains exactly one requirement, to create a mutated string m that is derived using the mutation operator.
(3)Mutation Production Coverage (MPC): For each mutation operator, and each production that the operator can be applied to, T R contains the requirement to create a mutated string from that production.
P.S 这里mutant operator的意思是一种可以应用于本语法能够产生的的字符串来进行一定变化的规则。mutant是应用mutant operator产生的字符串。kill的意思原文是given a mutant m ∈ M for a derivation D and a test t, t is said to kill m if and only if the output of t on D is different from the output of t on m. 我的理解是对于test t和mutant m,两者产生的输出不同那么这一测试用例t就kill了原来的mutant m。
在本程序中,如果不预先进行处理,直接假定输入合法,那么在使用int.Parse的时候就很容易发生错误,比如,输入ab400,就会出现:

于是,我使用了正则表达式来进行输入的判断,代码如下:
Regex reg1 = new Regex("^-[1-9]+[0-9]*$");
if( (reg.IsMatch(textBox1.Text)==false) && (reg1.IsMatch(textBox1.Text)==false) )
{
if (textBox1.Text.Length <=1)
{
textBox1.Text = "";
}
else
{
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length-1);
}
label2.Text = "请输入合法的年份,如-1或2015";
label2.ForeColor = Color.Red;
}
功能是在输入不合法时进行一定的纠正。来确保int.Parse()不会出错。比如在输入abc的时候,会出现:

那么形如3、2015、300都是合法的输入,形如0、abc是非法的输入,稍微应用发散式的思维以及MPC规则想出一些invalid mutation形成的测试用例如下。
测试用例
|
编号 |
输入 |
预期输出 |
实际输出 |
|---|---|---|---|
|
0 |
4 |
4年是闰年 |
4年是闰年 |
|
1 |
-1 |
公元前1年是闰年 |
公元前1年是闰年 |
|
2 |
5 |
5年不是闰年 |
5年不是闰年 |
|
3 |
400 |
400年不是闰年 |
400年不是闰年 |
|
4 |
ab400 |
请输入合法的年份,如-1或2015 |
请输入合法的年份,如-1或2015 |
|
5 |
#%$ |
请输入合法的年份,如-1或2015 |
请输入合法的年份,如-1或2015 |
|
6 |
0 |
请输入合法的年份,如-1或2015 |
请输入合法的年份,如-1或2015 |
//
软件测试技术(四)——闰年判断器+ int.Parse错误如何解决的更多相关文章
- C#中Convert.ToInt32、int.TryParse、(int)和int.Parse四者的区别
Convert.ToInt32.(int)和int.Parse三者的区别: 首先:Convert.ToInt32 适合将object类类型转换成int类型,如Convert.ToInt32(sessi ...
- 软件测试第四周--关于int.parse()的类型转换问题
先来归纳一下我们用过的所有类型转换方法: 1. 隐式类型转换,即使用(int) 直接进行强制类型转换.这种方法的优点是简单粗暴,直接指定转换类型,没有任何保护措施,所以也很容易抛出异常导致程序崩溃.当 ...
- 软件测试技术lab2——Selenium上机实验
Selenium上机实验说明 1.安装SeleniumIDE插件 2.学会使用SeleniumIDE录制脚本和导出脚本 3.访问http://121.193.130.195:8080/使用学号登录系统 ...
- C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别
转自:http://www.cnblogs.com/leolis/p/3968943.html 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为 整型(int)来讲, ...
- C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别 <转>
作者:Statmoon 出处:http://leolis.cnblogs.com/ 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为整型(int)来讲,有四种方法 ...
- (int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别
C#中(int).int.Parse().int.TryParse()和Convert.ToInt32()的区别 原文链接:http://www.cnblogs.com/leolis/p/3968 ...
- 2017-2-17,c#基础,输入输出,定义变量,变量赋值,int.Parse的基础理解,在本的初学者也能看懂(未完待续)
计算机是死板的固定的,人是活跃的开放的,初学c#第一天给我的感觉就是:用人活跃开放式的思维去与呆萌的计算机沟通,摸清脾气,有利于双方深入合作,这也是今晚的教训,细心,仔细,大胆 c#基础 1.Hell ...
- C#整数三种强制类型转换int、Convert.ToInt32()、int.Parse()、string到object 的区别
1.int适合简单数据类型之间的转换,C#的默认整型是int32(不支持bool型); 2.int.Parse(string sParameter)是个构造函数,参数类型只支持string类型; 3. ...
- Assignment4:闰年判断输入异常时的处理方法
一.问题描述 在输入界面输入年份,界面返回是否为闰年. 判断依据为:输入的数字可以被4整除但不可以被100整除 || 输入的数字可以被400整除 如果输入为数字以外的其他字符,会抛出异常.那么如何防止 ...
随机推荐
- cojs 疯狂的求和问题 解题报告
QAQ 好久不在cojs上出题了 最近学了点新科技,于是就做成题来分享了 这道题是要求simga(i^k) 那么就先说说部分分的算法吧: 10分: 直接暴力就可以了,时间复杂度O(nlogk) 30分 ...
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
转载:http://itindex.net/detail/50710-springaop-controller-service 从业近二,三年了,第一次写博客,平时做做脚手架或者架构一些基础框架然后给 ...
- css一个图片包含多个图片|网站侧栏导航
<html> <head><title>Hello World</title> <style> .style1{ width:60px;ma ...
- chrome中tcmalloc的使用
chrome中内存分配采用了第三方库tcmalloc,这个库主要提供给应用程序内存管理方面的优化,按资料说内存存取速度会从300ns降到50ns.更具体的关于这个tcmalloc的信息大家可以查网上的 ...
- Linux功能-RPM命令详解
一.概述 RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序”,用RPM包方式来发布软件变得越来越流行,主要的原因是这种软件发布 ...
- 6、JPA_映射单向多对一的关联关系(n的一方有1的引用,1的一方没有n的集合属性)
单向多对一的关联关系 具体体现:n的一方有1的引用,1的一方没有n的集合属性 举个例子:订单Order对顾客Customer是一个单向多对一的关联关系.Order是n的一方,有对Customer的引用 ...
- DNS子域委派配置案例[转载]
最近在研究linux dns 在51上面看见这篇文章,感觉讲的很透彻,随转载,方便以后自己查阅 原文地址:http://www.51osos.com/a/Linux_CentOS_RedHat/Lin ...
- Kaleidoscope for mac
mac下的对比工具Kaleidoscope,是一款不错的对比工具,界面被广大用户所喜爱. window下使用beyond compare 3,具体设置步骤,请见:http://www.cnblogs. ...
- Oracle的rownum原理和使用(整理几个达人的帖子)
整理和学习了一下网上高手关于rownum的帖子: 参考资料: http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...
- 函数buf_page_get_gen
/********************************************************************//** This is the general functi ...