我找不到答案,但是很可能已经讨论过该论点。

我正在尝试使用Python语言编写一个很小的尺寸程序。这是我第一次使用动态语言的“真实”体验,我更希望以正确的方式做所有事情。由于开始是单位测试,我将尝试应用的一种做法之一。

如何快速测试方法的参数是正确类型的?我应该这样做吗?

使用正确的类型我的意思是,例如检查与浮点数合作的方法是否与字符串调用。在这种情况下,考虑该方法显然应该接受整数甚至不仅浮动的可能性。

有帮助吗?

解决方案

如何快速测试方法的参数是正确类型的?

最快的方法是什么都不做。

严重地。动态语言解释器(在这种情况下为Python)将比您所编写的任何代码更快地检查。它将仅引起例外,这就是您需要做的。没有什么。

我应该这样做吗?

切勿测试正确的类型。您不能 - 总的来说 - 做到。

假设您有一个需要“数字”的函数

def some_func( x ):
    assert isinstance(x, int)

坏政策。您的功能可能会长时间工作或浮动量和INT。

assert instance( x, (int, long, float) )

坏政策。您仍然排除复合体。确实,您也排除了 decimal.Decimalfractions.Rational 这也是有效的数字。

通过“输入检查”,您将排除有效类型。您唯一可以做的就是假设类型是正确的,并且当某人“滥用”您的功能或类并提供错误的类型时,可以优雅地处理异常。

处理最优雅的方式 TypeError?

没做什么。该程序 应该 完全崩溃。

其他提示

您不应该测试特定类型。根据 文档, ,您应该根据需要使用传递对象,并为用户提供提供自定义实现的机会。

根据您的功能的作用,将参数转换为预期类型可能是合适的:

def my_func(a):
    a = float(a)
    # ...do stuff...

另一个绝佳的选择是使用 hasattr() 在使用之前检查所需的成员。那将使您提供有用的例外,而不是默认属性。

具有完整覆盖的单元测试实际上是处理依赖动态语言的任何开发工作的唯一方法。显然,对静态打字的语言进行强有力的覆盖范围测试非常有益,但是根据我的经验,当您进行动态打字时,这一点更为重要。

如果您没有涵盖测试中可以运行的所有代码,那么您确实在要求麻烦。因此,您想与单位测试同时使用覆盖范围分析工具,以证明您正在达到所有代码。

即使这样,也不会防止所有陷阱 - 您的测试确实需要行使程序可能会收到的所有可能错误的输入数据错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top