Play Framework의 Specs2에서 Json을 비교하는 Matcher를 자작하고 보기 쉽게 했다
8076 단어 JSONScalaPlayFrameworkSpecs2
개요
Play Framework의 Specs2에서 Json을 비교하는 테스트를 작성하는 경우 오류 메시지를 이해하기 어렵고 어려운 경험이 있습니까?
일치하지 않는 것은 알지만, 어디의 값이 일치하지 않는 등이 알기 어려웠기 때문에, 자작해 보았습니다.
이번에 사용한 소스는
htps : // 기주 b. 이 m / 2KB / j 그런 t t r
에 게시하고 있습니다.
기존과 자작의 비교
기존의 것은, 이런 식으로 Json의 비교를 하면
val jsonA = Json.parse(
"""
{
"string_field" : "string",
"number_field" : 100,
"boolean_field" : false,
"null_field" : null,
"array_field" : ["string", 100, false, null],
"object_field" : {"xxx_field" : "xxx", "yyy_field" : 100}
}
""")
// jsonAから、フィールドの順番を変えつつ、xxx_fieldの値を変えている
val jsonB = Json.parse(
"""
{
"number_field" : 100,
"string_field" : "string",
"boolean_field" : false,
"null_field" : null,
"object_field" : {"xxx_field" : "zzz", "yyy_field" : 100},
"array_field" : ["string", 100, false, null]
}
""")
jsonA must be_==(jsonB)
이런 오류 메시지가 나타납니다.
[error] '{"string_field":"string","number_field":100,"boolean_field":false,"null_field":null,"array_field":["string",100,false,null],"object_field":{"xxx_field":"xxx","yyy_field":100}}'
[error]
[error] is not equal to
[error]
[error] '{"number_field":100,"string_field":"string","boolean_field":false,"null_field":null,"object_field":{"xxx_field":"zzz","yyy_field":100},"array_field":["string",100,false,null]}' (CompareJsonMatchErrorMessageSpec.scala:14)
[error] Actual: {"[string]_f...":[]"s...ng[","number]_f...":[100],"...,"[array]_f...":[]"[string",100,fa]l[se,null][object]_f...":[{]"[xxx]_f...":[]"[xxx]",["yyy_]f[ield":100}]}
[error] Expected: {"[number]_f...":[100,]"s...ng[]_f...":["string"],"...,"[object]_f...":[{]"[xxx_fie]l[d":"zzz"],"[yyy]_f...":[100},]"[array]_f...":[]"[string]",[100,]f[alse,null
조금 어디 틀렸는지 모르겠네요.
게다가, 일치하고 있는지 어떤지에 관해서는, 필드의 차례 무시하는 주제에, 어디에서 잘못하고 있는지의 메세지는, 차례대로 그대로 비교한다고 하는, 유감감.
A와 B에서 차이가 있는 것은, xxx_field 의 값뿐이므로, 거기가 확실히 알게 되었으면 하는 것입니다.
자작한 녀석이라면 에러 메시지는 이런 느낌이 듭니다.
jsonA must equalToJson(jsonB)
[error] Each json not match.
[error]
[error] Path : object_field->xxx_field
[error] Actual : "xxx"
[error] Expected : "zzz"
[error] -----
[error] Actual detail :
[error] {
[error] "array_field" : [ "string", 100, false, null ],
[error] "boolean_field" : false,
[error] "null_field" : null,
[error] "number_field" : 100,
[error] "object_field" : {
[error] "xxx_field" : "xxx",
[error] "yyy_field" : 100
[error] },
[error] "string_field" : "string"
[error] }
[error]
[error] Expected detail :
[error] {
[error] "array_field" : [ "string", 100, false, null ],
[error] "boolean_field" : false,
[error] "null_field" : null,
[error] "number_field" : 100,
[error] "object_field" : {
[error] "xxx_field" : "zzz",
[error] "yyy_field" : 100
[error] },
[error] "string_field" : "string"
[error] }
[error] -----
[error]
[error] at (CompareJsonMatchErrorMessageSpec.scala:19)
어디가 잘못되었는지 알기 쉬워졌을까 생각합니다.
사용법
우선 Specs2 설정이 필요합니다. build.sbt에 'specs2% Test' 라이브러리를 추가하세요.
libraryDependencies ++= Seq(
...
specs2 % Test
)
그리고 이번에 만든 Matcher
htps : // 기주 b. 이 m / 2KB / j 그런 t t r / b ぉ b / ms r / st / t t rs / J 그런 t ぇ r. s?
을 다운로드하여 프로젝트에 배치하고,
htps : // 기주 b. 이 m / 2KB / j 그렇습니다 t 치 r / b ぉ b / 뭐 r / st / m 빠레 J そ ま t ぇ 로 r 메사게 S ぺc. s?
에서했듯이 이번에 만들었습니다.
JsonMatcher
상속
jsonA must equalToJson(jsonB)
와 같이 비교하십시오.
비교할 값은 JsValue 유형입니다.
다음과 같이 Json 문자열을 구문 분석하면 JsValue 유형이됩니다.
import play.api.libs.json.Json
val jsonVal = Json.parse("""{"xxx" : "hogehoge"}""")
Play Framework 이외의 Specs2에서도 사용할 수 있다고 생각합니다만,
그렇다면 Play-JSON 라이브러리도 필요할 것입니다.
htps : // mv 넝마와 ry. 코 m/아 r치후ぁct/코 m. ty ぺさふぇ. pぁy/pぁyーj 쏘_2.11
기타 설명 등
Matcher를 만드는 방법에 대해
이번에 만든 Matcher는
htps : // 기주 b. 이 m / 2KB / j 그런 t t r / b ぉ b / ms r / st / t t rs / J 그런 t ぇ r. s?
그렇지만, 이 만드는 방법이 일반적인지 아닌지 등은 정직하게 모릅니다・・・.
Matcher를 만드는 방법은 별로 정보가 없고, 정보가 있어도 실제로 만들어 보면, 행수가 잘 잡히지 않는 등의 문제가 있어,
시행착오하고 있는 사이에 어쩐지 할 수 있었던 것이 되기 때문에, 만약 만드는 방법에 자세한 사람이 있어, 조금 이것 이상하잖아?
라는 것이 있으면 꼭 츳코미 주시면 다행입니다.
비교 방법 상세
기존의 것은, 이런 식으로 Json의 비교를 하면
val jsonA = Json.parse(
"""
{
"string_field" : "string",
"number_field" : 100,
"boolean_field" : false,
"null_field" : null,
"array_field" : ["string", 100, false, null],
"object_field" : {"xxx_field" : "xxx", "yyy_field" : 100}
}
""")
// jsonAから、フィールドの順番を変えつつ、xxx_fieldの値を変えている
val jsonB = Json.parse(
"""
{
"number_field" : 100,
"string_field" : "string",
"boolean_field" : false,
"null_field" : null,
"object_field" : {"xxx_field" : "zzz", "yyy_field" : 100},
"array_field" : ["string", 100, false, null]
}
""")
jsonA must be_==(jsonB)
이런 오류 메시지가 나타납니다.
[error] '{"string_field":"string","number_field":100,"boolean_field":false,"null_field":null,"array_field":["string",100,false,null],"object_field":{"xxx_field":"xxx","yyy_field":100}}'
[error]
[error] is not equal to
[error]
[error] '{"number_field":100,"string_field":"string","boolean_field":false,"null_field":null,"object_field":{"xxx_field":"zzz","yyy_field":100},"array_field":["string",100,false,null]}' (CompareJsonMatchErrorMessageSpec.scala:14)
[error] Actual: {"[string]_f...":[]"s...ng[","number]_f...":[100],"...,"[array]_f...":[]"[string",100,fa]l[se,null][object]_f...":[{]"[xxx]_f...":[]"[xxx]",["yyy_]f[ield":100}]}
[error] Expected: {"[number]_f...":[100,]"s...ng[]_f...":["string"],"...,"[object]_f...":[{]"[xxx_fie]l[d":"zzz"],"[yyy]_f...":[100},]"[array]_f...":[]"[string]",[100,]f[alse,null
조금 어디 틀렸는지 모르겠네요.
게다가, 일치하고 있는지 어떤지에 관해서는, 필드의 차례 무시하는 주제에, 어디에서 잘못하고 있는지의 메세지는, 차례대로 그대로 비교한다고 하는, 유감감.
A와 B에서 차이가 있는 것은, xxx_field 의 값뿐이므로, 거기가 확실히 알게 되었으면 하는 것입니다.
자작한 녀석이라면 에러 메시지는 이런 느낌이 듭니다.
jsonA must equalToJson(jsonB)
[error] Each json not match.
[error]
[error] Path : object_field->xxx_field
[error] Actual : "xxx"
[error] Expected : "zzz"
[error] -----
[error] Actual detail :
[error] {
[error] "array_field" : [ "string", 100, false, null ],
[error] "boolean_field" : false,
[error] "null_field" : null,
[error] "number_field" : 100,
[error] "object_field" : {
[error] "xxx_field" : "xxx",
[error] "yyy_field" : 100
[error] },
[error] "string_field" : "string"
[error] }
[error]
[error] Expected detail :
[error] {
[error] "array_field" : [ "string", 100, false, null ],
[error] "boolean_field" : false,
[error] "null_field" : null,
[error] "number_field" : 100,
[error] "object_field" : {
[error] "xxx_field" : "zzz",
[error] "yyy_field" : 100
[error] },
[error] "string_field" : "string"
[error] }
[error] -----
[error]
[error] at (CompareJsonMatchErrorMessageSpec.scala:19)
어디가 잘못되었는지 알기 쉬워졌을까 생각합니다.
사용법
우선 Specs2 설정이 필요합니다. build.sbt에 'specs2% Test' 라이브러리를 추가하세요.
libraryDependencies ++= Seq(
...
specs2 % Test
)
그리고 이번에 만든 Matcher
htps : // 기주 b. 이 m / 2KB / j 그런 t t r / b ぉ b / ms r / st / t t rs / J 그런 t ぇ r. s?
을 다운로드하여 프로젝트에 배치하고,
htps : // 기주 b. 이 m / 2KB / j 그렇습니다 t 치 r / b ぉ b / 뭐 r / st / m 빠레 J そ ま t ぇ 로 r 메사게 S ぺc. s?
에서했듯이 이번에 만들었습니다.
JsonMatcher
상속
jsonA must equalToJson(jsonB)
와 같이 비교하십시오.
비교할 값은 JsValue 유형입니다.
다음과 같이 Json 문자열을 구문 분석하면 JsValue 유형이됩니다.
import play.api.libs.json.Json
val jsonVal = Json.parse("""{"xxx" : "hogehoge"}""")
Play Framework 이외의 Specs2에서도 사용할 수 있다고 생각합니다만,
그렇다면 Play-JSON 라이브러리도 필요할 것입니다.
htps : // mv 넝마와 ry. 코 m/아 r치후ぁct/코 m. ty ぺさふぇ. pぁy/pぁyーj 쏘_2.11
기타 설명 등
Matcher를 만드는 방법에 대해
이번에 만든 Matcher는
htps : // 기주 b. 이 m / 2KB / j 그런 t t r / b ぉ b / ms r / st / t t rs / J 그런 t ぇ r. s?
그렇지만, 이 만드는 방법이 일반적인지 아닌지 등은 정직하게 모릅니다・・・.
Matcher를 만드는 방법은 별로 정보가 없고, 정보가 있어도 실제로 만들어 보면, 행수가 잘 잡히지 않는 등의 문제가 있어,
시행착오하고 있는 사이에 어쩐지 할 수 있었던 것이 되기 때문에, 만약 만드는 방법에 자세한 사람이 있어, 조금 이것 이상하잖아?
라는 것이 있으면 꼭 츳코미 주시면 다행입니다.
비교 방법 상세
libraryDependencies ++= Seq(
...
specs2 % Test
)
jsonA must equalToJson(jsonB)
import play.api.libs.json.Json
val jsonVal = Json.parse("""{"xxx" : "hogehoge"}""")
Matcher를 만드는 방법에 대해
이번에 만든 Matcher는
htps : // 기주 b. 이 m / 2KB / j 그런 t t r / b ぉ b / ms r / st / t t rs / J 그런 t ぇ r. s?
그렇지만, 이 만드는 방법이 일반적인지 아닌지 등은 정직하게 모릅니다・・・.
Matcher를 만드는 방법은 별로 정보가 없고, 정보가 있어도 실제로 만들어 보면, 행수가 잘 잡히지 않는 등의 문제가 있어,
시행착오하고 있는 사이에 어쩐지 할 수 있었던 것이 되기 때문에, 만약 만드는 방법에 자세한 사람이 있어, 조금 이것 이상하잖아?
라는 것이 있으면 꼭 츳코미 주시면 다행입니다.
비교 방법 상세
되어 있습니다.
정말 비교 결과 있나요?
일단 시험은 만들었습니다.
어쩌면 괜찮다고 생각합니다만, 실수 등 있으면 츳코미 잘 부탁드립니다.
htps : // 기주 b. 이 m / 2KB / j 그런 t t r / b ぉ b / ms r / st / t t rs / J 그런 t ぇ rS ぺc. s?
Reference
이 문제에 관하여(Play Framework의 Specs2에서 Json을 비교하는 Matcher를 자작하고 보기 쉽게 했다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/2KB/items/9d86fdfb8a268a05d114텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)