Pex仪器可以导致代码改变其效果吗?

时间:2011-03-25 00:23:21

标签: regex instrumentation pex thread-local false-positive

我有一个简单的JSON lexer类;需要string并生成IJSONValue; IJSONValueToJSONString方法,返回有效的JSON字符串。

当然,代码很复杂,有很多分支;这就是为什么我认为这将是测试Pex能力的最佳位置。我创建了以下测试:

[TestClass]
[PexClass]
public partial class JSONTests {
    [PexGenericArguments(typeof(JSONArray))]
    [PexGenericArguments(typeof(JSONBoolean))]
    [PexGenericArguments(typeof(JSONNull))]
    [PexGenericArguments(typeof(JSONNumber))]
    [PexGenericArguments(typeof(JSONObject))]
    [PexGenericArguments(typeof(JSONString))]
    [PexMethod]
    public void TestLexer<T>([PexAssumeNotNull] T value) where T : IJSONValue {
        string json = value.ToJSONString();
        IJSONValue result = new JSONLexer().GetValue(json);

        PexAssert.AreEqual(value, result);
    }
}

对此运行Pex我发现了一些非处理的问题,我修复了这个问题。但是,我也有很多方法报告没有意义的异常。它们看起来像这样:

[TestMethod]
[PexGeneratedBy(typeof(JSONTests))]
[PexRaisedException(typeof(JSONException))]
public void TestLexerThrowsJSONException78() {
    JSONBoolean s0 = new JSONBoolean(true);
    this.TestLexer<JSONBoolean>(s0);
}

然而,这与我所知道的一项测试非常相似。我在调试器中运行它,在调试器外部运行它,并且在两种情况下测试都通过了。最令人难以置信的是异常文本实际上是有道理的;如果Constant正则表达式与字符串"false"不匹配,则会报告该文本。我得到了其他正则表达不匹配的类似例外情况,这些情况没有意义。

为什么Pex认为这会抛出异常?仪器是否以奇怪的方式混淆了ThreadLocalRegex?这就是我的正则表达式持有类(正则表达式是为了简洁而编译)。

private static class Regexes {
    private static RegexOptions Options = RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace;
    public static ThreadLocal<Regex> String = new ThreadLocal<Regex>(() => new Regex(@"(...)", Options));
    public static ThreadLocal<Regex> Number = new ThreadLocal<Regex>(() => new Regex(@"(...)", Options));
    public static ThreadLocal<Regex> Constant = new ThreadLocal<Regex>(() => new Regex(@"(...)", Options));
}

0 个答案:

没有答案