当前位置: 首页 > 知识库问答 >
问题:

用于浮点数集合的Python单元测试中的AssertalPosteQual

宗项禹
2023-03-14

Python的单元测试框架中的assertAlmostEqual(x, y)方法测试xy是否近似相等,假设它们是浮点数。

assertAlmostEqual()的问题在于它只在浮动上工作。我正在寻找一种类似于assertAlmostEqual()的方法,它适用于浮点数列表、浮点数集、浮点数字典、浮点数元组、浮点数元组列表、浮点数列表集等。

例如,让x=0.1234567890y=0.1234567891xy几乎相等,因为它们在每个数字上都一致,但最后一个数字除外。因此,self。assertAlmostEqual(x,y)True,因为assertAlmostEqual()适用于浮动。

我正在寻找一个更通用的assertAlmostEquals(),它还计算对True的以下调用:

  • self.assertAlmostEqual_generic([x, x, x],[y, y, y]).
  • self.assertAlmostEqual_generic({1: x,2: x,3: x},{1: y,2: y,3: y}).
  • self.assertAlmostEqual_generic([(x, x)],[(y, y)]).

有没有这样的方法,还是要我自己去实施?

澄清:

>

  • assertAlmostEquals()有一个名为places的可选参数,通过计算四舍五入到小数位数的差值来比较这些数字。默认情况下places=7,因此self。assertAlmostEqual(0.5,0.4)为False,而为self。AssertalPosteQual(0.12345678,0.12345679)为真。我的推测性assertAlmostEqual\u generic()应该具有相同的功能。

    如果两个列表的数字几乎相等,且顺序完全相同,则认为它们几乎相等。形式上,表示范围(n)中的i:self。assertAlmostEqual(列表1[i],列表2[i])

    类似地,如果可以将两个集合转换为几乎相等的列表(通过为每个集合指定顺序),则认为它们几乎相等。

    类似地,如果每个字典的密钥集几乎等于另一个字典的密钥集,则认为两个字典几乎相等,并且对于每个几乎相等的密钥对,都有一个对应的几乎相等的值。

    一般来说,我认为两个集合几乎相等,如果它们是相等的,除了一些对应的浮点,它们几乎彼此相等。换句话说,我希望真正比较对象,但在比较浮动时,精度较低(自定义)。


  • 共有3个答案

    柳业
    2023-03-14
    匿名用户

    下面是我如何实现一个通用的is_almost_equal(第一,第二)函数:

    首先,复制需要比较的对象(第一个第二个),但不要复制一个精确的副本:剪切对象内部遇到的任何浮点小数。

    现在您已经有了无小数点的firstsecond副本,只需使用=操作符比较firstsecond

    假设我们有一个递归(obj,places)函数,它复制了obj,但只在原始obj中保留每个浮点数的places最高有效小数位数。下面是几乎等于(第一,第二,位置)的一个工作实现:

    from insignificant_digit_cutter import cut_insignificant_digits_recursively
    
    def is_almost_equal(first, second, places):
        '''returns True if first and second equal. 
        returns true if first and second aren't equal but have exactly the same
        structure and values except for a bunch of floats which are just almost
        equal (floats are almost equal if they're equal when we consider only the
        [places] most significant digits of each).'''
        if first == second: return True
        cut_first = cut_insignificant_digits_recursively(first, places)
        cut_second = cut_insignificant_digits_recursively(second, places)
        return cut_first == cut_second
    

    下面是一个递归(obj,places)剪切不重要数字的工作实现:

    def cut_insignificant_digits(number, places):
        '''cut the least significant decimal digits of a number, 
        leave only [places] decimal digits'''
        if  type(number) != float: return number
        number_as_str = str(number)
        end_of_number = number_as_str.find('.')+places+1
        if end_of_number > len(number_as_str): return number
        return float(number_as_str[:end_of_number])
    
    def cut_insignificant_digits_lazy(iterable, places):
        for obj in iterable:
            yield cut_insignificant_digits_recursively(obj, places)
    
    def cut_insignificant_digits_recursively(obj, places):
        '''return a copy of obj except that every float loses its least significant 
        decimal digits remaining only [places] decimal digits'''
        t = type(obj)
        if t == float: return cut_insignificant_digits(obj, places)
        if t in (list, tuple, set):
            return t(cut_insignificant_digits_lazy(obj, places))
        if t == dict:
            return {cut_insignificant_digits_recursively(key, places):
                    cut_insignificant_digits_recursively(val, places)
                    for key,val in obj.items()}
        return obj
    

    代码及其单元测试可以在这里获得:https://github.com/snakile/approximate_comparator.我欢迎任何改进和错误修复。

    齐夕
    2023-03-14

    从python 3.5开始,您可以使用

    math.isclose(a, b, rel_tol=1e-9, abs_tol=0.0)
    

    如pep-0485所述。实施应等同于

    abs(a-b) <= max( rel_tol * max(abs(a), abs(b)), abs_tol )
    
    苗信鸥
    2023-03-14

    如果您不介意使用NumPy(随您的Python(x,y)附带),您可能需要查看定义assert_almost_equal函数的np.testing模块。

    签名是np。测试。断言几乎相等(实际值、期望值、小数=7、err\u msg=''、verbose=True)

    >>> x = 1.000001
    >>> y = 1.000002
    >>> np.testing.assert_almost_equal(x, y)
    AssertionError: 
    Arrays are not almost equal to 7 decimals
    ACTUAL: 1.000001
    DESIRED: 1.000002
    >>> np.testing.assert_almost_equal(x, y, 5)
    >>> np.testing.assert_almost_equal([x, x, x], [y, y, y], 5)
    >>> np.testing.assert_almost_equal((x, x, x), (y, y, y), 5)
    
     类似资料:
    • 这是我在Python中的第一个项目,我刚刚学习了框架。测试模块运行良好,当我做,但当我想执行某个类或方法,如留档中所说,使用: 我得到以下错误: 我运行命令的目录包含(我还尝试将名称更改为),带有和方法都以开头,这里是我在终端上运行的命令: 我在任何地方都找不到类似的问题,知道错误背后的原因以及如何在模块或方法内部运行某个类将是非常好的

    • Spring对MockMvc有2个设置: 独立设置 WebApplication Context安装 一般来说,MockMvc用于哪种测试?单元还是集成?或者两者兼而有之? 使用独立设置(运行在Spring应用程序上下文之外)允许您编写单元测试,而使用WebApplication Context设置您可以编写集成测试,这是对的吗?

    • 我使用plugin scala为我的scala项目生成测试覆盖率报告。但是,我无法组合单元测试和集成测试的测试报告。 以下是我运行的命令 在上面的例子中,我只得到集成测试的覆盖率报告。 问题 如何生成一个报告来汇总单元测试和集成测试的结果 提前谢谢。

    • 问题内容: 您如何让Jenkins执行python unittest案例?是否可以从内置包中输出JUnit样式的XML ? 问题答案: tests.py: [带有pytest的JUnit](http://pytest.org/latest/usage.html#creating-junitxml- format-files) 使用以下命令运行测试: results.xml: 带nose的JUnit

    • 本文向大家介绍Python中关于浮点数的冷知识,包括了Python中关于浮点数的冷知识的使用技巧和注意事项,需要的朋友参考一下 本周的PyCoder's Weekly 上分享了一篇小文章,它里面提到的冷知识很有意思,我稍作补充,分享给大家。 它提到的部分问题,读者们可以先思考下: 若两个元组相等,即 a==b 且 a is b,那么相同索引的元素(如 a[0] 、b[0])是否必然相等呢? 若两个

    • 我有一个方法如下。 我想为下面的方法写两个测试用例。 1) 提交数据的成功事务 2) 具有回滚数据的失败事务 我如何写一个涉及事务的测试用例,并成功和失败?

    • 我的spark应用程序中有一个方法从MySQL数据库加载数据。该方法看起来如下所示。 该方法除了执行方法并从数据库加载数据外,其他什么都不做。我该如何测试这种方法呢?标准方法是创建对象的模拟,该对象是的实例。但是由于有一个私有构造函数,所以我无法使用Scalamock来模拟它。 这里的主要问题是,我的函数是一个纯粹的副作用函数(副作用是从关系数据库拉数据),如果我在嘲笑时遇到问题,我如何单元测试这

    • 我有一个应用程序,使用经典的Spring配置与xml,它可以使用Spring启动仅用于单元测试? 像这样: