可维护性测试指南

1794 篇文章 51 订阅
568 篇文章 1 订阅

什么是可维护性测试?

维护的主要定义是保持或维持特定状态的过程。软件的可维护性由开发人员负责,他们定期修改软件以满足不断变化的客户需求并解决客户提出的问题。

软件维护需要增强软件的功能,以包含客户需要的新功能,修改代码以避免将来出现问题,修复代码中的缺陷或错误,并确保不存在安全漏洞。此外,软件维护通常包括发布更新,以提高适应性和有效性,并替换不受欢迎的功能。

软件维护在很大程度上受到软件和代码质量的影响。质量较低的软件需要更多的维护。对于低质量软件,增加新需求或扩展现有代码的工作量和成本要高得多。

随着可维护性的提高,软件维护的过程也会大大简化。可维护性测试可以帮助应用程序的设计更具有容错性,这反过来又意味着软件维护对错误修复的需求将大大降低;这只是说明可维护性测试必要性的一个例子,本指南中还有更多的例子。

为了让客户满意并保持软件产品的功能,进行可维护性测试是至关重要的。

软件维护的测量指标和类型

任何软件都可能经历四种不同类型的维护。这些不同形式的维护分别服务于特定的目标。

  • 纠正性维护

无论经过多么广泛的测试,软件产品都可能存在缺陷,而这些缺陷会在没有太多警告的情况下显现出来。发现这些错误并进行修复所需的时间可以衡量软件的可维护性。

  • 完善性维护
    这种类型的维护主要是通过改进来优化软件。进行这些改进所需的工作量可以用来衡量软件产品的可维护性。在软件中引入新功能所花费的时间和精力可以与预定义的基线或其他以前完成的项目进行比较,以获得准确的评估。

  • 适应性维护
    除了因改进而产生的修改外,软件产品还经常需要因操作系统更新或程序所依赖的其他软件更新而进行更改。适应性维护包括为保持软件产品与不断变化的环境(如不断变化的硬件和操作系统)兼容而进行的调整。为实现更好的兼容性而引入这些变化所需的时间和精力可以作为衡量软件可维护性的另一个指标。

  • 预防性维护

这是对软件进行的维护,目的是减少将来可能需要进行的维护。

对软件进行这些更改是为了先发制人地解决未来的问题,并使软件对可能出现的问题有更强的承受力。

如何衡量应用程序的可维护性?

衡量一个应用程序的可维护性有几个属性。应用程序的可变更性和在变更过程中的稳定性是两个可能的衡量标准。此外,还可以根据分析应用程序以查找错误的难易程度来衡量可维护性。

ISO是国际公认的标准,为系统和软件质量要求和评估(SQuaRE)提供了指南。ISO 25010定义了衡量软件质量的以下特征。

  • 模块化

考察应用程序的模块化程度。它评估软件是否由不同的模块化组件组成,或者是否有非模块化的、可能相互依赖的组件。

  • 重用性

该标准重点关注已有代码是否可以重新利用,以便在应用程序的其他地方提供类似功能。重复使用代码可以降低成本、提高生产率和整体质量。

  • 可分析性:

意外软件缺陷被发现和修复的有效程度。该参数还可用于评估实施某项变更或软件升级的效果。

  • 可修改性:

评估在不降低或损害最终产品质量的情况下,应用程序的可修改程度。

  • 可测试性

可测试性是指在多大程度上可以为应用程序制定测试标准,以及是否可以通过运行上述测试来检验这些标准是否得到满足。

通过了解各种形式的软件维护和相应的属性来衡量应用程序的可维护性,可维护性测试可以准确地认识到成功和轻松地修复或更新软件的潜力。

可维护性是指更新、修改、重用和测试系统的能力。这对大多数系统都很重要,因为大多数系统在其生命周期内都会被多次更新、修改和测试。通常情况下,系统的各个部分甚至整个系统都会被用于新的和不同的场合。

为什么要对系统进行所有的更改?请记住,当我们讨论可靠性时,我们说过软件不会磨损,但会过时。我们需要新的扩展功能。我们还需要补丁和更新,以使系统运行得更好。我们必须适应新发布的环境,互操作系统也将更新,通常需要对我们的系统进行更新。

设计问题。概念问题。符合标准和指南(或不符合标准和指南)。我们有一个很好的方法来发现这些问题。这就是静态测试。从最初的需求到最新的补丁,可能没有更好的方法来确保系统的可维护性。在这种情况下,一个新工具、几个脚本测试或相当细心的测试人员并不能神奇地将猪耳朵变成丝绸钱包。

必须让管理层了解良好的可维护性所需要的投资。这必须被视为一项长期投资,因为大部分的回报都会在未来的道路上出现。而且,这也是最难出售的一种投资,因为它大多是无形的。如果我们很好地建立了一个可维护的系统,我们如何以有形的方式向管理层展示回报呢?

好吧,我们不会有那么多的补丁,但我们无法毫无疑问地证明这是投资的结果。我们的维护程序员会犯更少的错误,导致更少的回归错误,但我们不一定能指出我们没有犯的错误。

参考资料

如何进行可维护性测试?

在实施可维护性测试时,并没有硬性的规则来定义需要遵循的流程。一个软件应用程序在发布之前和发布之后,预计会经过多次更新,以纠正错误、引入新功能、调整现有功能和改变非功能性软件特征。

因此,这种测试可能因具体情况而异,实施方法也可能不同。然而,一般来说,通过自动化测试工具,如Selenium或Percy进行可视化测试,可以极大地支持和加快可维护性测试。

测试选项可维护性测试可以使用静态或动态测试方法。作为软件开发过程的一部分,静态测试检查设计文档和源代码的组织、结构、复杂性和其他特性。

静态测试的一些示例如下

  • 某些控制结构(如决策语句)的嵌套深度
  • 循环复杂性

静态分析和审查是可维护性测试的适当方法,它们应该在设计文档可用时就开始,并在构建应用程序的整个过程中持续进行。

静态分析和评审是可维护性测试的合适方法,应该从设计文档开始,贯穿整个应用程序开发过程。可维护性可以在软件开发生命周期的早期进行评估,而不需要等待一个完成的和可运行的系统,因为可维护性已经融入到代码和每个单独代码组件的文档中。

动态软件测试是为了检查代码的动态特性并确定其功能。它提供了应用程序在使用中的行为的有价值的信息。

动态测量的一些示例包括

  • 对更新或错误修复的持续时间进行计时。
  • 系统在两次更改之间的稳定性。

动态可维护性测试的重点是为特定的应用程序制定文档化的维护流程,例如对软件进行更改或改进。为了确认规定的服务水平可以通过概述的流程来实现,需要使用各种维护情况作为测试用例。

当支持的基础设施非常复杂,并且可能有多个部门或组织参与支持程序时,这种类型的测试尤为重要。

