我对问题的理解,如最初所述,然后在Macke的答复下通过评论进行了更新,包括以下内容:1)两种边缘类型(依赖性和冲突)都是有针对性的;2)如果两个节点通过一条边连接,则即使它们是另一种类型或相反类型,也不得通过另一条边连接;3)如果可以通过混合不同类型的边来构造两个节点之间的路径,那么这是错误的,而不是被忽略的情况;4)如果两个节点之间使用一种类型的边缘存在一条路径,则它们之间可能不会使用另一种类型的边缘存在另一条路径;5)不允许使用单边沿类型或混合边沿类型的循环(从应用程序的猜测来看,我不确定仅冲突循环是一个错误,但是可以消除此条件,如果不允许的话)。
此外,我将假设所使用的数据结构不会阻止违反这些要求的表述(例如,如果始终从节点对到(类型,方向)的映射中无法表达违反条件2的图)首先具有最少编号的节点。)如果无法表达某些错误,则会减少要考虑的案例数。
实际上,这里可以考虑三个图:两个是唯一一个边缘类型的图,以及由这两个类型中的每一个的并集形成的混合图。您可以使用它来系统地生成多达一定数量节点的所有图。首先生成N个节点的所有可能图,其中任意两个有序节点对之间的边缘不超过一个边(有序对,因为它们是有向图)。现在取这些图的所有可能对,一个代表依赖关系,另一个代表冲突,形成每对的结合。
如果您的数据结构不能表达违反条件2的条件,则可以通过仅构造适合于依赖关系图空间的所有可能的冲突图来大大减少要考虑的情况,反之亦然。否则,您可以在形成联合时检测到违反条件2的情况。
在从第一个节点开始的广度优先遍历组合图时,您可以构建到每个可到达节点的所有路径的集合,并且这样做时,可以检查是否违反了所有条件(对于循环检测,您可以使用Tarjan的算法。)
即使图形断开连接,您也只需考虑来自第一个节点的路径,因为在某些其他情况下,来自任何其他节点的路径将显示为来自第一个节点的路径。
如果可以简单地忽略混合边缘路径,而不是将其视为错误(条件3),则只需独立考虑依赖关系图和冲突图,并检查一个节点是否可达,而另一个节点则不可达。
如果您记得在检查N-1个节点的图形中找到的路径,则可以将其用作生成和评估N个节点的图形的起点。
这不会在节点之间生成相同类型的多个边,但是可以对其进行扩展。但是,这将大大增加案例的数量,因此,如果要测试的代码使这种情况无法表示或失败,则可以事先过滤掉所有此类案例会更好。
编写这样的oracle的关键是,即使它意味着效率低下,也要使其尽可能简单,以便您可以建立对它的信任(理想情况下是通过对其正确性的论证,并通过测试进行备份)。
一旦有了生成测试用例的方法,并且相信创建的Oracle可以准确地将好与坏分开,就可以使用它来驱动目标代码的自动化测试。如果那不可行,那么您的下一个最佳选择是针对特殊情况梳理结果。oracle可以对发现的错误进行分类,并为您提供有关可接受情况的一些信息,例如每种类型的路径的数量和长度,以及两种路径的开头是否都存在节点,并且可以帮助您寻找以前从未见过的案例。