软件测试技术(四)——闰年判断器+ 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整除 如果输入为数字以外的其他字符,会抛出异常.那么如何防止 ...
随机推荐
- hdu 3863 No Gambling
#include<stdio.h> int main() { int n; ) { printf("I bet on Oregon Maple~\n"); } ; } ...
- utf-8中的汉字占用多少字节
转载:http://blog.csdn.net/chummyhe89/article/details/7777613 占2个字节的:〇 占3个字节的:基本等同于GBK,含21000多个汉字 占4个字节 ...
- 一起学Maven
转载自:http://blog.csdn.net/songdeitao/article/details/18452459 一. 初识Maven 开场白 在现在的项目开发过程中,越来越重视项目的管理,而 ...
- sed and awk学习笔记
sed and awk 背景 awk起源追溯至sed和grep,进而追溯至共同的行编辑器ed.实用工具grep来源于ed命令:g/re/p .实用工具awk和sed有一个共同的选项-f用于指定脚本的名 ...
- HTML5 增强的页面元素
一.HTML5 改良的 input 元素的种类 1.<input type="number" id="num1"> var n1 = documen ...
- 修改 eclipse 文件编码格式
如果要使插件开发应用能有更好的国际化支持,能够最大程度的支持中文输出,则最好使 Java文件使用UTF-8编码.然而,Eclipse工作空间(workspace)的缺省字符编码是操作系统缺省的编码,简 ...
- SimpleDateFormat日期格式化
public class T { /** * @param args */ public static void main(String[] args) { // TODO Auto-generate ...
- HDU4389:X mod f(x)(数位DP)
Problem Description Here is a function f(x): int f ( int x ) { if ( x == 0 ) return 0; return f ( x ...
- Python错误处理
中文注释出错,把UTF-8标明放在文件头就行了 # coding: utf-8
- Android 中Activity生命周期分析(二):从AActivity 到BActivity过程分析
如果你没有动手去演示的话,你一定要去动手试试看,这个东西非学容易出错,面试中经常出现,好了,上代码: package com.king.review.base; import android.app. ...