关于闰年的测试

很多软件都实现了日期这一功能,日历系统算是人类的一个legacy system。在此系统逐步进化中,也衍生出一些问题,例如“千年虫”、”闰年虫”。其中闰年虫是人们对于一些电脑在设计时未考虑闰年因素,将所有年份的2月都默认为有29天或者28天而出现运算错误的一种形象叫法,因为在英文里Bug兼有臭虫、缺陷等含义,所以这一缺陷被称为“闰年虫”。

在2012年2月底,广州“闰年虫”爆发,上千的士因计价器出问题而停运,如图所示:

就连著名的微软也会出现”闰年虫”的失误,微软Windows Azure云平台若干子区域受“闰年虫”影响致许多客户12至24个小时无法使用服务。根据Windows Azure服务仪表板显示,从UTC时间2012年2月29日凌晨到3月1日早上,大量的子区域服务和全球性服务发生了超过24小时的中断。

因此如何正确判断闰年是一个十分重要的问题,下面是C# 的代码片段:

 1 public static bool IsLeapYear(int year)
 2 {
 3     System.Diagnostics.Debug.Assert(year >= 1900);
 4     if (year % 400 == 0)
 5         return true;
 6     if (year % 100 == 0)
 7         return false;
 8     if (year % 4 == 0)
 9         return true;
10     return false;
11 }

如果你要写这个程序的单元测试, 你会列出多少个测试用例?  一个”笨”方法就是进行穷举,可又会面临以下问题:

    1. 穷举不完
    2. 即使穷举了很多例子, 但是它们未必能帮助发现独特的问题,并不具有代表性

因而我们要引入 “等价类 (Equivalence)” 这一概念。所谓等价类是指输入域的某个互不相交的子集合,所有等价类的并集便是整个输入域,目的在于测试用例的无冗余性。 一个粗浅的做法是:

如果一个函数可以返回 true | false, 你至少得有两类测试集合, 让它分别返回 true | false

如果你知道这个函数工作的原理, 或者了解程序要反映的现实世界, 你可以举出更详细的等价类, 例如针对 IsLeapYear()的测试用例如下:

被 400 整除的年份

被 100 整除, 但是不被400 整除的年份

被 100 整除, 同时被400 整除的年份

被 4 整除, 但是不被100 整除的年份

被 4 整除, 同时被100 整除的年份

偶数, 不被4 整除的年份

奇数年份

其它非法输入的年份

另外程序员都知道程序经常在边界条件附近出错, 针对IsLeapYear(), 你可以得出下面两个测试用例:

设计允许的最小的年份

设计允许的最大的年份

总而言之,选取正确而又合适的测试用例是测试程序有无bug的必备条件。除此之外,判断是否为闰年的代码也可以简化如下:

1 bool isLeapYear( int year )
2 {
3     return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
4 } 
时间: 2024-11-08 17:28:45

关于闰年的测试的相关文章

关于闰年测试中非法输入的处理

在软件测试技术课当中我们进行了关于闰年的测试,闰年的测试方法如下所示: public static boolean isLeapYear(int year)        {             if (year % 400 == 0)                return true;             if (year % 100 == 0)                return false;             if (year % 4 == 0)         

【软件测试】 闰年判定以及输入问题思考

闰年(Leap Year)是为了弥补因人为历法规定造成的年度天数与地球实际公转周期的时间差而设立的.补上时间差的年份为闰年.闰年共有366天.其中二月为29天,闰年,每四年一次,每一百年不是闰年,每四百年又是一次闰年. 测试中,我们要编写如下逻辑结构的闰年测试代码: 1 获取年份信息 2 测试是否为4的公倍数 如果不是,则不是闰年 3 如果是,继续测试是否是100的公倍数如果不是 则是闰年 4 如果是,继续测试是否是400的公倍数,如果是则是闰年,如果不是则不是闰年 那么,最简单的代码实现 1

有关测试输入是否是闰年的问题及程序

输入 输入一段字符(正确为数字有可能出现其他字母,符号等非法字符) 输出 提示所输入是否为闰年,如果输入不是数字则提示输入不合法. 闰年的定义 能被4整除但不能被100整除,或者能被400整除的. 测试用例 编号 输入 预计输出 1 400 是 2 1000 否 3 10/*0 非法 测试截图: 代码: import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.Event

闰年测试(非法输入的判断)

1. 问题描述: 输入一个年份,判断其是否为闰年,若为非法输入则给出提示 2. 问题分析: 闰年的判断: 1)输入一个年份,若它能被400整除,则它是闰年:若它能被4整除,且它不能被100整除,则它是闰年 由此判断,若它是闰年,则输出“该年是闰年”:否则,则输出“该年不是闰年” 2)若为非法输入,给出提示,则输出“输入不合法” 3. 测试用例: 编号 输入 期望输出 1 2004 该年是闰年 2    2000 该年是闰年 3 1900 该年不是闰年 4 200,. 输入不合法 4. 测试结果:

通过JAVA程序测试闰年

首先简要介绍一下公历上规定的闰年:四年一闰,百年不闰,四百年再闰. 针对这一规则,简要的设计部分测试用例: 附(测试截图): 以下为该程序代码段: import javafx.application.Application;import javafx.event.ActionEvent;import javafx.event.EventHandler;import javafx.scene.Scene;import javafx.scene.control.Button;import javaf

[软件测试学习]考虑到测试的代码编写/int.parse的非法输入—由一个简单的c#闰年检测程序说起

一个简单的C#的闰年检测程序 1.闰年检测的函数编写 当提起检测平年闰年时候,第一反应写出的代码 1 public static bool isLeapYear(int year){ 2 return ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0)) 3 } 但是这个并不易于测试和出现错后的修改,更改代码如下 1 public static bool isLeapYear(int year){ 2 bool check = ne

基于Java的闰年测试

以下为测试代码,实现测试输入是否合法及是否为闰年(四年一闰,百年不闰,四百年再闰): import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; imp

闰年测试和对输入的非法判断

1问题描述 输入一个测试用例,判断输入用例是否为闰年 2方法使用 这里用到两个函数方法第一个方法由于都在if语句中判断,所以不好测试,第二个方法可以更加明确的判断 3具体代码 #include<stdio.h> #include<sstream> #include<string> using namespace std; void judge(int year){ bool b; if (year % 4 == 0) b=true; if (year % 100 ==

闰年测试及string与Int转换的异常处理

闰年的计算方法为:四年一闰,百年不闰,四百年再闰. 基于闰年的计算方法用程序来实现为: 1. bool isLeapYear( int year ) { return (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0); } 2. bool isLeapYear(int year){    if (year % 400 == 0)        return true;    if (year % 100 == 0)