我们已经建立了一个功能测试框架,其中包括针对某些第三方预先存在的软件运行我们的代码。我们定期这样做,并将结果与预期结果进行比较(与单元测试相同,但测试本身比单元测试更复杂)。
第三方使用的软件是预编译的可执行文件(实际上有 2 个可执行文件,称为 MoveIt(在 ROS 机器人框架内)和 Coppelia Sim(机器人模拟器),非常肯定是用 C++ 编码的。但是为了这个问题,我不这样做认为这些细节确实很重要。因为我想一遍又一遍地比较结果,所以测试框架的输出需要是确定性的,尽管预编译的可执行文件使用随机数生成。
为了从第 3 方可执行文件的随机数生成器中获得确定性结果。我正在寻找一种从外部种子可执行文件的方法(即不是从我没有完全访问权限的代码)。我知道大多数随机数生成都是根据计算机时钟播种的,因此我认为如果我可以欺骗可执行文件并让他们相信它们是从与计算机不同的时钟执行的,那么我确实可以在外部播种这些可执行文件。
你怎么认为?有想法从代码外部植入可执行文件吗?
注意:我们实际上可以访问 MoveIt 的源代码,我们可以重新编译它(尽管将如此繁重且未知的代码库转变为确定性行为肯定是相当繁重且艰巨的任务),但我们无权访问 CoppeliaSim 的源代码- 因此我们无法重新编译(因此我们无法从代码中播种)。
答案1
听起来确实需要使用固定的时钟。希望您使用的代码可以在单调时钟上运行,该时钟可以从 CPU 而不是系统时钟(挂钟)获取其值。
测试这一点的一个相当简单的方法是编写一个执行以下步骤的 bash 脚本:
- 设置您的系统时钟
- 运行软件
尝试几次,看看结果如何。如果您能够匹配每次运行脚本之间的结果,那么您可能有一个可行且非常简单的解决方案。如果出于某种原因,开发人员决定植入诸如毫秒值之类的东西,那么您可能就不那么幸运了。
该脚本可能如下所示:
#! /bin/bash
date --set="8 FEB 2021 10:00:00"
./your-program-here