0

我正在尝试使用 squish 比较 2 个值(浮点数),它有时工作正常,但几次失败。这是非常不一致的。有人可以帮助我如何isclose用于比较浮点值。

以下是我的脚本:

 Xposition_set = waitForObject("{id='textBoxGoto_Sample_X'}").text
 Xposition_setValue = round(float(Xposition_set), 2)

 Xposition_displayed = waitForObject("{id='dbxX' nativeObject.DataContext.Name='" + str(positionList[Index])+ "'}").text
 Xposition_displayedValue = round(float(Xposition_displayed), 2)

 test.compare(Xposition_setValue, Xposition_displayedValue,  GetTestCaseNumber() + "X -Positions matches")
4

2 回答 2

0

查看文档math.isclose()

数学。isclose ( a, b, *, rel_tol=1e-09, abs_tol=0.0 )如果ab的值彼此接近,则
返回,否则返回。TrueFalse

底部还要注意:

3.5 版中的新功能。

所以你应该确保你正在运行 Python 3.5+ 来使用这个函数。但是话虽如此,您需要做的就是传递您的价值观。浮点算术错误的标准示例通常是添加0.1 + 0.2

>>> 0.1 + 0.2
0.30000000000000004

因此,如果我们检查该计算是否等于0.3

>>> 0.1 + 0.2 == 0.3
False

使用新math.isclose()功能,我们可以解决这个问题:

>>> import math
>>> math.isclose(0.1 + 0.2, 0.3)
True

在 Python 3.5 之前,您可以手动执行此操作。您只想检查两个数字之间的绝对差异是否非常小。的默认容差math.isclose()1e-09,所以我们可以使用它:

>>> abs(0.1+0.2 - 0.3) < 1e-9
True

实际上,这两个浮点数之间的差异甚至比这要小得多:

>>> abs(0.1+0.2 - 0.3)
5.551115123125783e-17

因此,您可以使用更强的阈值,用于手动检查或使用math.isclose()并传入rel_tol.

于 2017-09-19T11:10:25.580 回答
0

您正在尝试的通常应该可以工作,但是由于缺少信息,因此无法找出您在使用上述代码时遇到的特定问题。

这是一个示例 Squish 测试脚本(对于您似乎使用的 Windows 版 Squish),它可以满足您对 Squish 地址簿示例的要求:

import os
import math

def main():
    startApplication("%s/examples/win/addressbook/Addressbook" % os.getenv("SQUISH_PREFIX"))
    o = waitForObject("{type='Window'}")

    # Obtaining fake value 1:
    o.nativeObject.Text = "1.0"
    v1 = round(float(o.nativeObject.Text), 2)

    # Obtaining fake value 2:
    o.nativeObject.Text = "2.0"
    v2 = round(float(o.nativeObject.Text), 2)

    # Pass:
    test.verify(math.isclose(v1, v2, abs_tol=1))

    # Fail on purpose:
    test.verify(math.isclose(v1, v2, abs_tol=0.9))

请注意,由于 math.isclose(),此测试脚本适用于 Python 3.5.x,因此它不能与 Python 2.7.x 附带的默认 Squish 二进制包一起使用(联系 Squish 技术支持以获取 Squish 二进制使用不同的 Python 版本的包)。

于 2017-09-19T10:45:18.270 回答