📜  什么是单元测试以及为什么开发人员应该学习它?

📅  最后修改于: 2021-10-19 06:34:37             🧑  作者: Mango

让我们先谈谈食谱……
你喜欢煎蛋吗? (当然……这可能是你最喜欢的早餐)
让我们准备它……所以你需要一些原料,比如……鸡蛋、牛奶、培根、奶酪、番茄、洋葱、盐。在准备煎蛋卷之前,您可能想要验证、检查、评估和测试的事情很少。

  • 几个鸡蛋?它们新鲜吗?
  • 什么样的牛奶?多少?它被宠坏了吗?
  • 碗(用来打乱)干净吗?
  • 当你把培根放进煎锅里时,煎锅是否足够热?

它继续……你检查,评估,验证,品尝你最后的成分,以准备一份完美的煎蛋卷食谱。当您这样做时,您正在测试各个成分,进行观察,并在创建产品的过程中做出判断,但请注意,您正在测试组件,而不是产品。如果您在不注意过程(和成分)的情况下烹制煎蛋卷,然后又品尝了最终的食谱,那么您最终可能会准备一份糟糕的食谱。原因可能是变质的牛奶、脏碗或其他任何东西。这会造成严重的健康问题。

什么是单元测试以及为什么开发人员应该学习它

同样的事情发生在软件开发中。在单元测试中,在开发阶段测试单个组件或程序的每个部分,以确保它们都正常工作。许多开发人员讨厌编写单元测试,但执行单元可以在软件开发过程的初始阶段检测到很多问题。这些问题可以在生产层面变得更成问题之前更早地得到纠正。让我们详细谈谈单元测试以及为什么开发人员应该学习它……

什么是单元测试?

单元测试主要由软件开发人员或白盒测试人员完成。它是对程序(单元)的各个部分进行隔离并检查它们是否适合使用的过程。换句话说,这是编写代码来测试您的代码,然后以自动化方式运行这些测试的做法。

但是这里的单位这个词是什么意思??什么单位考虑??

这些单元是软件程序的一部分,如应用程序中的单个函数、对象、方法、过程、接口或模块。它是在集成测试之前完成的。开发人员使用手动或自动测试来确保每个单元满足要求并按预期工作。开发人员使用驱动程序、单元测试框架、模拟对象和存根来执行单元测试。

现在让我们举一个简单的例子来检查单元测试的样子以及它是如何工作的……

想象一下,一个开发人员在他的代码中编写了一个基本的计算函数,它接受一个输入,并根据某些条件返回不同的值……

public float CalculateSalary(int input) 
{
    if (x) return ...;
    if (y) return ...;
    if(z) return ...;
    return ...;
}

许多组织手动测试功能或代码。开发人员运行该应用程序,他可能会登录某些页面,然后在此处和此处单击几下后,他将被重定向到使用此函数的页面。如果有一个表单,那么对于不同的值,他可能必须填写一个表单,提交它,并验证函数返回了正确的结果。正如我们所提到的,将针对不同的值重复此过程……这不是一个耗时的过程吗??如果应用程序增长并且会有数十或数百个这样的功能,会发生什么!?毫无疑问,对于更大更复杂的应用程序,时间将呈指数级增长。

那么解决方案是什么……?

您可以创建一个单独的项目来编写测试。在该项目中,您可以编写代码并调用此函数来验证不同输入的结果。

var result = CalculateSalary(1);
Verify(result == 1.5f);

这些类型的测试是单元测试,我们在其中单独测试应用程序的一个单元,而没有其外部依赖项,例如文件、数据库、Web 服务等。从上面的示例中,很明显单元测试如何节省大量时间。单元测试提供了许多好处。让我们详细讨论单元测试的好处以及为什么开发人员应该学习它……

为什么开发人员应该学习单元测试?

1. 单元测试是可重复的,它使编码变得敏捷

单元测试最好的一点是它们是可重复的。你写一次就可以运行它们数百万次。您可以为应用程序的不同部分编写数千个单元测试,并且只需几秒钟即可运行所有单元测试。
它还使过程更加敏捷并加快了编码过程。在软件开发中,您可能必须更改代码的结构或设计才能为其添加新功能。更改已经测试过的代码可能有风险且成本高昂。当您进行单元测试时,您只需要测试新添加的代码而不是整个程序。

2. 及早发现软件错误

想象一个场景,您在应用程序中构建了一些功能,经过一些检查和手动测试后,它被部署了。你离开了你的办公室,但在某个地方你可能一直在考虑应用程序……如果你的代码在生产层面上出现问题怎么办?如果您的代码因一些愚蠢的输入而中断怎么办? .即使您认为一切正常,您也可能会接到团队领导的电话,告诉您应用程序的主要功能之一无法正常工作?它不适用于某些情况或输入,并且存在一些错误。在这种情况下,单元测试就成了救星。
开发人员执行单元测试并在集成测试之前测试单个代码。这有助于在软件开发过程的早期阶段发现问题,并且可以在生产级别部署应用程序之前在那里解决问题。在测试驱动中,应用程序的发布时间更少,并且当开发过程中包含单元测试时,您会发现错误的数量更少。在早期阶段检测错误可以最大限度地降低开发风险,并且您可以避免花费太多的金钱和时间。

3. 提高代码质量

由于不可预见的边缘情况,软件开发中会出现许多错误。如果您忘记预测单个输入,那么稍后您可能会遇到应用程序中的主要错误。当您编写单元测试时,您会仔细考虑应用程序中每个函数的所有边缘情况。您为函数提供各种输入,并确保它按预期运行。在编写代码之前,您还需要仔细考虑设计及其必须完成的任务。我们可以说您的应用程序的每一个最小的功能都很重要,这有助于编写更清晰、更易于维护的代码。更清晰且可维护的代码总是易于更改且易于理解。

4. 提供文件

单元测试给出了代码做什么的基本概念,并且程序涵盖了所有不同的用例。它使文档更容易,这增加了代码的可读性和可理解性。任何时候其他开发人员都可以通过单元测试界面,更好地理解程序,并快速轻松地处理它。

5. 更轻松的更改和简化的集成

在软件开发中,大多数时候您需要更改代码或重构代码。在重构中,您可以更改代码的结构而不改变其行为。当您不编写单元测试并重构代码时,每次手动测试应用程序中可能受重构影响的每个部分。这是一个耗时的过程,您可能还会忘记一些需要测试的部分。

当您进行单元测试时,重构代码或升级库变得更加容易,并且您可以确保您的模块仍在工作,并且不会意外破坏以前可以工作的任何东西。单元测试允许您快速更改代码而不必担心影响系统的其余部分,因为测试证明行为是相同的。此外,当每个函数都经过单元测试和正确验证时,下一阶段的集成测试会变得更容易。它只需要集成所有功能来满足客户的需求,如果出现任何错误,则更容易纠正问题。

6. 轻松调试

单元测试使调试变得更加容易和快捷。如果测试在任何阶段失败,您只需调试代码中的最新更改,而不是整个程序。我们还提到了单元测试如何在集成测试的下一阶段使调试更容易。

7. 成本效益

一个错误存在的时间越长,修复它的成本就越高。请记住,与在编写代码之前编写测试相比,您在没有测试的情况下编写的每一行代码稍后添加测试的成本要高得多。事实上,在一项研究中,已经证明这些错误及其解决方案会产生不同的成本。客户总是希望以最低的成本和最短的时间完成他们的工作。

当您编写单元测试时,您会在早期发现错误并立即解决它,但是如果没有单元测试的软件会在生产级别或后期失败,那么开发人员不仅需要付出更多努力来寻找错误,而且此外,他们在金钱和时间方面纠正问题的成本也很高。他们可能不得不修改项目的整个代码,这既累人又浪费金钱。这对客户来说也是代价高昂的,而且没有一个组织希望让他们的客户失望并留下不好的印象。因此,对开发人员和客户而言,进行单元测试是一种经济高效且双赢的局面。