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

📅  最后修改于: 2021-08-25 16:44:55             🧑  作者: Mango

让我们先谈一个食谱…
你喜欢煎蛋吗? (肯定是……这可能是您最喜欢的早餐)
让我们准备吧…所以您需要一些配料,例如…鸡蛋,牛奶,培根,奶酪,番茄,洋葱,盐。在准备煎蛋之前,您可能需要验证,检查,评估和测试的内容很少。

  • 多少个鸡蛋?他们新鲜吗?
  • 什么样的牛奶?多少?被宠坏了吗?
  • 碗(加扰)是否干净?
  • 放入培根时,煎锅是否已充分加热?

然后继续……您需要检查,评估,验证,品尝最终的食材,以制作出完美的煎蛋食谱。执行此操作时,您在测试产品的过程中正在测试各个成分,进行观察并做出判断,但是请注意,您正在测试的是组件而不是产品。如果您在烹饪Omellete时不注意过程(和组件),而后来又品尝了最终食谱,则最终可能会准备不好的食谱。原因可能是牛奶,脏碗或其他东西变质了。这会造成严重的健康问题。

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

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

什么是单元测试?

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

但是,单位一词在这里意味着什么呢?什么单位认为?

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

现在,让我们举一个简单的例子来检查单元测试的外观以及它的工作方式……

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

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.成本效益

错误的生存时间越长,修复它的成本就越高。请记住,与在编写代码之前编写测试的情况相比,在没有测试的情况下编写的每一行代码都会花费更大的成本来增加以后添加测试的费用。实际上,在一项研究中,已经证明这些错误及其解决方案会产生不同的成本。客户始终希望以最小的成本和最短的时间完成工作。

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