【问题标题】:Under what circumstances would AssertEquals fail when the actual and expected values match?当实际值和期望值匹配时,在什么情况下 AssertEquals 会失败?
【发布时间】:2020-06-12 05:26:19
【问题描述】:

我有一个 Android 应用的测试用例,它验证视频播放器活动中的时间在用户快进和快退视频 15 秒时不会改变。测试工作如下:

  1. 打开视频播放器,让视频播放几秒钟。
  2. 暂停视频并检查时间戳。
  3. 按“快进 15 秒”按钮,然后按“快退 15 秒”按钮。
  4. 检查新的时间戳是否相同。

时间戳采用 hh:mm:ss 格式。我使用以下方法以秒为单位获取播放时间:

    private int getPlayTime() {
        String timestamp = getTimestamp();
        return Integer.parseInt(timestamp.substring(0, 2)) * 3600 +
                Integer.parseInt(timestamp.substring(3, 5)) * 60 +
                Integer.parseInt(timestamp.substring(6)) ;
    }

getTimestamp() 从 Android 视图中获取时间戳字符串:

    private String getTimestamp() {
        AppCompatTextView playTime = (AppCompatTextView) solo.getView(/* View ID */);
        return (String) playTime.getText();
    }

这是断言语句:

assertEquals("Rewinding should bring us back 15 seconds. Start = " + startTime + ", end = " + endTime, startTime, endTime);

虽然值相同,但AssertEquals() 有时会返回失败:java.lang.AssertionError: Time should advance by 15 seconds. Start = 37, end = 37

这种情况发生的几率不到 10%,而且不容易重现。我完全失去了解释。这可能是 JUnit 错误吗?

【问题讨论】:

  • 这条消息不是关于倒带,而是关于前进。这是一个不同的断言
  • 您能确认hh:mm:ss 时间戳字符串是相同的吗?
  • @csum:我很确定它们是一样的。
  • startTime 和 endTime 的类型是什么?它们是字符串,它们是否有可能包含不可打印的字符?它们是否与产生相同输出的toString()s 不同类型?
  • "我用下面的方法来获取播放时间,以秒为单位:" 所以01:02:03是6秒的播放时间?

标签: java junit4 android-testing


【解决方案1】:

根据您的描述,您的断言似乎来自其他一些测试用例,在单击前进按钮时触发。

【讨论】:

  • 我实际上是在与起始值进行比较。抱歉,描述不是很准确。它可能应该说类似“当前时间戳应该匹配起始值”。
猜你喜欢
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多