单位测试日期 - 如果不是工作日

时间:2012-08-24 12:16:25

标签: unit-testing phpunit

如果时间戳是周末,即星期六或星期日,我有一个小方法返回true或false。

现在我对单元测试非常新,我正在尝试为此编写单元测试。

在我的测试用例中,我将如何处理:

这是我的初衷。

1. Pick any 1 week from the past and then...
   1.1. Get a timestamp for all 5 week days (mon through fri) and pass each timestamp to the function being tested.  If they all return false then proceed...
   1.2  Get the timestamp for both weekend days and pass each to function being tested.  If they both return true then we know the function is correct.

2  Simply pick 1 weekday from the past and 1 weekend day from the past and test with only those 2 dates

我对这两种方法中的任何一种方法都是正确的,还是有更好的方法来测试它?

2 个答案:

答案 0 :(得分:2)

这需要data provider或两个{{3}}。 PHPUnit将首先调用数据提供程序来获取一个数组,该数组包含将传递给测试的数据集,其中每个数据集都是一个传递给测试方法的参数数组。接下来,每个数据集执行一次测试。这里每个数据集都是一个简单的日期字符串以及错误消息的日期名称。

/**
 * @dataProvider weekdays
 */
function testDetectsWeekdays($date, $day) {
    self::assertTrue($fixture->isWeekday($date), $day);
}

/**
 * @dataProvider weekends
 */
function testDetectsWeekends($date, $day) {
    self::assertFalse($fixture->isWeekday($date), $day);
}

function weekdays() {
    return array(
        array('2012-08-20', 'Monday'),
        array('2012-08-21', 'Tuesday'),
        array('2012-08-22', 'Wednesday'),
        array('2012-08-23', 'Thursday'),
        array('2012-08-24', 'Friday'),
    );
}

function weekends() {
    return array(
        array('2012-08-25', 'Saturday'),
        array('2012-08-26', 'Sunday'),
    );
}

至于测试日期,您需要考虑课程中可能出现的任何角落情况。闰年会影响它吗?时区?这取决于作为单元(白盒)测试的一部分的实现。

答案 1 :(得分:1)

如果您将多个检查放入单个测试中,您将遇到的问题是,当其中一个检查失败时,您将无法知道某些检查可能会返回什么。假设方法在第3天失败。它会在第4天工作吗?在尝试查找错误时,此信息可能非常有用。

我的方法是一次测试所有值。它的工作原理如下:

  1. 选择过去的日期
  2. 创建一个循环,将日期提前8天
  3. 为每个日期调用方法,并将结果附加到字符串
  4. 通过查看真实日历创建一个包含预期结果的字符串)
  5. 比较两个字符串
  6. 通过这种方式,您可以一目了然地看到该方法失败的日期。

    另一种选择是编写8个测试,并让每个测试检查一个日期。

    提示:当引入时区时,这样的测试往往会失败。创建更多使用接近午夜的时间戳并使用timezome进行测试的测试。结果是否仍然正确?