Groovy Power Assert语句输出

时间:2014-05-12 20:13:48

标签: groovy assert

我使用Spock并且讨厌硬断言进行功能测试。我已经编写了一个SoftAssert类,一切正常,我只是想让它看起来更像是Groovy的权力断言。

这是我现有的方法:

public void verifyEquals(def expected, def actual, String message = '') {
    try {
        assert expected == actual
    } catch (AssertionError e) {
        LOGGER.warn("Verification failed, expected: ${expected.toString()} but got ${actual}.\n ${message}")
        softAssertList.add(new SoftAssert(message, e))
    }
}

我只是抓住失败,这很简单。现在缺少的是Groovy做得很好的输出。而不是我传递给verifyEquals的语句,例如:verifyEquals(8, (3 + x) * z)

8 == (3 + x) * z
  |     | |  | |
  |     | 0  | |
  |     3    | 2
  |          6
false

我得到expected == actual

expected == actual
   |     |    |
   8     |    6
       false

这是因为语句是在将其传递给方法之前计算的。有人知道如何在传递参数的同时以verifyEquals(8, (3 + x) * z)的格式保持测试,以及如何从原始参数中保留Power Assert错误?

2 个答案:

答案 0 :(得分:5)

verify方法应该接受包含断言的Closure(代码块),执行它并存储抛出的任何异常。然后使用情况如下:verify { assert 8 == (3 + x) * z }

如果使用Spock的@ConditionBlock注释注释该方法并将其放在Spock可以在编译时找到它的位置(例如基类),则甚至可以省略assert关键字。

请注意,Spock的条件与Groovy的电源断言不同。如果您捕获Spock的ConditionNotSatisfiedError,您将获得有关断言的更多信息(例如完整的语法树),您可以利用它来提供更好的反馈。如果您不需要这些附加信息,那么抓住AssertionError就可以了。

答案 1 :(得分:0)

也许我的答案有点偏离主题,但这个问题最接近我在这里搜索的内容,我想分享我自己的发现。我发现这个模式在使用Spock时非常有用:

try {
  assert myPage.myField.text() == "field valueXXX"
}
catch (ConditionNotSatisfiedError e) {
  // Enrich Groovy PowerAssertion with additional text
  def condition = e.condition
  throw new ConditionNotSatisfiedError(
    new Condition(
      condition.values,
      condition.text,
      condition.position,
      "Attention, the Selenium driver obviously cannot delete the session cookie " +
        "JSESSIONID_MY_PROJECT because of 'http-only'!\n" +
        "Please deploy my.project.mobile.smoke instead of my.project.mobile."
    )
  )
}

错误日志如下所示:

Condition not satisfied:

myPage.myField.text() == "field value"
|         |       |      |
|         |       |      false
|         |       |      3 differences (78% similarity)
|         |       |      field value(---)
|         |       |      field value(XXX)
|         |       field valueXXX
|         myField - SimplePageContent (owner: my.project.module.geb.pages.MyPage, args: [], value: null)
my.project.module.AdminPage

Attention, the Selenium driver obviously cannot delete the session cookie JSESSIONID_MY_PROJECT because of 'http-only'!
Please deploy my.project.mobile.smoke instead of my.project.mobile.

Expected :field valueXXX
Actual   :field value

  <Click to see difference>

    at my.project.module.MySampleIT.#testName(MySampleIT.groovy:57)