微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

unittest

如何解决unittest

我对 Python 比较熟悉,但可能忘记了它在某些情况下的预期行为,因为我最近一直在使用 Rust,它有很多内存保护。我应该规定我使用的是 Python 3.9.4。

我正在解决一些 Project Euler 问题以供练习,并且正在使用 unittest 框架编写单元测试以配合我的代码。令我惊讶的是,局部变量的值——即列表——似乎在函数调用中持续存在。我想知道这是否是预期的行为,无论是 Python 还是 unittest 框架?我必须承认我很惊讶。我的例子如下。

代码适用于 Project Euler 的问题 3。 (我相信分享前 100 个问题的解决方案是可以的,所以我没有违反任何 Project Euler 的协议)。我的代码查找给定非负数的质因数(包括重复),如下所示:

import math

# Returns prime factors of a given non-negative number
def prime_factors(n,primes=[]):
    if n < 0:
        raise ValueError('Negative values are not valid')
    if n < 2:
        return primes
    for i in range(2,math.floor(n/2) + 1):
        if n % i == 0:
            primes.append(i)
            return prime_factors(n/i,primes=primes)
    
    primes.append(n)
    return primes

我写了一些单元测试来配合这段代码(为了清楚起见,我略有缩写):

import unittest

class LargestPrimeTestCase(unittest.TestCase):
        
    def test_prime_factors(self):
        
        # Test obvIoUs simple cases
        self.assertEqual([2],prime_factors(2))
        self.assertEqual([3],prime_factors(3))

我希望这些测试通过,但它们在第二个断言语句中失败。也就是说,我收到了一个 AssertionError:

Traceback (most recent call last):
  File "/path/to/file",line 20,in test_largest_prime
    self.assertEqual([3],prime_factors(3))
AssertionError: Lists differ: [3] != [2,3]

然而,如果我只运行第一行或第二行而没有其他行,并注释掉一行,则测试通过。我已经用更复杂的情况测试了我的代码,所以我知道在个别情况下,该函数可以正确识别给定数字的质因数。在我看来,存储在 primes 中的值在函数调用之间保持不变,即使我调用函数时没有规定 primes 的值,这应该重置变量的值。 IE。打电话

x = prime_factors(2)
y = prime_factors(3)
print(x)
print(y)

应该导致:

[2]
[3]

而不是:

[2]
[2,3]

然而,后者似乎正在发生。

如果我将测试的第二行提取到另一个函数,请说:

    def test_prime_factors_2(self):
        self.assertEqual([3],prime_factors(3))

我仍然收到同样的错误

我尝试添加一些 setUptearDown 函数

    def setUp(self):
        primes = []

    def tearDown(self):
        primes=[]

但这也没有解决问题。

这是单元测试的预期行为吗?这是我自己对 Python 关于如何存储和复制变量的困惑吗?我能够通过修改我的代码解决这个问题:

import math
import copy

# Returns prime factors of a given non-negative number
def prime_factors(n,primes=[]):
    prime_numbers = copy.deepcopy(primes) # Adding a deepcopy here to avoid Python copying issues?
    if n < 0:
        raise ValueError('Negative values are not valid')
    if n < 2:
        return prime_numbers
    for i in range(2,math.floor(n/2) + 1):
        if n % i == 0:
            prime_numbers.append(i)
            return prime_factors(n/i,primes=prime_numbers)
    
    prime_numbers.append(n)
    return prime_numbers

这向我表明我的问题与 Python 复制值的方式有关。有人能在这里启发我吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?