应用程序上线之前如何进行有效的软件测试?今年的JAX London大会Gil Tayar向初学者介绍了前端测试的方法以及为什么测试码不可选的原因。以下是关于他对大会内容的部分介绍。

资深软件测试工程师:1分钟告诉你为何要进行前端代码测试?

Gil Tayar:我的一位朋友曾经问我,前端测试到底应该怎样做。为了更加系统全面的回答他这个问题,我在网上查阅了大量的资料,但是却发现这些方法理论却差强人意,至少在我看来,这些方法的深度还远远不够。从前端测试新手的角度,我找不到全面指导前端测试指南的应用程序,更别说理论和实践的结合了,所以我决定自己来做这件事。

 首先,什么是测试?

测试的含义在我看来就是你在APP中写的检测代码,也被称为“生产代码”,它是按照预期工作的。也有人称之为“TDD”,但” TDD” 一般指的是具体的测试方法。

其实不管在编程之前写代码还是之后这都无关紧要,只要你写出足够的测试能够让你的APP正常运行这就可以了。但令人悲哀的是,很多人都觉得这一点也不重要。

现在软件测试行业已经将测试与TDD相结合,因此程序员和生产代码一起编写代码没有标准术语。我称软件测试为“开发者测试”,或者你也可以这样理解,软件测试就是普通的测试而已。

资深软件测试工程师:1分钟告诉你为何要进行前端代码测试?

为什么要测试?

其实测试没有什么必须的理由。如果你真的不想测试,肯定也没人强迫你。假如一次又一次的网页测试让你越来越烦躁,那就没有测试的必要。但是,如果你不测试,有些潜在的bug可能会在未来的时间里一次又一次的困扰你,从部署到生产都将会是一个噩梦。

测试类型有哪些?

对于初学者而言,刚开始研究各种类型测试的时候非常抓狂。你可能听过几个软件测试大概的类别:单元测试、验收测试、集成测试、端到端测试、组件测试以及服务测试。

更让人哭笑不得的是,假如一群软件测试的人在一起头脑风暴,他们对软件测试中的术语定义可能都不一样。

但对我而言不太在乎使用哪个术语,因为我认为测试类型没有硬性定义。在我看来,所有的测试其实都在一个频谱范围内。

测试类型的范围是什么?

我们从最简单的类型——单元测试开始。从定义来看,所谓单元测试就是测试“单位”的代码,那什么是单位呢?这就取决于你使用的编程语言了。单位可以是一个函数,一个模块,一个包,一个类,甚至是一个对象(相对于JavaScript和Scala这样的语言)。举个例子,在JavaScript中,单元通常就是指一个类或者一个模块。

重要的是这个单元要进行隔离测试,这些算法、功能就像一个函数、计算字符串中的字符数或者具有一组验证函数的类,这是非常完美的。

隔离测试还是比较容易的,因为单元与单元之间没有依赖性。但我如何知道一个单元和另一个单元是否依赖呢?两种方法:要么对两个单元同时测试,要么模拟另一个单元。

那么问题来了,如果我同时测量两个单元,还能称为“单元测试”吗?有些人会不再将它称为单元测试。但是我仍倾向于叫做“单元测试”。但是如果有人叫做“集成测试”或者“两单元测试”,那我没有任何意见。

举个例子:

资深软件测试工程师:1分钟告诉你为何要进行前端代码测试?

这个单元是一个具有writeSumToFile功能的模块,它接受两个数字并且可以将他们直接写入文件中。

但是值得注意的是,它本身并没有被写出来。它使用另一个单元fileSumWriter来编写。为了测试这个单元,我们可以通过实际的文件编辑器或创建一个模拟来实现。

从最纯粹的意义上讲,如果将mock传递给函数,无疑这个测试就是一个单元测试。但是当它们一起测试时,很多人就会认为这不是单元测试。

其实这都无关紧要。一方面,我们有代码测试一个单位。另一方面,有E2E测试——整个应用的测试。一切测试都在E2E中进行,并且APP运行时会在与生产系统类似的环境中运行。

资深软件测试工程师:1分钟告诉你为何要进行前端代码测试?

这代表着两个极端点——它们定义了越来越大的测试范围,在这个范围内,越来越多的代码被测试。

有些人称这些测试为处于“集成测试”之间的测试,但对于TDD-ers,集成测试意味着一个完全不同的东西。集成测试确切的说即使测试超过了一个单元但不包括所有的单元。