可维护性测试最佳实践

  • 在进行可维护性测试时,有必要制定一个可维护性因素清单,如系统的稳定性或代码的复杂性。

  • 确保软件符合数据库、界面和开发过程的适当标准。例如,验证软件是否遵循优化算法和代码重用性等良好实践。

  • 创建一个可维护性衡量标准来表示特定因素的可维护性成本和优势是很有帮助的。对于所评估的每个组件,都可以分配一种加权分数,以便进行排序,确定哪些方面需要最大的关注。这有助于制定行动计划,优先解决得分最高的因素。

  • 确保软件符合前面讨论的五个可维护性属性: 模块化、可重用性、可分析性、可修改性和可测试性。

易分析性

软件产品被诊断出缺陷或故障原因的能力,或者被识别出需要修改的部分的能力。换句话说,需要花费多少精力才能诊断出系统中的缺陷,或确定需要修改的地方?

以下是可分析性差的四个常见原因,排名不分先后。

  • 没有模块化

  • 缺乏良好的文档。

  • 标准和指南不完善,或者根本不存在。没有编程规范。

  • 抽象程度过高

解决大多数问题的方法都是一样的。良好、可靠的标准和指南。随时通过静态测试来执行,尤其是在时间紧迫的情况下。没有借口。如果组织明确指出,可分析性差是一类重要的缺陷,是不能容忍的,那么往往就不会出现这个质量子特性的问题。

内部可分析性指标
  • 活动记录

衡量系统状态记录的详尽程度。其计算方法是,计算按照规定写入活动日志的项目数,与根据需求应该写入的项目数进行比较。计算公式为X = A / B

其中,A是实际按照规定写入活动日志的项目数量(经审核确认),B是按照规范规定应写入日志的项目数量。该值越接近1,日志记录就越完整。

  • 诊断功能的准备程度

衡量诊断功能提供的全面程度。诊断功能分析故障,并向用户提供输出或日志,解释故障原因。该指标是已实现的诊断功能与技术规范中要求的诊断功能数量的比率,使用相同的公式计算:X = A / B

A是已实施的诊断功能数量(审查中发现),B是技术规范中要求的数量。该指标也可用于衡量系统的故障分析能力和因果分析能力。

外部可分析性指标

组织可能希望跟踪的外部可维护性度量。在测试或维护过程中,当软件被维护或修改时,这些指标有助于测量维护者、用户或系统的行为等属性。

  • 审计跟踪能力

衡量用户(或维护者)识别导致故障的具体操作的难易程度。ISO 9126-2在解释如何记录这一指标时有些抽象:它说要观察试图解决故障的用户或维护者。这似乎与该指标的计算方法相悖,即使用公式X = A / B

其中,A是运行期间实际记录的数据项数量,B是为充分监控运行期间软件状态而应记录的数据项数量。与本标准中的许多其他指标一样,企业必须自行定义B的确切值。有多少可能发生的不同错误情况应被记录?X的值越接近1,意味着记录的所需数据越多。组织必须将此视为一种权衡;我们希望记录的越多,就需要编写更多的代码来监控执行、评估发生了什么并记录下来。

  • 诊断功能支持

衡量诊断功能支持因果分析的能力。换句话说,用户或维护人员能否识别导致故障的特定功能?与上一个指标一样,应用方法仅指观察用户或维护人员试图使用诊断功能解决故障的行为。计算公式为X = A / B

其中,A是使用诊断功能成功分析的故障数量,B是登记的故障总数。越接近1越好。

  • 故障分析能力

衡量用户或维护人员识别导致故障的具体操作的能力。要计算该指标,请使用公式X = 1 - A / B

其中,A是仍未找到原因的故障数量,B是登记的故障总数。请注意,这实际上是上一个指标诊断功能支持的反面。这个指标衡量的是我们无法诊断的故障数量,而上一个指标衡量的是我们诊断出的故障数量。越接近1.0越好。

  • 故障分析效率

衡量用户或维护人员分析故障原因的效率。这实质上是对解决系统故障所用平均时间的衡量,计算公式为X = Sum(T) / N。

其中,T是每次解决故障所需的时间,N是已解决问题的数量。该指标的标准中有两个有趣的说明。ISO 9126-2指出,只有成功解决的故障才应包括在此测量中;但是,它接着指出,未解决的故障也应进行测量并一并提交。该标准还指出,在计算这一指标时,可以使用人时而非简单的小时数,这样就可以衡量出努力程度而非简单的经过时间。

  • 状态监测能力

衡量在系统实际运行过程中导致故障的操作是否容易获得监控数据。该指标的计算公式为X = 1 - A / B

其中,A是用户或维护人员试图获取监控数据但失败的案例数,B是他们在运行过程中试图获取监控数据的案例数。越接近 1 越好,这意味着他们在尝试获取监控数据时越成功。

可变更性(易修改性 Changeability | Modifiability)

软件产品能够实现特定修改的能力。

几乎所有影响可变更性的因素都是设计和实施实践。

基于设计的问题包括耦合和内聚。耦合和内聚是指系统如何被分割成模块。高耦合度和低内聚性对良好的软件设计是有害的。

耦合是指模块在执行过程中相互依赖内部操作的程度。高耦合意味着模块之间存在大量的依赖关系和共享代码。另一种可能是,一个模块依赖于另一个模块做某事的方式。如果改变这种依赖关系,就会破坏第一个模块。当允许高耦合时,对单个模块进行修改变得非常困难;这里的修改通常意味着那里和那里的更多修改。低耦合是可取的;每个模块都有自己的任务,并且基本上是独立完成的。

有许多不同类型的耦合:

  • 内容耦合

当一个模块访问另一个模块的本地数据时。

  • 共用耦合:两个或多个模块共享全局数据。
  • 外部耦合:两个或多个模块共享一个外部接口或设备。
  • 控制耦合:一个模块告诉另一个模块做什么。
  • 数据结构耦合:多个模块共享一个数据结构,每个模块只使用其中的一部分。
  • 数据耦合:数据从一个模块传递到另一个模块--通常通过参数。
  • 消息耦合:模块之间互不依赖;模块之间传递消息而不传递数据。
  • 无耦合:模块之间完全不通信。

通常需要一些耦合;模块通常必须能够通信。一般来说,消息耦合或数据耦合是最佳选择。

另一方面,内聚描述了模块职责的集中程度。一般来说,模块应该只做一件事,而且要做得很好。内聚性低的指标包括:模块中的许多函数或方法做不同的事情,而这些事情是不相关的,或者它们处理的是完全不同的数据集。

一般来说,低耦合度和高内聚度是相辅相成的,是可变更性良好的标志。高耦合度和低内聚度通常是设计流程不完善的表现,也是可变更性差的标志。

由不恰当的实现方法引起的可变更性问题涉及到我们在编程课上被告知不能做的许多事情。

