有关单位测试的两个问题。

  1. 我已经编写了一段时间的单元测试,但是通常是我已经写过的课程。最近我读了 一篇文章(请注意,您的一篇旧文章)说,您应该在开始编写代码之前编写单元测试。

    有人实际遵循这种方法吗?在纸上似乎是个好主意,但实际上是吗?

  2. 您是否应该编写单元测试以查看方法如何处理不良/恶意输入?显然,您需要针对专门用于处理“用户”输入的功能编写测试,以查看其处理不良/恶意输入的方式,但是永远不应该将这种类型的输入传递给它们的功能呢?您什么时候绘制线路?
有帮助吗?

解决方案

在班级之前进行编写单元测试的方法论 测试驱动的开发 (TDD),并在2000年代初被肯特·贝克(Kent Beck)普及。这个想法是您编写一个描述所需功能的测试。最初,此测试将失败。写课时,测试通过。您重构测试以添加更多所需的功能,然后重构类以进行新的测试通行证。一旦测试通过,您的班级就达到了目标。当然,这也超越了课程。

至于要编写哪些类型的测试,这取决于您是在测试公共API还是私人API。公共API应该编写更广泛的测试,以确保输入的形成良好,尤其是如果您不完全信任API的用户。如果没有这些测试,私有API(仅由您的代码调用的方法)可能会逃脱 - 我怀疑您可以信任自己的开发团队不要将不良数据传递给他们。

其他提示

测试驱动的开发 是一个非常普遍的概念。基本想法是,您只是尝试编写为满足软件某些要求所必需的代码。因此,您为需求编写测试,然后编写代码以进行测试。

我个人不使用TDD,但我知道有人这样做。我的个人想法是,如果您正在处理更具应用程序驱动的内容,例如数据库或用户界面,则非常有用。但是,对于更重的算法(例如物理模型)的东西,我发现它打破了我的思路并妨碍了您。

首先编写单元测试是一种普遍的做法。一个很大的好处是,您不仅要编写代码会通过的测试,而且还要测试定义重要的是重要的,您要实现的目标以及要确保不会发生的事情。它可以帮助您充实设计。另外,您可以在代码之前先与外部利益相关者一起审查Speck。

至于要编写的测试,根据您的时间有点主观。我不会疯狂的审查代码,因为它永远不会面对。也就是说,令人惊讶的是,对代码的投入是“永远不会看到的”。因此,更多的测试更好,但是在某个时候回报肯定会降低。

您正在编码的语言。动态语言需要更多的测试,因为编译器会发现更少的问题,并且错误可能更难跟踪(因为它们可以从初始输入问题中进一步传播)。至少,这是我的看法。

这也有所不同。公众应被视为恶意(即网络),应假定员工无能,甚至还应假定编码人员(和您自己!)至少是粗心的。但是,随着您越来越靠近内心圆圈,危险就会下降。

有人实际遵循这种方法吗?

是的。

在纸上似乎是个好主意,但实际上是吗?

是的。

您是否应该编写单元测试以查看方法如何处理不良/恶意输入?

是的。

那不应该传递给他们的输入的功能呢?您什么时候绘制线路?

当它从软件转变为精神病时。

您可以 - 如果需要 - 为不可能的情况编写测试。但是,您正在以明显的方式浪费时间和雇主。

您为 定义 用例。就是这样。

您不会根据自己的想象力构成随机测试用例。

如果什么? 如果是 定义 用例不完整吗? bummer。您为官方,合同,公共界面编写测试,仅此而已。

如果设计不足,并且您意识到给定的界面充满了不完整的规格,矛盾和安全漏洞怎么办?这与测试无关。这只是编程。不良设计是不良设计。

如果某些恶意社会变态者会采用您的代码并以超过(或其他方式不符合)规格的方式使用它,该怎么办? bummer。社会变态者获胜。他们能够将您的代码置于您未测试的不可能的情况下。买啤酒是如此聪明。

在测试之前和测试之后,心态有差异。以前编写测试是一种形式 设计, ,因为您正在设计代码的界面并定义预期行为。当您编写通过测试的代码时,可以验证您的设计。在开发结束时,您恰好已经进行了一套测试!

使用测试后,您需要小心避免您现有代码将通过的编写测试陷阱。这是一个不同的焦点,您没有像测试版本那样多。

已经有很多答案,但是我想再说一个问题2。

如果您将UNITSEST代码“数据驱动”制作,那么代码正在测试“不良”或“好”输入无关紧要。重要的是,您拥有足够大的数据集,可以涵盖两者。

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