【发布时间】:2012-07-22 08:29:48
【问题描述】:
我有一个类似如下的课程:
class A:
def __init__(self, arg1, arg2, arg3):
self.a=arg1
self.b=arg2
self.c=arg3
# ...
self.x=do_something(arg1, arg2, arg3)
self.y=do_something(arg1, arg2, arg3)
self.m = self.func1(self.x)
self.n = self.func2(self.y)
# ...
def func1(self, arg):
# do something here
def func2(self, arg):
# do something here
如您所见,初始化类需要传入 arg1、arg2 和 arg3。但是,测试 func1 和 func2 并不直接需要这样的输入,而是简单的输入/输出逻辑。
在我的测试中,我当然可以用常规的方式实例化和初始化一个测试对象,然后分别测试func1和func2。但是初始化需要输入arg1 arg2, arg3,这和测试func1 和func2 真的没有关系。
因此,我想单独测试 func1 和 func2,而无需先调用 __init__。所以我有以下两个问题:
- 设计此类测试的最佳方法是什么? (最好在 py.test 中)
- 我想在不调用
__init__的情况下测试 func1 和 func2 。我从here 中读到A.__new__()可以跳过调用__init__但仍然实例化了该类。有没有更好的方法可以在不这样做的情况下实现我的需要?
注意:
关于我在这里提出的问题有 2 个问题:
- 是否需要测试单个成员函数?
- (用于测试目的)是否有必要在不使用
__init__初始化对象的情况下实例化一个类?
对于问题 1,我做了一个快速的谷歌搜索,并找到了一些相关的研究或讨论:
- Unit Testing Non Public Member Functions
- (PDF) Incremental Testing of Object-Oriented Class Structures.
我们最初通过设计一个测试来测试没有父类的基类 单独测试每个成员函数并测试 成员函数之间的交互。
对于问题 2,我不确定。但我认为有必要,如示例代码所示,func1和func2在__init__中被调用。我觉得在尚未使用 __init__ 调用的 A 类对象上测试它们更舒服(因此以前没有调用 func1 和 func2)。
当然,可以只用常规方法 (testobj = A()) 实例化一个 A 类对象,然后对 func1 和 func2 执行单独的测试。但是这样好吗:)?我只是在这里讨论测试这种情况的最佳方法是什么,优缺点是什么。
另一方面,有人可能会争辩说,从设计的角度来看,首先不应该在__init__ 中调用func1 和func2。这是一个合理的设计方案吗?
【问题讨论】:
-
没有运行
__init__的测试方法有什么意义?这就像有人要求你去参加工作面试,而不是先穿裤子。 -
如果
func1和func2不依赖于被初始化的实例,你确定它们应该是实例方法吗?