gpt4 book ai didi

python - 如何在 Python 的模块中 stub 类以进行测试?

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:33 25 4
gpt4 key购买 nike

我有一个正在使用的模块,它使用 RealClass,所以它是一个我无权访问的内部依赖项。

我希望能够创建一个 FakeClass 来替换 RealClass 的功能以进行测试。我不想替换单个方法,而是替换整个类。

我看了stubble这似乎是我想要的,但我想知道 mox 或任何其他模拟框架是否具有此功能?或者你会建议使用什么?也许fudge ,猴子补丁?只是在寻找这些东西的最佳实践。此外,任何有用的示例都会很棒。

伪代码:

from module import RealClass

class FakeClass
methodsFromRealClassOverridden

class Test(unittest.TestCase):
setup()
teardown()

test1()
stub(RealClass, FakeClass) // something like this, but really just want the functionality
classThatUsesRealClass // now will use FakeClass

更新:

这是我找到的一种方法。它并不完美,但确实有效。

例子:

fake = FakeClass()
stub = stubout.StubOutForTesting()
stub.Set(RealClass, 'method_1', fake.method_1)
stub.Set(RealClass, 'method_2', fake.method_2)

最佳答案

我想你想要的是意见/经验,所以我只给了我的 2 美分。

正如您所注意到的,有一些 Python 测试工具/类/框架,但大多数时候考虑到 Python 的简单性/动态性/开放性,您将限制自己使用涉及在接口(interface)处 stub 的临时相关测试用例级别和一些单元测试……直到您开始使用框架。

猴子修补没有任何贬义,尤其是在执行测试/ stub 时:

#!/usr/bin/env python
# minimal example of library code

class Class:
""" a class """
def method(self, arg):
""" a method that does real work """
print("pouet %s" % arg)

#!/usr/bin/env python
# minimal example for stub and tests, overriding/wrapping one method
from Class import Class

Class._real_method = Class.method
def mymethod(self, arg):
# do what you want
print("called stub")
# in case you want to call the real function...
self._real_method(arg)
Class.method = mymethod

# ...

e = Class()
e.method("pouet")

命名空间将允许您在导入模块中修补导入模块中的东西...

请注意,上述方法不适用于 C 模块中的类。对于它们,您可以使用包装类,该类使用 getattr/setattr 过滤类成员名称,并从包装类返回重新定义的成员。

#!/usr/bin/env python
# Stupid minimal example replacing the sys module
# (not very useful / optimal, it's just an example of patching)

import sys

class SysWrap():
real = sys
def __getattr__(self, attr):
if attr == 'stderr':
class StdErr():
def write(self, txt):
print("[err: %s]" % txt)
return StdErr()
print("Getattr %s" % attr)
return getattr(SysWrap.real, attr)

sys = SysWrap()
# use the real stdout
sys.stdout.write("pouet")
# use fake stderr
sys.stderr.write("pouet")

一旦您厌倦了执行临时测试,您会发现更高级别的东西,例如您提到的那些东西(stubble、fudge)很有用,但是要享受它们并有效地使用它们,您必须首先看到问题他们解决并接受他们在幕后所做的所有自动工作。

ad-hoc monkey patching 的一部分很可能会保留下来,只是更容易理解,而且所有工具都有一些局限性。

工具可以赋予你力量,但你必须深入理解它们才能有效地使用它们。

决定是否使用工具的一个重要方面是,当您传输一段代码时,您传输了整个环境(包括测试工具)。下一个人可能不像你那么聪明而跳过测试,因为你的测试工具对他来说太复杂了。通常,您希望避免在软件中使用大量依赖项。

最后,我认为如果你只使用单元测试和临时测试/猴子补丁,没有人会打扰你,前提是你的东西能用。无论如何,您的代码可能不会那么复杂。

关于python - 如何在 Python 的模块中 stub 类以进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7601228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com