为什么程序员需要测试?

接下来的几个级别将致力于以程序员需要的方式进行测试。但首先,让我们找出什么是测试以及为什么需要测试。

关于软件,我们可以说测试的任务是检查程序:

  • 做她必须做的事
  • 不做不该做的事

顺便说一句,第二点与第一点一样重要,但稍后会更重要。

让我们从第一点开始。“程序做它应该做的事”是什么意思?

首先,需要有人列出该程序的所有用例。 其次,他们需要描述程序应该如何工作,用户应该如何表现,以及期望得到什么结果。你不能继续下去。

一旦我们写下“用户应该如何表现”,编写好的文档的整个想法就土崩瓦解了。人不是机器,而且,人们经常随心所欲地使用软件。没有人是通过研究说明书开始熟悉技术的。这是事实。

因此,我们得到一个新的事实:该软件的特殊性在于它有很多不同的工作场景。其中一些是显而易见的,其他的可以记录下来,其他的可以假设,其他的可以猜测,而另外的 50% 甚至你都不会想到。

从程序员的角度来看,大多数错误根本不是错误。错误是指程序没有按预期运行。并且有很多情况不清楚程序应该如何工作,或者相互矛盾的场景......

场景有无数种,产品中总会有程序不按预期运行的情况(程序员只为几十种场景编写代码)。因此,可以说任何程序总是存在错误任何产品都可以无休止地改进

在那之后,一切都归结为权宜之计。首先,程序员修复最大的错误,然后修复较小的错误,依此类推。最后,当产品所有者认为继续开发它在经济上不可行时,会出现一个阶段。

但是回到大家公认的错误:程序明显做错了,摔了,弄坏了东西等等。这种错误可以有条件地分为3类:大、中、小。

并且经常发生这样的情况,即程序员正在修复中等甚至小的错误,尽管项目中仍然存在许多更严重的问题。他只是没有找到它们,所以他正在研究他所知道的最大的那些。

因此,在任何项目中都应该有测试人员。这些人专门学习从不同角度看产品。所以你可以看到程序的更多场景。他们的任务是找出错误并记下来(以免多次发现相同的错误)。

测试是一个旨在发现错误的过程。应该发现、描述这些错误并确定其优先级。只有在对错误进行优先排序之后,我们才能谈论有效的软件改进过程。

请记住,解决问题的第一步是承认存在问题。你无法纠正你不知道的错误。

测试自动化

我想我们都同意测试很重要,所以让我们像程序员一样看一下测试。程序员如何看待测试?程序员使其他人的工作自动化。最后消失的职业将是编程职业。

我们将遇到的任何流程自动化。所以测试需要自动化。以及如何自动搜索错误?简短的回答:没有。但在这里,我们是程序员的事实再次帮了我们的忙。

软件开发过程包括对它的不断更改。就在不断进行更改的过程中,程序员经常会破坏直到最近才正常工作的东西。

而测试人员,不是寻找新的错误,而是被迫不断地检查我们是否破坏了已经运行了很长时间的东西。所谓回归测试。正是这种类型的测试可以而且应该自动化。

这里所有的软件可以分为两部分:

  • 程序与人互动
  • 程序与另一个程序交互

第一个选项更难自动化,它需要特殊的自动化测试人员,他们也称为 QA 自动化或软件测试工程师。

但第二个选项可以而且应该独立自动化。如果您有一款软件:

  • 效果很好
  • 已经测试过
  • 作为单独的模块或逻辑块实现
  • 不打算改变
  • 其他模块或程序依赖于它
  • 功能性故障代价高昂

我建议花时间为它编写测试,以捕获其当前功能的关键方面。为此分配 5% 的工作时间或每月 1 天是合理的。

无需为了测试而编写测试。

没有人会支持你的测试。不是其他程序员,不是你自己。没有人这样做。99% 的书面测试被放弃和/或禁用。如果你不能写测试 - 不要写。只有当你绝对不能没有它们时才写。

测试类型

每个程序员,如果没有经过特殊培训,都能够用自己的话来说出什么是测试:检查程序是否做了它应该做的事情。然而,该领域的专业人员区分了整个测试领域(类型)。

所有的测试实际上都围绕着软件的可靠性和可用性展开,但是为了更好地理解测试的方向,让我们看几个例子。

假设您正在测试一家典型的在线商店。那么测试的领域又可以分为以下几种类型:性能测试、功能测试、集成测试和单元测试。

如果网站所有者决定发起一场严肃的广告活动,那么很多用户将同时访问该网站。很可能该站点不会倒下,但它的某些部分可能会变慢甚至停止工作。

为了防止这种情况发生,您需要提前识别此类问题并采取措施消除它们。这是使用负载测试完成的,或者也称为性能测试。

您可能还想测试您的后端 API 如何工作并测试它的每个功能:注册、登录、添加到购物车、支付处理、数据库写入等。一切都应该根据 TOR 工作。在这种情况下,您需要执行功能测试

您的在线商店很可能与第三方服务集成:发送信件和短信、支付系统、在线支持聊天、收集用户反馈、广告系统等。为确保所有这些都按预期工作,您需要集成测试.

最后,复杂的产品通常被分解成独立的模块。从这些模块中,您可以像从构造函数中一样组装最终产品。如果您正在开发这样的模块或与这样的模块交互,那么您将需要进行单元测试

总而言之,我们可以说需要功能测试来测试站点的每个单独功能。集成 - 用于测试产品的大型模块和系统的交互。模块化 - 测试一个单独的模块,嗯,性能测试 - 检查您的站点在负载下的运行情况。

甚至可以有更多类型的测试:产品越复杂,需要控制其开发的更多方面。