簡単な JSON lexer クラスがあります。を取り、string
を生成しIJSONValue
ます。これにIJSONValue
はToJSONString
、有効な JSON 文字列を返すメソッドがあります。
もちろん、そのためのコードは非常に複雑で、多くの分岐があります。だからこそ、これはペックスの能力をテストするのに最適な場所だと思った. 次のテストを作成しました。
[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 を実行すると、null 処理に関するいくつかの非問題が見つかりましたが、これは修正済みです。ただし、意味をなさない例外を報告する多くのメソッドも取得しました。それらは次のようになります。
[TestMethod]
[PexGeneratedBy(typeof(JSONTests))]
[PexRaisedException(typeof(JSONException))]
public void TestLexerThrowsJSONException78() {
JSONBoolean s0 = new JSONBoolean(true);
this.TestLexer<JSONBoolean>(s0);
}
ただし、これは、動作することがわかっている私のテストの 1 つとかなり似ています。デバッガー内とデバッガー外で実行しましたが、どちらの場合もテストに合格しました。最も不可解なことは、例外テキストが実際には何らかの意味を成すことです。Constant
正規表現が文字列と一致しなかった場合に報告されるテキストです"false"
。他の正規表現の不一致についても同様の例外が発生しますが、これは意味がありません。
Pex がこれが例外をスローすると考えるのはなぜですか? インストルメンテーションが混乱しThreadLocal
たりRegex
、奇妙な方法で混乱したりしますか? これが私の正規表現保持クラスの外観です (簡潔にするために正規表現は編集されています)。
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));
}