软件测试技术(四)——闰年判断器+ 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整除 如果输入为数字以外的其他字符,会抛出异常.那么如何防止 ...
随机推荐
- kindeditor.net应用
1.网址:http://kindeditor.net/docs/usage.html
- 对于delphi for linux心存梦想的同学,彻底醒醒吧
Borland 曾经多次做市场调查,很多人呼吁推出delphi for linux.可是直到kylix发展到第三版,borland才明白:一个内置C编译器环境并与之关系紧密的免费OS,没有人愿意花钱去 ...
- VC程序查错之内存访问异常
作者:langouster 先来看下面这张图,相信很多程序员都见过类似. ---------------------------test1.exe - 应用程序错误------------------ ...
- Servlet中Service方法
doGet方法只能处理Get方式提交的请求,doPost则可以处理Post方式提交的请求, 一种既可以处理Get方式又可以处理Post方式的提交的请求,它就是Service方法. service方法用 ...
- BZOJ 2844 albus就是要第一个出场(高斯消元)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2844 题意: 给出一个长度为n的正整数数列A.每次选出A的一个子集进行抑或(空集抑或值为 ...
- TCSRM 591 div2(1000)(dp)
挺好的dp 因为有一点限制 必须任意去除一个数 总和就会小于另一个总和 换句话来说就是去除最小的满足 那么就都满足 所以是限制最小值的背包 刚开始从小到大定住最小值来背 TLE了一组数据 后来发现如果 ...
- UWP:本地应用数据
获取应用的设置和文件容器 使用 ApplicationData.LocalSettings 属性可以获取 ApplicationDataContainer 对象中的设置. 注意:每个设置的名称最长可为 ...
- linq 之左连接
List<ArticleModel> articleList = articleRepository.GetAllArticle(); List<UsersModel> use ...
- UVa 11889 (GCD) Benefit
好吧,被大白书上的入门题给卡了.=_=|| 已知LCM(A, B) = C,已知A和C,求最小的B 一开始我想当然地以为B = C / A,后来发现这时候的B不一定满足gcd(A, B) = 1 A要 ...
- android studio获取SHA1
1 打开cmd,转到路径:C:\Users\usoft\.android 2 输入命令 keytool -list -v -keystore debug.keystore 3 输入命令 android ...