Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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-如何单元测试TimSort和;“违反一般合同”;问题_Java_Unit Testing_Timsort - Fatal编程技术网

Java-如何单元测试TimSort和;“违反一般合同”;问题

Java-如何单元测试TimSort和;“违反一般合同”;问题,java,unit-testing,timsort,Java,Unit Testing,Timsort,这个问题与 以及其他几个类似的“违反总合同”问题。我的问题与Ceekay在页面底部关于“如何测试TimSort实现”的回答特别相关。在我的例子中,我已经修复了将我带到这里的应用程序错误,这是由于对称性冲突造成的,但是我在创建单元测试以暴露该冲突时遇到了困难(如果修复被注释掉或将来未修复) 公共类TickNumber实现可比较{ 保护串带; 保护串轨道; } 公共类GisTickNumber扩展了TickNumber实现了Compariable{ 私有字符串后缀; } 我省略了所有的实现细节,但

这个问题与 以及其他几个类似的“违反总合同”问题。我的问题与Ceekay在页面底部关于“如何测试TimSort实现”的回答特别相关。在我的例子中,我已经修复了将我带到这里的应用程序错误,这是由于对称性冲突造成的,但是我在创建单元测试以暴露该冲突时遇到了困难(如果修复被注释掉或将来未修复)

公共类TickNumber实现可比较{
保护串带;
保护串轨道;
}
公共类GisTickNumber扩展了TickNumber实现了Compariable{
私有字符串后缀;
}
我省略了所有的实现细节,但基本上,勾号是一个4位数的数字,其中前两位数是区域,后两位数是轨道。数字可以在区域和/或轨迹字段中具有alpha字符,并且可以选择具有一个或两个字符的alpha后缀。有效记号是范围
[0000,9999]
中的所有整数(即使表示为字符串)。所有有效的勾号都是有效的Gis勾号,但有效的Gis勾号也可以类似于
A912、R123、0123G、A346*

我的对称性违规是在GisTick
compareTo
中,我考虑了可能的后缀,但在普通的Tick
compareTo
中,我没有考虑它。因此,如果“this”是
0000
Tick,“that”是
0000*
Gis Tick,
0000.compareTo(0000*)
将返回0。而如果“this”是一个
0000*
Gis勾号,“that”是一个
0000
勾号,
0000*.compareTo(0000)
将返回1。明显的对称性破坏(一旦护罩向后拉)

Ceekay在回答相关问题时表示

  • 创建包含32个或更多对象的列表
  • 在该列表中,需要[有]两次或更多的运行
  • 每个管路必须包含3个或更多对象
  • 一旦满足这三个标准,就可以开始测试该故障

    我相信我已经为我的单元测试建立了这样一个TickNumber(和GisTickNumber)对象列表,但我似乎不能让测试失败。即使列表中有100多个对象、两个以上的运行,并且每个运行包含大约10个对象。因此,我的问题是,要使对
    Collections.sort(testList)
    的调用由于“一般(对称)契约违反”而失败,测试对象列表还需要满足哪些其他特性

    • 是的,在我运行单元测试之前,我注释掉了我预期会失败的修复
      • 已解决:
        我最终调试到一个断点,在那里我可以查看列表中对象的
        toString()
        表示,并对其进行排序,然后能够从其余数据中提取TickNumber信息,并最终在单元测试中使用提取的数据。最后,我返回并删除了列表项,直到我创建了一个似乎满足触发对称相关“一般合同违规”的“最低要求”的列表

        我不知道如何将我的具体解决方案概括为一个列表必须满足的一般特征,以触发TimsSort和这种“违反一般合同”。但这是

        • 列表必须包含64个元素(49+1+12+1+1)
        • 列表必须包含50次运行,其中50个元素中的49个元素的比较结果为0(即比较匹配)
          • 在“匹配运行”的前半部分中,必须有1个元素排序在运行中的所有其他元素之前(比较运行中的所有其他元素时匹配),并且该单个奇数元素也必须与其他运行末尾的元素“对称性不匹配”
        • 该列表必须包含至少两次其他三个或更多元素的运行(我的测试列表运行8次,然后运行4次)
          • “对称性不匹配”的另一半必须是第4次运行(第二次运行)中的最后一项
        • 列表必须在(end-1)位置包含一个元素,该元素排序到已排序列表的开头
        • 该列表必须包含在(结束)位置中的元素,该排序在排序列表中的某个地方中排序。
        我很确定上面的项目并不是一个详尽的列表,当列表被排序时,列表必须满足公开对称性冲突的一般要求,但它们在一个特定的情况下对我有效

        具体来说,我精心编制的测试列表以49个TickNumber对象开始,其中Tick=“9999”,在49个Tick的前半部分的某处有一个“9910”Tick,在这个开始的伪运行中总共有50个Tick数字。(伪,因为“9910”打破了49个匹配的“9999”记号的未排序运行。)开始运行中的“9910”记号是我正在测试的对称性不匹配的一半。然后,测试列表包含12个GisTickNumber对象,作为8次运行(“9915*”、“9920*”、“9922*”、“9931*”、“9933*”、“9934*”、“9936*”、“9939*”),然后是4次运行(“9907*”、“9908*”、“9909*”、“9910*”)。请注意,运行4中的最后一项是我正在测试的“对称性不匹配”的另一半。最后,该列表以一个“9901”TykNoMnObl对象关闭,该对象将导致排序的列表,以及一个“9978 *”GISTICNoNoBox对象,该对象在中间的某个地方排序。我已尝试删除和/或重新排列测试列表中的对象,但均无效。例如,如果“9901”元素从测试列表中删除,单元测试将开始发出假阳性(成功)结果。(如果将“9901”移到未排序列表的前面,也会出现误报)

        注意:我怀疑“9910”对称性不匹配的普通数字部分可能出现在MIN_run’th元素之前的开始运行中的任何位置。换句话说,如果MIN_RUN是32,而l
        public class TickNumber implements Comparable<TickNumber> {
            protected String zone;
            protected String track;
        }
        public class GisTickNumber extends TickNumber implements Comparable<TickNumber> {
            private String suffix;
        }