- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个类如下:
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__
。所以我有以下两个问题:
__init__
。我读自 here A.__new__()
可以跳过调用 __init__
但仍然实例化类。有没有更好的方法可以在不这样做的情况下实现我的需求?注意:
关于我在这里的提问有 2 个问题:
__init__
初始化对象的情况下实例化类?对于问题 1,我进行了快速的 google 搜索并找到了一些相关的研究或讨论:
We initially test base classes having no parents by designing a test suite that tests each member function individually and also tests the interactions among member functions.
对于问题 2,我不确定。但是我觉得有必要,如示例代码所示,在__init__
中调用了func1和func2。我觉得在尚未使用 __init__
调用(因此之前没有调用 func1 和 func2)的类 A 对象上测试它们会更舒服。
当然,也可以用常规方法(testobj = A())实例化一个A类对象,然后分别对func1和func2进行测试。但它好吗:)?我只是在这里讨论测试这种情况的最佳方法是什么,利弊是什么。
另一方面,有人可能会争辩说,从设计的角度来看,一开始就不应该在 __init__
中调用 func1 和 func2。这是一个合理的设计选项吗?
最佳答案
在不实例化类(包括运行 __init__
)的情况下测试类的方法通常没有用,甚至不可能。通常,您的类方法将引用类的属性(例如,self.a
)。如果您不运行 __init__
,这些属性将不存在,因此您的方法将不起作用。 (如果您的方法不依赖于它们实例的属性,那么为什么它们是方法而不仅仅是独立函数?)在您的示例中,它看起来像 func1
和 func2
是初始化过程的一部分,因此应将它们作为初始化过程的一部分进行测试。
理论上,可以通过使用 __new__
然后仅添加您需要的成员来“准实例化”该类,例如:
obj = A.__new__(args)
obj.a = "test value"
obj.func1()
但是,这可能不是进行测试的好方法。一方面,它会导致您复制可能已经存在于初始化代码中的代码,这意味着您的测试更有可能与真实代码不同步。另一方面,您可能必须以这种方式重复许多初始化调用,因为您必须手动重新执行从您的类调用的任何基类 __init__
方法否则会执行的操作。
至于如何设计测试,可以看看the unittest module和/或 the nose module .这为您提供了如何设置测试的基础知识。实际放入测试中的内容显然取决于您的代码应该做什么。
编辑:问题 1 的答案是“肯定是,但不一定是每个人”。问题 2 的答案是“可能不会”。即使在您提供的第一个链接中,也存在关于是否应该测试不属于该类公共(public) API 的方法的争论。如果你的 func1 和 func2 是纯粹的内部方法,只是初始化的一部分,那么可能没有必要在初始化之外单独测试它们。
这就是你的最后一个问题,即从 __init__
中调用 func1 和 func2 是否合适。正如我在评论中反复声明的那样,这取决于这些函数的作用。如果 func1 和 func2 执行部分初始化(即为实例做一些“设置”工作),那么从 __init__
调用它们是完全合理的;但在那种情况下,它们应该作为初始化过程的一部分进行测试,没有必要单独测试它们。如果 func1 和 func2 不是初始化的一部分,那么是的,您应该独立测试它们;但在那种情况下,为什么它们在 __init__
中?
构成类实例化不可分割部分的方法应作为类实例化测试的一部分进行测试。不应从 __init__
中调用不构成实例化类不可分割部分的方法。
如果 func1 和 func2 是“简单的输入/输出逻辑”并且不需要访问实例,那么它们根本不需要是类的方法;它们可以只是独立的功能。如果你想将它们保留在类中,你可以将它们标记为静态方法,然后直接在类上调用它们而不实例化它。这是一个例子:
>>> class Foo(object):
... def __init__(self, num):
... self.numSquared = self.square(num)
...
... @staticmethod
... def square(num):
... return num**2
>>> Foo.square(2) # you can test the square "method" this way without instantiating Foo
4
>>> Foo(8).numSquared
64
可以想象,您可能有一些需要极其复杂的初始化过程的怪物类。在这种情况下,您可能会发现有必要单独测试该流程的各个部分。然而,这样一个巨大的初始化序列本身就是一个笨拙设计的警告。
关于Python:测试类的单个方法的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11623800/
我获得了一些源代码示例,我想测试一些功能。不幸的是,我在执行程序时遇到问题: 11:41:31 [linqus@ottsrvafq1 example]$ javac -g test/test.jav
我想测试ggplot生成的两个图是否相同。一种选择是在绘图对象上使用all.equal,但我宁愿进行更艰巨的测试以确保它们相同,这似乎是identical()为我提供的东西。 但是,当我测试使用相同d
我确实使用 JUnit5 执行我的 Maven 测试,其中所有测试类都有 @ExtendWith({ProcessExtension.class}) 注释。如果是这种情况,此扩展必须根据特殊逻辑使测试
在开始使用 Node.js 开发有用的东西之前,您的流程是什么?您是否在 VowJS、Expresso 上创建测试?你使用 Selenium 测试吗?什么时候? 我有兴趣获得一个很好的工作流程来开发我
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 3 年前。 基于示例here ,我尝试为我的
我正在考虑测试一些 Vue.js 组件,作为 Laravel 应用程序的一部分。所以,我有一个在 Blade 模板中使用并生成 GET 的组件。在 mounted 期间请求生命周期钩子(Hook)。假
考虑以下程序: #include struct Test { int a; }; int main() { Test t=Test(); std::cout<
我目前的立场是:如果我使用 web 测试(在我的例子中可能是通过 VS.NET'08 测试工具和 WatiN)以及代码覆盖率和广泛的数据来彻底测试我的 ASP.NET 应用程序,我应该不需要编写单独的
我正在使用 C#、.NET 4.7 我有 3 个字符串,即。 [test.1, test.10, test.2] 我需要对它们进行排序以获得: test.1 test.2 test.10 我可能会得到
我有一个 ID 为“rv_list”的 RecyclerView。单击任何 RecyclerView 项目时,每个项目内都有一个可见的 id 为“star”的 View 。 我想用 expresso
我正在使用 Jest 和模拟器测试 Firebase 函数,尽管这些测试可能来自竞争条件。所谓 flakey,我的意思是有时它们会通过,有时不会,即使在同一台机器上也是如此。 测试和函数是用 Type
我在测试我与 typeahead.js ( https://github.com/angular-ui/bootstrap/blob/master/src/typeahead/typeahead.js
我正在尝试使用 Teamcity 自动运行测试,但似乎当代理编译项目时,它没有正确完成,因为当我运行运行测试之类的命令时,我收到以下错误: fatal error: 'Pushwoosh/PushNo
这是我第一次玩 cucumber ,还创建了一个测试和 API 的套件。我的问题是在测试 API 时是否需要运行它? 例如我脑子里有这个, 启动 express 服务器作为后台任务 然后当它启动时(我
我有我的主要应用程序项目,然后是我的测试的第二个项目。将所有类型的测试存储在该测试项目中是一种好的做法,还是应该将一些测试驻留在主应用程序项目中? 我应该在我的主项目中保留 POJO JUnit(测试
我正在努力弄清楚如何实现这个计数。模型是用户、测试、等级 用户 has_many 测试,测试 has_many 成绩。 每个等级都有一个计算分数(strong_pass、pass、fail、stron
我正在尝试测试一些涉及 OkHttp3 的下载代码,但不幸失败了。目标:测试 下载图像文件并验证其是否有效。平台:安卓。此代码可在生产环境中运行,但测试代码没有任何意义。 产品代码 class Fil
当我想为 iOS 运行 UI 测试时,我收到以下消息: SetUp : System.Exception : Unable to determine simulator version for X 堆
我正在使用 Firebase Remote Config 在 iOS 上设置 A/B 测试。 一切都已设置完毕,我正在 iOS 应用程序中读取服务器端默认值。 但是在多个模拟器上尝试,它们都读取了默认
[已编辑]:我已经用 promise 方式更改了我的代码。 我正在写 React with this starter 由 facebook 创建,我是测试方面的新手。 现在我有一个关于图像的组件,它有
我是一名优秀的程序员,十分优秀!