软件测试技术(四)——闰年判断器+ 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整除 如果输入为数字以外的其他字符,会抛出异常.那么如何防止 ...
随机推荐
- android 上下文菜单详解
本文使用xml来创建上下文菜单 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:andr ...
- QTP重要功能总结
以下为QTP最应掌握的.最常用的功能(以下仅提供菜单入口,其他还有很多入口,但功能都是一样的) 1.QTP上方菜单栏->Tools->Object Spy(对象探测器)----多个入口 功 ...
- Meteor 简介
简介 先来活动一下大脑.假设你坐在电脑面前,在两个窗口中打开同一个文件夹. 在其中一个窗口中删除一个文件,另一个窗口中的这个文件会消失吗? 不用实际操作你也知道肯定会消失的.在本地文件系统中的操作,不 ...
- LCS模板,求长度,并记录子串
//LCS模板,求长度,并记录子串 //亦可使用注释掉的那些代码,但所用空间会变大 #include<iostream> #include<cstring> #include ...
- 乳草的入侵//BFS
P1030 乳草的入侵 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 USACO OCT09 6TH 描述 Farmer John一直努力让他的草地充满鲜美 ...
- 最长不下降子序列//序列dp
最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 最长不下降 ...
- import java.util.Scanner;
一.扫描控制台输入 当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,,,,,,,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象 ...
- java:I/O流
I/O是input/output的缩写,即输入输出端口. 从 文件.键盘.网络 等输入到java程序,再从java程序输出到 文件.显示器.网络等 分类: 1.输入流 和 输出流2.字节流 和 字符流 ...
- android休眠唤醒流程2
android系统一段时间没有操作, 屏幕(screen)将从高亮(bright)变为暗淡(dim),如果再过段时间还是没有操作,屏幕(screen)从暗淡(dim)变为关闭(off).这时,系 ...
- MacOS安装phpMyAdmin几点问题
1. 登录时出现“#2002 无法登录 MySQL 服务器”. 原因: phpMyAdmin为PHP编写,MacOS默认安装的php配置,设置mysql监听socket默认为/var/mysql/my ...