考虑测试您刚刚实施的项目。如果它正在使用系统的时钟,测试它将是一个问题。想到的第一个解决方案是模拟;手动操作系统的时钟来欺骗软件的所有组件,以便相信时间按照您希望的方式进行。你如何实现这样的解决方案?
我的解决方案是: 使用虚拟环境(例如VMWare Player)并安装Linux(我将发行版留给您)并操纵虚拟系统的时钟以创建时间流逝的错觉。唯一的问题是,当代码运行时,时钟正在滴答作响。我,我自己,正在寻找一个解决方案,时间会实际停止,除非我告诉它,否则它不会改变。
约束: 您不能限制项目中使用的组件列表,因为它们可能是任何内容。例如,我使用了MySQL的日期/时间函数,我想在没有修改MySQL代码的情况下欺骗它们(因为你可能最终编译项目的每个组件,所以太费钱了。)
答案 0 :(得分:1)
编写一个小程序,在您需要时更改系统时钟,以及您想要多少。例如,每秒钟,将时钟更换59秒。
小程序应该
答案 1 :(得分:1)
使用自己的方法封装系统调用,并且可以使用模拟调用替换系统调用以进行测试。
编辑以展示一个例子。
我写Java游戏。这是一个简单的Java Font类,它将游戏的字体放在一个地方,以防我决定稍后更改字体。
package xxx.xxx.minesweeper.view;
import java.awt.Font;
public class MinesweeperFont {
protected static final String FONT_NAME = "Comic Sans MS";
public static Font getBoldFont(int pointSize) {
return new Font(FONT_NAME, Font.BOLD, pointSize);
}
}
同样,使用Java,这是封装System调用的简单方法。
public static void printConsole(String text) {
System.out.println(text);
}
使用System.out.println
替换代码中的printConsole
的每个实例,并且您的系统调用仅存在于一个位置。
通过覆盖或修改封装的方法,您可以测试它们。
答案 2 :(得分:1)
根据您在评论中的其他说明(也许你会冷添加到你的问题?),我的想法是:
你可能已经解决了1& 2,但它们与问题有关,如果不是问题。
1)这是一个Web应用程序,因此您只需关注服务器的时钟。不要相信客户控制的任何时钟。
2)您似乎只需要经过时间而不是绝对时间。因此,为什么不跟踪服务器请求开始和结束的时间,然后将经过的服务器时间重新添加到剩余的“时间库”(或任何约束条件)?
3)就测试而言,你根本不需要关心任何实际的“时钟”。正如Gilbert Le Blanc建议的那样,编写一个围绕系统调用的包装器,然后可以使用它来返回虚拟测试数据。因此,如果您有一个返回当前系统时间的方法getTime()
,您可以将其包装在另一个方法中,或者使用返回任意偏移量的参数重载它。
答案 3 :(得分:0)
另一个解决方案是调试和操作时间函数返回的值,将它们设置为你想要的任何东西