読者です 読者をやめる 読者になる 読者になる

「そろそろPower Assertについてひとこと言っておくか」に、SpockのPower Assertならどうだろう?と思って試してみたけど

Spock

そろそろPower Assertについてひとこと言っておくか

SpockのPower Assertなら差分だしてくれたような記憶があったので、試してみた。

結論

@ さんが欲しい差分を先に表示はできない。

@Grapes(
	@Grab(group='org.spockframework', module='spock-core', version='0.7-groovy-2.0')
)
import groovy.transform.Canonical
import spock.lang.*

class SomeDataTest extends Specification {
    def "文字列のメンバーの比較だとどうなる?"() {
        def a = new SomeData("very long long long sting", 19)
        def b = new SomeData("very long long long string", 20)
        expect:
            assert a.str == b.str

    }
    def "数値のメンバーの比較だとどうなる?"() {
        def a = new SomeData("very long long long sting", 19)
        def b = new SomeData("very long long long string", 20)
        expect:
            assert a.i == b.i
    }

    def "インスタンスの比較だとどうなる?"() {
        def a = new SomeData("very long long long sting", 19)
        def b = new SomeData("very long long long string", 20)
        expect:
            assert a == b
    }
}

@Canonical
class SomeData {
  String str
  int i
}

実行結果

JUnit 4 Runner, Tests: 3, Failures: 3, Time: 292
Test Failure: 文字列のメンバーの比較だとどうなる?(SomeDataTest)
Condition not satisfied:

a.str == b.str
| |   |  | |
| |   |  | very long long long string
| |   |  SomeData(very long long long string, 20)
| |   false
| |   1 difference (96% similarity)
| |   very long long long st(-)ing
| |   very long long long st(r)ing
| very long long long sting
SomeData(very long long long sting, 19)

        at SomeDataTest.文字列のメンバーの比較だとどうなる?(test.spock:12)

Test Failure: 数値のメンバーの比較だとどうなる?(SomeDataTest)
Condition not satisfied:

a.i == b.i
| | |  | |
| 19|  | 20
|   |  SomeData(very long long long string, 20)
|   false
SomeData(very long long long sting, 19)

        at SomeDataTest.数値のメンバーの比較だとどうなる?(test.spock:19)

Test Failure: インスタンスの比較だとどうなる?(SomeDataTest)
Condition not satisfied:

a == b
| |  |
| |  SomeData(very long long long string, 20)
| false
SomeData(very long long long sting, 19)

        at SomeDataTest.インスタンスの比較だとどうなる?(test.spock:26)


文字列に限って言えば差分はでてる。でも最初ではなく比較の途中だ。

1 difference (96% similarity)
very long long long st(-)ing
very long long long st(r)ing

インスタンスの比較だとでない。




ごめんなさい。ごめんなさい。




@ さんが既になんか試してた。
でも、混じって見にくいのが解消しないようだ。



bleisさんの「そろそろPower Assertについてひとこと言っておくか」に纏わるお試しコード

import spock.lang.Specification
 
class MorePowerAssertSpec extends Specification {
 
    def obj1 = new Hoge(name: "あいうえお", value: "ほげ")
    def obj2 = new Hoge(name: "あいえお", value: "ほけ")
    def obj3 = new Foo(name: "あいうえお", value: "ほげふう", extra: "ふう")
 
    def setup() {
        Object.metaClass.p = { delegate.properties.toString() }
    }
 
    void "オブジェクトのリッチな比較: 同一インスタンス同士"() {
        expect:
        obj1.p() == obj1.p()
        obj2.p() == obj2.p()
        obj3.p() == obj3.p()
    }
 
    void "オブジェクトのリッチな比較: 同一クラスの別インスタンス同士"() {
        expect:
        obj1.p() == obj2.p()
    }
 
    void "オブジェクトのリッチな比較: 別クラス同士"() {
        expect:
        obj1.p() == obj2.p()
    }
 
    class Hoge {
        def name
        def value
    }
 
    class Foo {
        def name
        def value
        def extra
    }
}
オブジェクトのリッチな比較: 同一クラスの別インスタンス同士(MorePowerAssertSpec)
Condition not satisfied:

obj1.p() == obj2.p()
|    |   |  |    |
|    |   |  |    [value:ほけ, class:class MorePowerAssertSpec$Hoge, name:あいえお]
|    |   |  MorePowerAssertSpec$Hoge@5b2f13ef
|    |   false
|    |   2 differences (98% similarity)
|    |   [value:ほ(げ), class:class MorePowerAssertSpec$Hoge, name:あい(う)えお]
|    |   [value:ほ(け), class:class MorePowerAssertSpec$Hoge, name:あい(-)えお]
|    [value:ほげ, class:class MorePowerAssertSpec$Hoge, name:あいうえお]
MorePowerAssertSpec$Hoge@518c7084

    at MorePowerAssertSpec.groovy:44)


|Running 4 spock tests... 3 of 4
--Output from オブジェクトのリッチな比較: 別クラス同士--
オブジェクトのリッチな比較: 別クラス同士(MorePowerAssertSpec)
Condition not satisfied:

obj1.p() == obj2.p()
|    |   |  |    |
|    |   |  |    [value:ほけ, class:class MorePowerAssertSpec$Hoge, name:あいえお]
|    |   |  MorePowerAssertSpec$Hoge@7a053e2d
|    |   false
|    |   2 differences (98% similarity)
|    |   [value:ほ(げ), class:class MorePowerAssertSpec$Hoge, name:あい(う)えお]
|    |   [value:ほ(け), class:class MorePowerAssertSpec$Hoge, name:あい(-)えお]
|    [value:ほげ, class:class MorePowerAssertSpec$Hoge, name:あいうえお]
MorePowerAssertSpec$Hoge@28c08f61

    at MorePowerAssertSpec.groovy:50)

おまけ

期限はなんか以前にTogetterのがあったな。
pythyon(pytest)の方が古いようだ。