使用全局变量是最大的问题之一;它导致了高度的耦合,一个模块中变量的改变可能会对其他模块产生一系列的副作用。

将变量值硬编码到模块中应该被视为一个严重的潜在错误。对于开发人员来说,命名常量是一种更好的编写代码的方式;当他们决定改变值时,所有的实例都会被一次性改变。当使用硬编码值(有些人称之为神奇数字)时,总会有一些被改变,而另一些不会。

对硬件进行硬编码设计也是一个问题。为了提高速度,一些开发人员喜欢按照他们所编写的平台的硬件进行编程。这可能意味着使用操作系统、硬件平台或正在使用的设备的实现细节。当然,当时间流逝,硬件、操作系统和/或设备发生变化时,软件就会出现问题。

系统越复杂,可变性就越差。与往常一样,有时我们需要对复杂性进行权衡。

我们前面提到的Jamie参与的项目,即重写一个中端计算机操作系统,就是软件工程做得很好的一个例子!每个开发人员和大多数测试人员都接受了为期数周的全职面向对象开发和设计培训。他们将2500万行的PL/MP(一种优雅的过程语言)代码转换为C++,这不是一个补丁,而是一次彻底的重写。他们花了大量时间制定每个开发人员都必须遵守的标准和指南。他们在静态测试方面进行了大量投资,并对每个人进行了培训。

低耦合和高内聚是当时的流行语。也许 "流行语 "是不正确的;他们真正相信自己正在做的事情。可维护性是规则。

他们的经验法则是将任何方法、函数或代码限制在打印出来的一页纸上。也许20到25行代码。他们使用良好的面向对象规则,包括类、继承和数据隐藏。他们在模块之间使用消息传递来避免任何全局变量。他们让人编写类库,并对其进行测试,从而真正实现了重复使用。

因此,您可能会认为一切都非常顺利。最终的结果是出色的,但一路上也有不少磕磕绊绊。他们有一个操作系统必须提供的特殊功能;他们估计,使用新的处理器,他们必须在7000个CPU周期内完成任务。重写后,他们发现执行该操作需要超过99,000个CPU周期。他们的误差非常大。而且,由于这个动作每分钟可能会发生数千次,他们的设计需要完全重新考虑。事实上,低耦合、高内聚、继承和数据隐藏都有各自的代价。

每个设计决策都需要权衡利弊。对于许多系统来说,好的设计和技术值得我们为之花费每一分钱。但是,当执行速度是最重要的时候,这些技术往往不能很好地发挥作用。为了使系统正常运行,他们不得不抛弃所有的规则。在这个模块中,他们重新使用了庞大的函数、直接的过程代码、全局变量、低内聚性和高耦合性。而且,他们做得足够快。然而,正如您所期望的那样,它非常容易出问题;花了相当长的时间才稳定下来。

糟糕的文档会对可变更性产生不利影响。如果维护程序员必须猜测如何进行修改,推断原始程序员的想法,那么可变更性就会受到很大影响。文档包括内部文档(代码中的注释,通过良好的命名方式实现代码的自文档化等)和外部文档,包括高层和低层的设计文档。

内部可变更性度量
  • 变更可记录性

对规范和程序模块的变更如何完整记录的度量。ISO 9126-3将其定义为代码或其他文档中的变更注释。该指标的计算公式为X = A / B

其中,A是有注释的变更数量(经评审确认),B是变更总数。该值应为0 <= X <= 1,越接近1越好。接近 0 的值表示变更控制不佳。

  • 外部可变更性指标

外部可变更性度量有助于衡量当您试图对系统实施变更时所需要的努力。

  • 变更周期效率

衡量在可接受的时间内解决用户问题的可能性。该指标通过监控用户与维护者之间的交互,并记录从最初的用户请求到问题解决之间的时间来衡量。该指标的计算公式为Tav = Sum(Tu) / N

其中,Tav为平均时间,Tu为用户从发送问题报告到收到修订版之间的时间,N为发送的修订版数量。Tav越短越好;但是,大量的修订可能会对组织产生反作用,因此应取得平衡。

  • 变更执行时间

用于衡量维护人员为解决故障而更改软件的难易程度。计算公式为Tav = Sum(Tm) / N

其中,Tav是平均时间,Tm是检测到故障到找到故障原因之间的时间,N是登记和删除的故障数量。如前所述,有两点需要注意。应排除尚未发现的故障,并且可以使用努力(人-小时)来代替经过时间。时间越短越好。

  • 修改复杂性

衡量维护者为解决问题而修改软件的难易程度。计算公式为T = Sum(A / B) / N

其中,T是修复故障的平均时间,A是更改特定故障所花费的工作时间,B是更改的大小,N是更改的次数。变更的大小可以是变更的代码行数、变更的需求数、变更的文档页数等。这个时间越短越好。显然,如果变更的次数过多,企业就应该关注。

  • 软件变更控制能力

衡量用户识别软件修订版本的难易程度。这也被列为维护者如何轻松地更改系统以解决问题。其测量公式为X = A / B

其中,A是实际写入变更日志的条目数,B是计划的变更日志条目数,这样我们就可以跟踪软件的变更。越接近1越好,但如果变更很少,该值将趋向于0。

稳定性(Stability,并入Modifiability)

注意ISO25010没有此项。稳定性多和可靠性同义。

系统避免软件修改带来意外影响的能力。当我们对系统进行修改后,会产生多少缺陷?

这个子特性本质上是我们在可变更性中处理的所有问题的副作用。内聚度越低,耦合度越高,编程风格和文档越差,系统的稳定性就越低。

此外,我们还需要考虑需求的质量。如果需求定义明确、理解透彻、管理得当,那么系统往往会更加稳定。如果需求不断变化,并且没有被很好地记录和理解,那么系统的稳定性就会大打折扣。

系统时序对稳定性很重要。在实时系统中,或者当定时非常重要时,变化往往会使定时链发生偏移,从而在其它地方造成故障。

内部稳定性指标

稳定性指标帮助我们预测系统在修改后的稳定性。

  • 变更影响

系统修改后不良反应发生频率的度量。该指标的计算公式为:将系统修改后发生的不利影响次数与实际修改次数进行比较X = 1 - A / B

其中,A为不利影响的数量,B为所做修改的数量。越接近1越好。请注意,由于马虎的变更管理方式可能会带来多种不利影响,因此该指标实际上可能为负值。例如,假设进行了一次变更,但出现了三次不良反应。使用该公式计算如下:X = 1 - 3/1 ==> -2.

  • 修改影响定位

衡量修改对系统的影响程度。该值通过计算受修改影响的变量数量,并将其与产品中的变量总数进行比较,计算公式为X = A / B

其中,A为审查确认的受影响变量数量,B为变量总数。受影响变量的定义是代码行或计算机指令中被更改的任何变量。该值越接近零,说明修改的影响可能越小。

外部稳定性指标
  • 修改成功率: 衡量用户在维护后操作软件系统而不会再出现故障的程度。有两个公式可用于衡量该指标:
X = Na / Ta
Y = {(Na / Ta) / (Nb / Tb)}

Na是软件更改后用户遇到故障的次数,Nb是软件更改前用户遇到故障的次数,Ta是软件更改后的运行时间(规定的观察时间),Tb是软件更改前的时间(规定的观察时间)。越小越好,越接近0越好。从本质上讲,X 和 Y 代表软件更改后遇到故障的频率。指定的观察时间用于使指标正常化,这样我们就可以更好地比较不同版本的指标。此外,ISO 9126-2还建议,组织可能希望区分同一模块/功能修复后出现的故障和其他模块/功能出现的故障。

  • 修改对本地化的影响

这也是衡量用户在维护后能够在不发生进一步故障的情况下操作系统的程度。计算公式为X = A / N

其中,A 是系统修改后(在特定时期内)出现的故障数,N 是解决的故障数。该标准建议跟踪故障的 连锁情况;也就是说,组织应区分因先前故障而归因于变更的故障和似乎与变更无关的故障。越小越好,越接近零越好。

可测试性

可测试性是指软件产品在发生变更后的验证能力。这当然应该是所有技术测试分析师关注的问题。

许多问题都会对系统的可测试性提出挑战。

我们最喜欢的问题之一就是文档。代码中缺乏注释和糟糕的命名习惯,这使得理解代码到底应该做什么变得更加困难。

实施独立的测试团队可能会导致无意的(甚至有时是有意的)沟通中断。在处理可测试性问题时,测试团队和开发团队之间的良好沟通非常重要。

某些编程风格会使代码更难测试。例如,面向对象设计的主要目标之一就是数据隐藏。当然,数据隐藏也会使测试是否通过变得非常困难。多层次的继承使其变得更加困难;您可能不知道事情发生的确切位置,也不知道哪个类(对象)真正负责要采取的行动。

代码中缺乏工具导致可测试性问题。许多系统都具有自我诊断的能力;编写了额外的代码来确保任务正确完成,并记录发生的问题。不幸的是,这些工具通常被视为花哨的东西,而不是必需的。

最后一点,数据问题本身也会导致可测试性问题。在这种情况下,更好的安全性和良好的加密可能会降低系统的可测试性。如果无法找到、测量或理解数据,系统就更难测试。与软件中的许多情况一样,必须做出明智的权衡。

内部可测试性度量

内部可测试性指标衡量测试修改后系统所需的预期工作量。

  • 内置测试功能的完整性

衡量内置测试功能的完整性。计算方法是:计算已实现的内置测试功能的数量,并与规范要求的数量进行比较。计算公式为X = A / B

其中,A是已实施的内置测试功能的数量(经审核确认),B是技术规范要求的数量。越接近1,越完整。

  • 可测试性的自主性

衡量软件系统可独立测试的程度。该指标的计算方法是:计算使用存根或驱动程序模拟的其他系统的依赖项数量,并将其与其他系统的依赖项总数进行比较。与许多其他指标一样,计算公式为X = A / B

其中,A是使用存根或驱动程序模拟的依赖关系数,B是其他系统的依赖关系总数。越接近1越好。数值为1意味着可以模拟所有其他依赖系统,因此软件(基本上)可以自行测试。

  • 测试进度可观察性

测试过程中内置测试结果的完整显示程度。计算公式为X = A / B

其中,A是审查中确认的已执行检查点的数量,B是规范中要求的数量。越接近1越好。

外部可测试性度量

可测试性度量衡量测试修改系统所需的工作量。

  • 内置测试功能的可用性

衡量用户或维护者在没有额外的测试设施准备的情况下对系统进行操作测试的难易程度。该指标的计算公式为X = A / B

其中A是维护者可以使用内置测试功能的案例数,B是测试机会数。越接近1越好。

  • 重新测试效率

衡量用户或维护者执行操作测试并确定软件是否准备好发布的难易程度。该指标是一个平均值,计算公式为
X = Sum(T) / N

其中,T是在故障解决后确保系统已做好发布准备所花费的时间,N是已解决故障的数量。从本质上讲,这是故障解决后的平均重新测试时间。请注意,未解决的故障不包括在此测量中。越小越好。

  • 测试重启性

衡量用户或维护人员在维护后使用检查点执行操作测试的难易程度。计算公式为X = A / B

其中,A是维护者可以在所需位置暂停并重新启动正在执行的测试用例的测试用例数,B是正在执行的测试用例被暂停的测试用例数。越接近 1 越好。

符合性

内部符合性指标

可维护性合规性是对系统在多大程度上符合适用法规、标准和惯例的一种度量。已实施的合规项目(基于审查)与规范中要求合规的项目之间的比率使用以下公式计算X = A / B

其中,A是与可维护性合规性相关的正确执行项目,B是要求的数量。越接近 1,系统的符合性越高。

外部符合性指标

可维护性合规性度量可衡量系统在多大程度上遵守了各种标准、惯例和规定。合规性的测量公式为X = 1 - A / B

其中,A是测试期间未实施的可维护性符合性项目的数量,B是已定义的可维护性符合性项目的总数。越接近 1 越好。

最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

