Unit testing 当程序没有';不适合功能性风格?

Unit testing 当程序没有';不适合功能性风格?,unit-testing,Unit Testing,我在想一个例子,程序并没有真正计算任何东西,它只是做了很多。在编写计算某些内容的函数时,单元测试对我来说是有意义的,并且需要检查结果,但是如果不计算任何内容呢?例如,我在工作中维护的程序依赖于让用户填写表单,然后打开一个外部程序,并根据用户输入自动执行外部程序。这个过程相当复杂。大约有3000行代码(分布在多个函数中*),但我想不出一件对单元测试有意义的事情 这只是一个例子。您是否应该尝试单元测试“程序性”程序 *编辑您至少应该重构出看起来可能有问题的东西,并对其进行单元测试。但一般来说,函数不

我在想一个例子,程序并没有真正计算任何东西,它只是做了很多。在编写计算某些内容的函数时,单元测试对我来说是有意义的,并且需要检查结果,但是如果不计算任何内容呢?例如,我在工作中维护的程序依赖于让用户填写表单,然后打开一个外部程序,并根据用户输入自动执行外部程序。这个过程相当复杂。大约有3000行代码(分布在多个函数中*),但我想不出一件对单元测试有意义的事情

这只是一个例子。您是否应该尝试单元测试“程序性”程序


*编辑

您至少应该重构出看起来可能有问题的东西,并对其进行单元测试。但一般来说,函数不应该那么长。一旦开始重构,您可能会发现一些值得进行单元测试的东西


我不是这方面的专家,但出于同样的原因,我困惑了一段时间。不知何故,我正在做的应用程序不适合单元测试的示例(非常异步和随机,取决于大量的用户交互)
我最近意识到(如果我错了,请告诉我)进行一种全局测试是没有意义的,而是为每个组件进行无数的小测试。最简单的方法是在同一时间甚至在创建实际过程之前构建测试。

单个过程/方法中有3000行代码吗?如果是这样,那么您可能需要将代码重构为更小、更容易理解的部分,以使其可维护。当您这样做时,您将拥有那些可以并且应该进行单元测试的部分。如果没有,那么您已经拥有了这些部分——主程序调用的各个过程/方法


即使没有单元测试,您仍然应该为代码编写测试,以确保您为外部程序提供了正确的输入,并测试您在正常和异常情况下正确处理程序的输出。单元测试中使用的技术(如模拟)可以在这些集成测试中使用,以确保您的程序在不涉及外部资源的情况下正确运行。

您不必实现测试单个方法或组件的自动化测试。您可以实现一个自动单元测试,模拟用户与应用程序交互,并测试应用程序是否以正确的方式响应

我假设您目前正在手动测试您的应用程序,如果是这样的话,那么请考虑如何实现自动化并从那里开始工作。随着时间的推移,您应该能够将您的测试分解成越来越小的块,以测试更小的代码部分。任何类型的自动化测试通常都比没有好得多。

大多数程序(无论语言范式如何)都可以分解为原子单元,这些单元接收输入并提供输出。正如其他响应者所提到的,考虑重构程序并将其分解为更小的部分。在测试时,不要太关注端到端的功能,而是更多地关注处理数据的各个步骤


此外,一个单元不一定是一个单独的函数(尽管这种情况经常发生)。单元是功能的一部分,可以使用输入和测量输出进行测试。我在使用JUnit测试JavaAPI时看到了这一点。单个方法可能不一定提供测试所需的粒度,尽管一系列方法调用将提供。因此,我认为作为一个“单元”的功能比单个方法稍大一些。

根据您的描述,以下是我希望进行单元测试的地方:

  • 用户输入的表单验证工作是否正确
  • 给定表单中的有效输入,是否正确调用了外部程序
  • 将用户输入输入输入到外部程序,然后查看是否得到正确的输出

从您描述的声音来看,真正的问题是您使用的代码不是模块化的。我发现单元测试的一个好处是,难以测试的it代码要么模块化程度不够,要么接口笨拙。试着把代码分解成更小的部分,你会发现编写单元测试是有意义的。

正如一些人以前回答的那样,有几种方法可以测试你概述的内容。 首先,表单输入可以通过几种方式进行测试。 如果输入无效数据、有效数据等,会发生什么情况。 然后,可以测试每个函数,以查看在提供各种形式的正确和错误数据时,函数是否以正确的方式反应。 接下来,您可以模拟正在调用的应用程序,以便确保应用程序正确地向外部程序发送和处理数据。不要试图确保您的程序也能处理来自外部程序的意外数据

通常,我想知道如何为分配给我维护的程序编写测试的方法是,看看我是如何手动测试该程序的。然后试着想想如何尽可能多地实现自动化。此外,不要将测试工具仅限于编写代码所用的编程语言

应用程序的一个有趣的“切入点”是你说“用户填写表单”。如果你想进行测试,你应该重构你的代码,以构建该表单作为数据结构的显式表示。然后,您可以开始收集表单,并测试系统是否正确响应每个表单

可能是在文件系统中出现某些内容之前,无法观察到系统执行的操作。以下是一些想法: