我有以下测试方法,它接受一个字符串数组,复制它,对其进行排序,然后断言已排序的复制元素应该与原始元素不同。
在大多数情况下,此测试应该通过,但我认为如果输入数组恰好已经排序,它应该会失败。
我无法让PEX发现这种情况(除了将其作为种子输入提供)。我可以在PEX中配置什么,或者改变测试的编写方式,以使PEX更有可能发现这个问题?发现这样的输入是否超出了PEX / Z3的能力?
[TestClass]
public class SortingPexTest
{
[PexMethod(TestEmissionFilter = PexTestEmissionFilter.All, MaxConstraintSolverTime = 4)]
[PexAllowedContractRequiresFailure]
public void TM([PexAssumeNotNull] String[] L0)
{
PexAssume.AreElementsNotNull(L0);
PexAssume.AreDistinctValues(L0);
String[] L1 = new String[L0.Length];
L0.CopyTo(L1, 0);
Array.Sort(L1);
PexAssert.IsTrue(!L0.SequenceEqual(L1));
}
}
Microsoft Pex 0.94.51023.0 Microsoft Pex Visual Studio Extensions
答案 0 :(得分:1)
某些版本的Array.Copy
在当前的CLR实现中通过调用本机代码进行了优化。似乎Pex受到这个事实的影响,因为它无法跟踪Array.Copy
例程中的数据流。
通过此修改,测试失败多次:
String[] L1 = L0.OrderBy(x => x).ToArray();
这可能是Pex中的一个缺陷,因为它不会像使用许多其他东西那样用可分析版本替换Array.Copy
。