Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模拟;“更快的时间”;在linux中_Java_Linux_Testing_Date_Time - Fatal编程技术网

Java 模拟;“更快的时间”;在linux中

Java 模拟;“更快的时间”;在linux中,java,linux,testing,date,time,Java,Linux,Testing,Date,Time,我有一个在linux上运行的Java应用程序,它有很多围绕时间和日期的事件和业务逻辑 对于测试,是否有可能调整某些内容以加快时间。比方说,在一小时的墙时间内完成整个计算机年?如果您是系统调用以获取系统时间(即system.currentTimeMillis()),那么您大概可以通过更改系统时间来加快时间。这应该反映您在应用程序中看到的时间 如果您使用其他方法来计算时间(从JVM启动(即System.nanoTime())到净时间服务器等所经过的时间),那么答案是这是不可能的 我要强调的是,我只

我有一个在linux上运行的Java应用程序,它有很多围绕时间和日期的事件和业务逻辑


对于测试,是否有可能调整某些内容以加快时间。比方说,在一小时的墙时间内完成整个计算机年?

如果您是系统调用以获取系统时间(即
system.currentTimeMillis()
),那么您大概可以通过更改系统时间来加快时间。这应该反映您在应用程序中看到的时间

如果您使用其他方法来计算时间(从JVM启动(即
System.nanoTime()
)到净时间服务器等所经过的时间),那么答案是这是不可能的


我要强调的是,我只是在解释如何按照您的要求进行测试,这只适用于集成测试,当您考虑到您在所述机器上影响的任何其他内容时


这不应取代适当和广泛的单元测试。

您可以为时间/日期调用编写包装器接口。有一个真正的实现可以执行真正的系统调用,还有一个测试实现可以做任何你想做的事情(运行得更快、更慢、假日期等等)。

你必须设计你的系统,以便你可以在测试期间“重新安排”时钟。对于某些类的系统,有一个事件队列,它按时间顺序存储计划的事件。在模拟的任何一点上,下一个事件都是队列中的第一个项目;您可以将其从队列中拉出,并调整有效时间,使其与事件发生的时间相匹配。在计划新事件时,它们将被添加到队列中。因此,您可以在系统允许的情况下尽快处理事件,而不必等待实际时间的流逝。但是您必须设计您的系统以允许这种机制工作。

一种最适合单元测试的方法是抽象代码中访问当前时间的方式

您可以提供自己的实现,而不是直接调用System.currentTimeMillis()

类似这样的代码(伪代码):

然后,您可以在任何地方调用System.getTimeMillis(),而不是调用MyTime.getTime()。在测试代码时,只需创建一个TestTimeImpl并调用MyTime.setTimeInterface(TestTimeImpl)。然后,如果需要时间提前调用testTimeImpl.sleep()或testTimeImpl.setTime()


这使您可以模拟毫秒以下的任何时间。

程序是否通过系统调用调用“时间”和“日期”?让脚本将时间设置为每秒间隔一秒怎么样:)此程序是否依赖于数据库或任何其他外部程序?使计算机几乎以光速移动;-)如果有人在使用这台机器,他们不会高兴的。如果模拟崩溃,则表示机器的时钟错误。如果您在模拟过程中创建文件,它们的时间戳将在以后出现。这是一个好方法,但是如果“长时间运行测试”需要检查外部元素,例如:Web/Application server日志文件管理、内存消耗,或者您想测试所有一起工作的组件(你的应用程序,sql/no sql db,Cron-like服务/作业等)。这种测试需要改变硬件时钟,以便“欺骗”各方。请看。想想龙珠的“双曲线时间室”
class MyTime {
   private static TimeInterface CurrentTimeInterface = new DefaultTimeImpl();

   public setTimeInterface(TimeInterface timeInterface) {
      CurrentTimeInterface = timeInterface;
   }

   public int getTime() { CurrentTimeInterface.getTime(); }

}

class DefaultTimeImpl implements TimeInterface {
   public int getTime() { return System.currentTimeMillis(); }
}

class TestTimeImpl implements TimeInterface {
   private int CurrentTimeMillis = 0;
   public int getTime() { return CurrentTimeMillis; }
   public void setTime(int timeMillis) { CurrentTimeMillis = timeMillis}
   public void sleep(int millis) { CurrentTimeMillis += millis; }
}