如何解决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))
我仍然收到同样的错误。
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 举报,一经查实,本站将立刻删除。