eclipse实现已知公元 1 年 1 月 1 日是星期一。编写一个程序,只要输入年月日,就能回答那天是星期几。 设计程序完成下列要求。 (1)以语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖测试方法设计测试用例。 (2)使用 JUnit 编写测试用例,并采用参数化设置测试语句覆盖方法,要求使用Junit中的常用注释。 (3)使用 EclEmma 查看测试覆盖率
时间: 2024-02-28 10:52:09 浏览: 79
实现已知公元 1 年 1 月 1 日是星期一的程序,以下是一个Java实现的例子:
```
import java.util.Scanner;
public class WeekdayCalculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入年份:");
int year = scanner.nextInt();
System.out.println("请输入月份:");
int month = scanner.nextInt();
System.out.println("请输入日期:");
int day = scanner.nextInt();
scanner.close();
int weekday = calculateWeekday(year, month, day);
System.out.println("该日期是星期" + weekday);
}
public static int calculateWeekday(int year, int month, int day) {
int[] monthDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 每个月的天数
int days = 0;
for (int i = 1; i < year; i++) {
if (isLeapYear(i)) {
days += 366;
} else {
days += 365;
}
}
for (int i = 0; i < month - 1; i++) {
days += monthDays[i];
}
if (month > 2 && isLeapYear(year)) {
days += 1;
}
days += day - 1;
return (days + 1) % 7; // 1年1月1日是星期一,所以要加上1
}
public static boolean isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
}
```
这个程序使用了一个calculateWeekday方法来计算输入日期的星期。主要思路是先计算出从1年1月1日到输入日期过去的天数,然后取模计算星期。isLeapYear方法用来判断闰年。
以下是针对上述代码设计测试用例的方法:
1. 语句覆盖:
测试用例1:calculateWeekday(2021, 1, 1);
测试用例2:calculateWeekday(2021, 12, 31);
2. 判定覆盖:
测试用例1:calculateWeekday(2021, 2, 1);
测试用例2:calculateWeekday(2020, 2, 1);
3. 条件覆盖:
测试用例1:calculateWeekday(2021, 2, 1);
测试用例2:calculateWeekday(2020, 2, 1);
4. 判定/条件覆盖:
测试用例1:calculateWeekday(2021, 2, 1);
测试用例2:calculateWeekday(2020, 2, 1);
5. 组合覆盖:
测试用例1:calculateWeekday(2021, 2, 1);
测试用例2:calculateWeekday(2020, 2, 1);
6. 路径覆盖:
测试用例1:calculateWeekday(2021, 2, 1);
测试用例2:calculateWeekday(2020, 2, 1);
以下是使用JUnit编写测试用例的代码:
```
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.Arrays;
import java.util.Collection;
@RunWith(Parameterized.class)
public class WeekdayCalculatorTest {
private int year;
private int month;
private int day;
private int expected;
public WeekdayCalculatorTest(int year, int month, int day, int expected) {
this.year = year;
this.month = month;
this.day = day;
this.expected = expected;
}
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{2021, 1, 1, 5},
{2021, 12, 31, 5},
{2021, 2, 1, 1},
{2020, 2, 1, 6},
});
}
@Test
public void testCalculateWeekday() {
assertEquals(expected, WeekdayCalculator.calculateWeekday(year, month, day));
}
}
```
这个测试类使用了JUnit的Parameterized注解,允许我们使用一个二维数组来存储多个测试用例。在data()方法中,我们列出了4个测试用例,每个测试用例包含年月日和预期结果。在testCalculateWeekday()方法中,我们使用assertEquals()方法来验证预期结果和实际结果是否一致。
最后,使用EclEmma查看测试覆盖率。在Eclipse中,选择菜单栏中的“Run As” -> “Coverage As” -> “JUnit Test”。运行结束后,EclEmma会自动显示测试覆盖率报告。我们可以看到代码的语句覆盖率、分支覆盖率等信息。
阅读全文