全部资料获取

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书深入介绍和讨论了Solaris系统管理各个方面的概念、方法和注意事项。其主要内容有:邮件服务;NIS+;自动加载程序服务;服务访问工具;应用软件;Shell编程介绍;系统安全。本书可供计算机系统管理、维护人员和计算机应用人员使用。 目 录 译者序 前言 第一部分 邮件服务 第1章 了解邮件服务 1 1.1 邮件服务术语 1 1.1.1 在邮件配置中的系统 1 1.1.2 用户代理 4 1.1.3 邮件传输代理 4 1.1.4 邮件处理程序 4 1.1.5 域 5 1.1.6 邮件地址 7 1.1.7 信箱 7 1.1.8 别名 8 1.2 邮件服务器组件 10 1.3 邮件服务综述 14 1.3.1 邮件服务剖析 14 1.3.2 邮件服务如何工作 15 1.3.3 sendmail 如何工作 16 1.3.4 邮件寻址如何工作 17 第2章 规划邮件服务 19 2.1 只有本地邮件 19 2.2 本地邮件和一个uucp连接 19 2.3 一个域、两个网络和一个路由器 20 2.4 两个域和一个网关 21 第3章 设置和管理邮件服务 22 3.1 设置邮件服务准备 22 3.2 设置邮件服务 22 3.2.1 设置邮件服务器 23 3.2.2 设置邮件客户 23 3.2.3 设置邮件主机 24 3.2.4 设置中继主机 24 3.2.5 设置网关 25 3.2.6 创建邮件别名 25 3.2.7 设置NIS别名文件 25 3.2.8 设置本地邮件别名文件 26 3.2.9 设置DNS别名文件 27 3.2.10 设置邮局管理员别名 27 3.3 测试邮件配置 28 3.4 管理邮件配置 28 3.4.1 邮局管理员职责 28 3.4.2 邮件队列 29 3.4.3 系统日志 30 3.5 邮件配置问题解答 32 3.5.1 检查别名 32 3.5.2 测试sendmail 33 3.5.3 验证到其他系统的连接 33 3.5.4 其他诊断信息 33 第4章 自定义sendmail配置文件 34 4.1 sendmail功能概述 34 4.1.1 与外部世界的接口 34 4.1.2 sendmail 程序工作 35 4.1.3 消息标题编辑 36 4.1.4 配置文件 36 4.2 sendmail实现 36 4.2.1 向文件和程序发送邮件 36 4.2.2 消息调度 36 4.2.3 消息发送 37 4.2.4 消息排队 37 4.2.5 配置概述 37 4.3 sendmail参数介绍 38 4.3.1 队列间隔 38 4.3.2 后台模式 38 4.3.3 可选的配置文件 38 4.4 调整配置参数 38 4.4.1 时间值 38 4.4.2 发送模式 39 4.4.3 负载限制 39 4.4.4 日志级别 40 4.4.5 文件模式 40 4.5 配置文件 41 4.5.1 sendmail配置文件部分 41 4.5.2 sendmail配置文件例子 42 4.5.3 配置文件文法 49 4.5.4 特别的标题行 51 4.5.5 地址重写规则 52 4.5.6 构造新的配置文件 58 4.6 命令行参数 59 4.7 配置选项 60 4.8 邮件处理程序标志 61 第二部分 NIS+ 第5章 NIS+环境介绍 63 5.1 NIS和NIS+比较 63 5.2 NIS+名字空间 64 5.3 NIS+安全 69 5.3.1 NIS+身份验证 69 5.3.2 访问权限 71 5.4 NIS+更新模块 72 5.5 NIS和NIS+兼容性 72 5.6 有名服务开关 73 5.7 NIS+管理 74 5.7.1 AdminSuite 74 5.7.2 NIS+命令 75 第6章 设置NIS+客户 79 6.1 安全考虑 79 6.2 预请求 80 6.3 NIS+客户凭证设置步骤 80 6.4 NIS+客户设置步骤 80 6.5 设置验证 82 6.5.1 验证Cache管理器在运行 83 6.5.2 检查/var/nis目录内容 83 6.5.3 验证NIS+命令成功 83 第三部分 自动加载程序服务 第7章 了解自动加载程序 85 7.1 NFS术语 85 7.1.1 服务器和客户系统 85 7.1.2 加载点 86 7.1.3 虚拟文件系统表 86 7.1.4 加载和卸载 86 7.1.5 加载表(/etc/mnttab) 86 7.2 NIS+术语 86 7.3 自动加载术语 87 7.3.1 自动加载程序 87 7.3.2 自动加载映射 87 7.4 自动加载映射和加载点 87 7.4.1 默认的自动加载映射 87 7.4.2 间接映射 90 7.4.3 直接映射 90 7.4.4 映射项目文法及快捷方式 91 7.5 自动加载程序如何工作 93 7.6 如何规划自动加载 95 7.6.1 推荐的自动加载策略 95 7.6.2 使用自动加载程序的预请求 96 第8章 设置自动加载程序 97 8.1 设置自动加载服务器系统 97 8.2 设置自动加载客户系统 97 8.3 显示有关NIS+自动加载映射信息 97 8.3.1 显示NIS+自动加载映射的格式 97 8.3.2 显示NIS+自动加载映射的内容 98 8.4 设置NIS+自动加载映射 98 8.4.1 设置auto_home映射 99 8.4.2 设置间接映射 99 8.4.3 设置直接映射 101 8.4.4 设置主映射 101 8.4.5 NIS+自动加载映射管理 102 第四部分 服务访问工具 第9章 了解服务访问工具 103 9.1 SAF优点 103 9.2 SAF精灵进程 104 9.3 SAF命令 104 9.4 SAF结构 105 9.4.1 init进程 105 9.4.2 服务访问控制器 105 9.4.3 端口监控程序 105 9.4.4 服务调用 107 9.4.5 端口监控程序状态 107 9.4.6 线路控制模型 108 9.4.7 uucp文件 112 9.4.8 SAF日志文件 113 9.5 SAF命令、任务和选项参考 114 9.5.1 SAF变量快速参考 114 9.5.2 服务访问控制(sacadm)快速参考 115 9.5.3 端口监控程序管理(pmadm)快速 参考 115 9.6 Admintool: Serial Ports和SAF 117 9.7 模板 117 9.8 启动Admintool: Serial Ports 117 第10章 设置调制解调器和字符终端 119 10.1 设置调制解调器和字符终端的工具 119 10.2 在SAF中使用变量 119 10.2.1 端口监控程序标签 120 10.2.2 服务标签 120 10.2.3 设备路径 120 10.2.4 波特率和线路规范 121 10.2.5 调制解调器类型 121 10.2.6 注释 121 10.3 设置调制解调器 121 10.3.1 硬件载波检测设置 121 10.3.2 调制解调器连接和开关设置 122 10.3.3 用于设置调制解调器的变量 123 10.3.4 调制解调器的 SAF 配置 123 10.3.5 调制解调器拨出服务配置 124 10.3.6 调制解调器连接疑难解答 124 10.3.7 使用Admintool: Serial Ports配置 调制解调器 125 10.4 设置字符终端的SAF 128 10.4.1 终端连接 128 10.4.2 字符终端的SAF配置 128 10.4.3 终端连接疑难解答 129 10.4.4 使用Admintool:Serial Ports添加 字符终端 130 10.4.5 初始化不配置端口 130 10.4.6 删除端口服务 131 第11章 设置打印服务 132 11.1 打印的新特性 132 11.1.1 打印包重新设计 132 11.1.2 打印协议适配器 133 11.1.3 SunSoft打印客户 133 11.1.4 增强的网络打印机支持 134 11.2 Solaris 2.6环境中的打印管理工具 134 11.3 打印服务器系统需求 135 11.4 打印机配置信息 135 11.4.1 打印机设备名 136 11.4.2 打印机名称 136 11.4.3 打印机端口 136 11.4.4 打印机类型 137 11.4.5 文件内容类型 137 11.4.6 打印过滤器 139 11.4.7 打印服务器统一地址 140 11.4.8 打印机描述(可选) 140 11.4.9 默认打印机(可选) 141 11.5 本地PostScript打印机设置 141 11.6 打印服务器设置 143 11.6.1 添加listen服务 143 11.6.2 创建listen服务 143 11.6.3 指定打印客户系统 144 11.7 打印客户设置 145 11.8 使用SunSoft打印客户 148 11.8.1 打印机配置资源 149 11.8.2 提交打印请求 149 11.8.3 SunSoft打印客户程序概述 149 11.8.4 使用Admintool设置打印客户 149 11.8.5 使用Admintool设置本地打印机 150 11.9 打印的问题 151 11.9.1 无输出(不进行打印) 152 11.9.2 不正确的输出 160 11.9.3 挂起LP打印服务命令 162 11.9.4 空闲(挂起)打印机 163 11.9.5 冲突状态消息 164 第五部分 应用软件 第12章 应用软件的安装和管理 167 12.1 应用软件的安装和管理概述 167 12.1.1 使用软件包命令 168 12.1.2 使用Admintool 168 12.1.3 使用安装脚本 169 12.2 用户对应用程序的访问 169 12.2.1 自动生成应用程序的环境 169 12.2.2 使用封装程序技术 171 12.2.3 设计一个应用程序服务器 173 12.2.4 安装并配置软件包 176 12.2.5 编写封装程序 177 12.2.6 使用公共命令目录 179 12.2.7 用户配置设置 180 12.2.8 了解发布的概念 181 12.3 CD-ROM的加载 182 12.3.1 使用一个本地CD-ROM(Solaris2.2 或之后的系统软件) 182 12.3.2 使用一个本地CD-ROM(Solaris2.2 或2.1系统软件) 182 12.3.3 访问一个远程CD-ROM中的 文件 183 第13章 程序包命令 185 13.1 命令行中的程序包命令 185 13.2 设置程序包的配置文件 185 13.2.1 设置安装基本目录(base directory) 187 13.2.2 安装程序包可使用不同的安装管理 文件 187 13.3 添加程序包 187 13.4 检查程序包的安装 191 13.5 列出程序包 192 13.6 删除程序包 192 13.7 程序包系统日志文件 194 第14章 Admintool:软件管理器 195 14.1 启动Admintool 195 14.2 安装软件 196 14.2.1 访问本地光盘中的文件 196 14.2.2 定制安装 197 14.2.3 开始安装 198 14.3 删除软件 199 第15章 安装和管理系统软件补丁程序 200 15.1 补丁程序的发布 200 15.1.1 如何得到Sun的补丁程序 201 15.1.2 在Web页中得到补丁程序 201 15.1.3 使用ftp来得到补丁程序 202 15.2 补丁程序的编号 202 15.3 安装一个补丁程序 202 15.4 删除补丁程序 203 第六部分 shell编程介绍 第16章 编写shell脚本 205 16.1 基本概念 205 16.1.1 介绍Bourne、Korn和C shell 205 16.1.2 了解shell如何执行命令 206 16.1.3 命名shell脚本 207 16.1.4 标识shell 207 16.1.5 使脚本可执行 207 16.1.6 存储shell脚本 208 16.1.7 编写shell脚本程序 208 16.2 变量 208 16.2.1 shell变量 208 16.2.2 内置shell变量 211 16.2.3 环境变量 214 16.3 输入和输出 214 16.3.1 标准输入、标准输出和标准 错误 215 16.3.2 命令行输入 216 16.3.3 交互输入 218 16.3.4 here文档 219 16.3.5 生成输出 219 16.3.6 命令替换 220 16.4 条件判断 221 16.4.1 if-then-else-elif 221 16.4.2 if-else-else if-endif 222 16.4.3 嵌套的if结构 223 16.4.4 多重分支 223 16.5 流程控制 225 16.5.1 使用for/foreach循环 225 16.5.2 使用while循环 226 16.5.3 使用until循环 228 16.5.4 跳出循环 228 16.6 退出状态 228 16.7 数学运算 229 16.8 用户自定义函数 230 16.9 调试shell脚本 231 16.9.1 使用调试标志 231 16.9.2 了解shell文法解析顺序 233 第17章 参照表和例子脚本 235 17.1 参照表 235 17.1.1 环境文件 235 17.1.2 脚本的首行 235 17.1.3 Korn shell的目录运算符 235 17.1.4 C shell中的变量修改符 235 17.1.5 由shell初始化的变量 235 17.1.6 shell的内置命令 236 17.1.7 Brurne和Korn shell中的重定向 237 17.1.8 C shell中的重定向 237 17.1.9 C shell中的$argv的表示法 237 17.1.10 引用 238 17.1.11 无字符的语法 238 17.1.12 关于变量的shell语法 238 17.1.13 I/O重定向和管道功能 238 17.1.14 将输出显示到屏幕中 239 17.1.15 从键盘得到输入 239 17.1.16 数字和计算 239 17.1.17 命令替换 239 17.1.18 代字号(~)的展开 239 17.1.19 关于别名的语法 239 17.1.20 有关历史记录的语法 239 17.1.21 函数语法 240 17.1.22 编程中控制语句的语法 240 17.1.23 判断和C shell中的内置判断 命令 240 17.1.24 Bourne shell的数学运算符 241 17.1.25 C shell的数学运算符 241 17.2 例子脚本 241 17.2.1 匿名ftp的脚本 241 17.2.2 arch.sh.fctn函数 247 17.2.3 array.sh.fctn函数 248 17.2.4 hostname.sh.fctn函数 256 17.2.5 osr.sh.fctn函数 256 17.2.6 whoami.sh.fctn函数 257 第七部分 系统安全 第18章 理解系统安全 259 18.1 Solaris 2.6中新的安全特征 259 18.1.1 验证服务模块插件 259 18.1.2 可执行的堆栈和安全性 259 18.2 系统安全概述 260 18.2.1 维护系统的物理安全 261 18.2.2 维护登录和访问控制 261 18.2.3 限制对文件中数据的访问 261 18.2.4 维护网络控制 261 18.2.5 监视系统的使用 261 18.2.6 设置正确的路径变量 261 18.2.7 监视setuid程序 262 18.2.8 安装防火墙 262 18.2.9 报告安全问题 262 18.3 文件安全 262 18.3.1 用户类 263 18.3.2 文件许可权 263 18.3.3 目录许可权 263 18.3.4 表示许可权的八进制数 263 18.3.5 默认掩码 264 18.3.6 文件类型 264 18.3.7 文件管理命令 265 18.3.8 文件的特殊许可权 267 18.3.9 访问控制列表 271 18.4 网络安全 277 18.4.1 防火墙系统 278 18.4.2 身份验证和授权 278 18.4.3 共享文件 281 18.4.4 限制超级用户的访问权限 282 18.4.5 使用特权端口 283 18.4.6 自动安全增强工具 283 第19章 使用身份验证服务 284 19.1 DES加密 284 19.2 Diffie-Hellman身份验证 284 19.2.1 Diffie-Hellman身份验证是如何 工作的 285 19.2.2 管理Diffie-Hellman身份验证 286 19.3 Kerberos Version 4 290 19.3.1 Kerberos身份验证如何和NFS一起 工作 290 19.3.2 管理Kerberos 4的身份验证 291 19.4 身份验证服务模块插件 293 19.4.1 PAM模块的类型 293 19.4.2 堆积特性 293 19.4.3 密码对应特性 293 19.4.4 PAM是如何工作的 293 19.4.5 PAM的配置文件 294 19.4.6 有效的服务名称 295 19.4.7 控制标志 295 19.4.8 PAM的使用计划 298 19.4.9 配置PAM 298 第20章 使用自动安全增强工具 300 20.1 ASET的任务 300 20.2 ASET的控制文件 300 20.3 ASET的安全等级 301 20.4 ASET是如何工作的 301 20.4.1 系统文件访问权限的审核 302 20.4.2 系统文件检测 302 20.4.3 用户/组检验 302 20.4.4 配置文件的检验 303 20.4.5 环境的检查 303 20.4.6 eeprom检测 303 20.4.7 防火墙的设置 303 20.5 ASET的执行记录 304 20.6 ASET的结果报告 305 20.6.1 报告文件的格式 306 20.6.2 检测和对比报告文件 306 20.7 ASET的控制文件 306 20.7.1 tune文件 307 20.7.2 uid_aliases文件 310 20.7.3 检测列表文件 310 20.8 ASET的环境文件 310 20.8.1 ASET shell环境变量 313 20.8.2 PERIODIC_SCHEDULE变量 313 20.8.3 TASKS变量 314 20.8.4 UID_ALIASES变量 314 20.8.5 YPCHECK变量 314 20.8.6 CKLISTPATH_level变量 314 20.9 运行ASET 314 20.9.1 交互式地运行ASET 314 20.9.2 定期地运行ASET 317 20.9.3 终止定期地运行ASET 318 20.9.4 将报告集中到服务器 318 20.10 恢复被ASET更改的文件 319 20.11 ASET的错误信息 320 附录A 卷管理 322 附录B Solaris服务器企业内联网扩充 产品 334 术语表 365
《编写可维护的JavaScript》向开发人员阐述了如何在团队开发中编写具备高可维护性的JavaScript代码,书中详细说明了作为团队一分子,应该怎么写JavaScript。本书内容涵盖了编码风格、编程技巧、自动化、测试等几方面,既包括具体风格和原则的介绍,也包括示例和技巧说明,最后还介绍了如何通过自动化的工具和方法来实现一致的编程风格。   《编写可维护的JavaScript》作者Nicholas C. Zakas是顶级的Web技术专家,也是《JavaScript高级程序设计》一书的作者。他曾是Yahoo!的首席前端开发工程师,在完成了从一名“独行侠”到“团队精英”的蜕变后,他站在前端工程师的角度提炼出众多的最佳编程实践,其中包括很多业内权威所推崇的最佳法则,而这些宝贵经验正是本书的核心内容。   《编写可维护的JavaScript》适合前端开发工程师、JavaScript程序员和学习JavaScript编程的读者阅读,也适合开发团队负责人、项目负责人阅读。运用本书中讲述的技巧和技术,可以使JavaScript团队编程从侠义的个人偏好的阴霾走出来,走向真正的高可维护性、高效能和高水准。 第一部分 编程风格 第1章 基本的格式化 1.1 缩进层级 1.2 语句结尾 1.3 行的长度 1.4 换行 1.5 空行 1.6 命名 1.6.1 变量和函数 1.6.2 常量 1.6.3 构造函数 1.7 直接量 1.7.1 字符串 1.7.2 数字 1.7.3 null 1.7.4 undefined 1.7.5 对象直接量 1.7.6 数组直接量 第2章 注释 2.1 单行注释 2.2 多行注释 2.3 使用注释 2.3.1 难于理解的代码 2.3.2 可能被误认为错误的代码 2.3.3 浏览器特性hack 2.4 文档注释 第3章 语句和表达式 3.1 花括号的对齐方式 3.2 块语句间隔 3.3 switch语句 3.3.1 缩进 3.3.2 case语句的“连续执行” 3.3.3 default 3.4 with语句 3.5 for循环 3.6 for-in循环 第4章 变量、函数和运算符 4.1 变量声明 4.2 函数声明 4.3 函数调用间隔 4.4 立即调用的函数 4.5 严格模式 4.6 相等 4.6.1 eval() 4.6.2 原始包装类型 第二部分 编程实践 第5章 UI层的松耦合 5.1 什么是松耦合 5.2 将JavaScript从CSS中抽离 5.3 将CSS从JavaScript中抽离 5.4 将JavaScript从HTML中抽离 5.5 将HTML从JavaScript中抽离 5.5.1 方法1:从服务器加载 5.5.2 方法2:简单客户端模板 5.5.3 方法3:复杂客户端模板 第6章 避免使用全局变量 6.1 全局变量带来的问题 6.1.1 命名冲突 6.1.2 代码的脆弱性 6.1.3 难以测试 6.2 意外的全局变量 避免意外的全局变量 6.3 单全局变量方式 6.3.1 命名空间 6.3.2 模块 6.4 零全局变量 第7章 事件处理 7.1 典型用法 7.2 规则1:隔离应用逻辑 7.3 规则2:不要分发事件对象 第8章 避免“空比较” 8.1 检测原始值 8.2 检测引用值 8.2.1 检测函数 8.2.2 检测数组 8.3 检测属性 第9章 将配置数据从代码中分离出来 9.1 什么是配置数据 9.2 抽离配置数据 9.3 保存配置数据 第10章 抛出自定义错误 10.1 错误的本质 10.2 在JavaScript中抛出错误 10.3 抛出错误的好处 10.4 何时抛出错误 10.5 try-catch语句 10.6 错误类型 第11章 不是你的对象不要动 11.1 什么是你的 11.2 原则 11.2.1 不覆盖方法 11.2.2 不新增方法 11.2.3 不删除方法 11.3 更好的途径 11.3.1 基于对象的继承 11.3.2 基于类型的继承 11.3.3 门面模式 11.4 关于Polyfill的注解 11.5 阻止修改 第12章 浏览器嗅探 12.1 User-Agent检测 12.2 特性检测 12.3 避免特性推断 12.4 避免浏览器推断 12.5 应当如何取舍 第三部分 自动化 第13章 文件和目录结构 13.1 最佳实践 13.2 基本结构 第14章 Ant 14.1 安装 14.2 配置文件 14.3 执行构建 14.4 目标操作的依赖 14.5 属性 14.6 Buildr项目 第15章 校验 15.1 查找文件 15.2 任务 15.3 增强的目标操作 15.4 其他方面的改进 15.5 Buildr任务 第16章 文件合并和加工 16.1 任务 16.2 行尾结束符 16.3 文件头和文件尾 16.4 加工文件 第17章 文件精简和压缩 17.1 文件精简 17.1.1 使用YUI Compressor精简代码 17.1.2 用Closure Compiler精简 17.1.3 使用UglifyJS精简 17.2 压缩 17.2.1 运行时压缩 17.2.2 构建时压缩 第18章 文档化 18.1 JSDoc Toolkit 18.2 YUI Doc 第19章 自动化测试 19.1 YUI Test Selenium引擎 19.1.1 配置一台Selenium服务器 19.1.2 配置YUI Test Selenium引擎 19.1.3 使用YUI Test Selenium引擎 19.1.4 Ant的配置写法 19.2 Yeti 19.3 PhantomJS 19.3.1 安装及使用 19.3.2 Ant的配置写法 19.4 JsTestDriver 19.4.1 安装及使用 19.4.2 Ant的配置写法 第20章 组装到一起 20.1 被忽略的细节 20.2 编制打包计划 20.2.1 开发版本的构建 20.2.2 集成版本的构建 20.2.3 发布版本的构建 20.3 使用CI系统 20.3.1 Jenkins 20.3.2 其他CI系统 附录A JavaScript编码风格指南 附录B JavaScript工具集
《编写可维护的JavaScript》向开发人员阐述了如何在团队开发中编写具备高可维护性的JavaScript代码,书中详细说明了作为团队一分子,应该怎么写JavaScript。本书内容涵盖了编码风格、编程技巧、自动化、测试等几方面,既包括具体风格和原则的介绍,也包括示例和技巧说明,最后还介绍了如何通过自动化的工具和方法来实现一致的编程风格。   《编写可维护的JavaScript》作者Nicholas C. Zakas是顶级的Web技术专家,也是《JavaScript高级程序设计》一书的作者。他曾是Yahoo!的首席前端开发工程师,在完成了从一名“独行侠”到“团队精英”的蜕变后,他站在前端工程师的角度提炼出众多的最佳编程实践,其中包括很多业内权威所推崇的最佳法则,而这些宝贵经验正是本书的核心内容。   《编写可维护的JavaScript》适合前端开发工程师、JavaScript程序员和学习JavaScript编程的读者阅读,也适合开发团队负责人、项目负责人阅读。运用本书中讲述的技巧和技术,可以使JavaScript团队编程从侠义的个人偏好的阴霾走出来,走向真正的高可维护性、高效能和高水准。 第一部分 编程风格 第1章 基本的格式化 1.1 缩进层级 1.2 语句结尾 1.3 行的长度 1.4 换行 1.5 空行 1.6 命名 1.6.1 变量和函数 1.6.2 常量 1.6.3 构造函数 1.7 直接量 1.7.1 字符串 1.7.2 数字 1.7.3 null 1.7.4 undefined 1.7.5 对象直接量 1.7.6 数组直接量 第2章 注释 2.1 单行注释 2.2 多行注释 2.3 使用注释 2.3.1 难于理解的代码 2.3.2 可能被误认为错误的代码 2.3.3 浏览器特性hack 2.4 文档注释 第3章 语句和表达式 3.1 花括号的对齐方式 3.2 块语句间隔 3.3 switch语句 3.3.1 缩进 3.3.2 case语句的“连续执行” 3.3.3 default 3.4 with语句 3.5 for循环 3.6 for-in循环 第4章 变量、函数和运算符 4.1 变量声明 4.2 函数声明 4.3 函数调用间隔 4.4 立即调用的函数 4.5 严格模式 4.6 相等 4.6.1 eval() 4.6.2 原始包装类型 第二部分 编程实践 第5章 UI层的松耦合 5.1 什么是松耦合 5.2 将JavaScript从CSS中抽离 5.3 将CSS从JavaScript中抽离 5.4 将JavaScript从HTML中抽离 5.5 将HTML从JavaScript中抽离 5.5.1 方法1:从服务器加载 5.5.2 方法2:简单客户端模板 5.5.3 方法3:复杂客户端模板 第6章 避免使用全局变量 6.1 全局变量带来的问题 6.1.1 命名冲突 6.1.2 代码的脆弱性 6.1.3 难以测试 6.2 意外的全局变量 避免意外的全局变量 6.3 单全局变量方式 6.3.1 命名空间 6.3.2 模块 6.4 零全局变量 第7章 事件处理 7.1 典型用法 7.2 规则1:隔离应用逻辑 7.3 规则2:不要分发事件对象 第8章 避免“空比较” 8.1 检测原始值 8.2 检测引用值 8.2.1 检测函数 8.2.2 检测数组 8.3 检测属性 第9章 将配置数据从代码中分离出来 9.1 什么是配置数据 9.2 抽离配置数据 9.3 保存配置数据 第10章 抛出自定义错误 10.1 错误的本质 10.2 在JavaScript中抛出错误 10.3 抛出错误的好处 10.4 何时抛出错误 10.5 try-catch语句 10.6 错误类型 第11章 不是你的对象不要动 11.1 什么是你的 11.2 原则 11.2.1 不覆盖方法 11.2.2 不新增方法 11.2.3 不删除方法 11.3 更好的途径 11.3.1 基于对象的继承 11.3.2 基于类型的继承 11.3.3 门面模式 11.4 关于Polyfill的注解 11.5 阻止修改 第12章 浏览器嗅探 12.1 User-Agent检测 12.2 特性检测 12.3 避免特性推断 12.4 避免浏览器推断 12.5 应当如何取舍 第三部分 自动化 第13章 文件和目录结构 13.1 最佳实践 13.2 基本结构 第14章 Ant 14.1 安装 14.2 配置文件 14.3 执行构建 14.4 目标操作的依赖 14.5 属性 14.6 Buildr项目 第15章 校验 15.1 查找文件 15.2 任务 15.3 增强的目标操作 15.4 其他方面的改进 15.5 Buildr任务 第16章 文件合并和加工 16.1 任务 16.2 行尾结束符 16.3 文件头和文件尾 16.4 加工文件 第17章 文件精简和压缩 17.1 文件精简 17.1.1 使用YUI Compressor精简代码 17.1.2 用Closure Compiler精简 17.1.3 使用UglifyJS精简 17.2 压缩 17.2.1 运行时压缩 17.2.2 构建时压缩 第18章 文档化 18.1 JSDoc Toolkit 18.2 YUI Doc 第19章 自动化测试 19.1 YUI Test Selenium引擎 19.1.1 配置一台Selenium服务器 19.1.2 配置YUI Test Selenium引擎 19.1.3 使用YUI Test Selenium引擎 19.1.4 Ant的配置写法 19.2 Yeti 19.3 PhantomJS 19.3.1 安装及使用 19.3.2 Ant的配置写法 19.4 JsTestDriver 19.4.1 安装及使用 19.4.2 Ant的配置写法 第20章 组装到一起 20.1 被忽略的细节 20.2 编制打包计划 20.2.1 开发版本的构建 20.2.2 集成版本的构建 20.2.3 发布版本的构建 20.3 使用CI系统 20.3.1 Jenkins 20.3.2 其他CI系统 附录A JavaScript编码风格指南 附录B JavaScript工具集

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值