软件工程第八章:编码与测试

文章目录


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、编码概述

编码俗称编程序,通常把编码和单元测试安排在同一个阶段完成。软件开发的最终目标是产生能在计算机上执行的程序。分析阶段和设计阶段所产生的模型和文档都不能在计算机上执行,只有到了编码阶段,才能产生可执行的代码。

(一)目的

选用特定的程序设计语言把设计模型翻译为用该语言书写的源程序(源代码)源程序经过编译等环节,在转换为可执行代码:

(二)风格

从20世纪70年代以来,程序的目标从强调效率到强调清晰,编码风格也逐渐演变为清晰和直接

1.使用标准的控制结构

增加表达上的便利或者改进程序的可读性,提高执行效率

2.实现源程序的文档化

软件=程序+文档 在传统程序设计中,编码的目的是产生程序,其余阶段则主要产生文档,例如:有意义的变量名称、适当的注释、标准的书写格式

3.满足对用户友好的输入输出风格

对用户用好,便于用户理解

二、测试

(一)测试的基本概念

软件测试,是动态查找程序代码中的各类错误和问题的过程

1.测试的目的和任务

软件测试是为了发现错误而执行程序的过程

  • 目的:发现程序的错误
  • 任务:通过在计算机执行程序,暴露程序中潜在的错误

2.测试与调试的区别

对比维度 软件测试 调试
根本目的 发现错误,验证软件是否满足需求与预期。 定位并修复错误,使程序能正确运行。
执行角色 通常由测试人员或独立测试组执行。 必须由开发人员(程序员)执行。
开始条件 已知条件,有预定义的输入和预期输出。 未知条件,从程序出错的不确定状态开始。
计划与过程 可计划、可设计(如测试用例),进度可度量。 不可计划、随机性强,依赖推理,进度难度量。
工作对象 文档、代码、系统等多种工作产品。 主要针对源代码
思维与方法 系统性、证明性行为,旨在暴露问题。 分析性、推理性过程,依赖经验与逻辑。
时序关系 在调试之前执行,为调试提供问题线索。 在测试之后执行,修复测试发现的问题。
工具支持 测试管理工具、自动化测试框架等。 调试器、日志分析等开发工具。
  • 测试是"找病":系统性地揭示缺陷,关注"软件做得对不对"。
  • 调试是"治病":分析并修复缺陷根源,关注"如何让代码正确运行"。

(二)测试的特性

1.挑剔型

抱着为证明程序有错的目的去测试,才能把程序中的大部分错误找出来

2.复杂性

测试阶段需要考虑各种可能得情况,对被测程序进行多方面的考核,做好一个大型程序的测试,其复杂性不亚于对这个软件的开发

3.不彻底性

彻底测试:保证被测程序在一切可能得输入情况下全部执行一遍,通常称这种测试为穷举测试。在实际中,难以穷尽,所以说注定一切测试都是不彻底的

4.经济性

选择测试:选取一些有代表性的、典型的测试用例,进行有限的测试,降低测试成本。

遵守经济性原则:

  • 根据程序的重要性和发生故障的损失来确定可靠性等级
  • 认真研究测试策略,尽可能减少测试用例,发现多的程序错误

(三)测试的种类

1.静态分析

静态分析即为:通过被测程序的静态审查,发现代码中潜在的错误。也称之为人工测试或代码评审,也可借助于静态分析器在计算机上用自动运行方式进行检查,不要求程序本身在计算机上运行。

2.动态测试

分为两种。黑盒测试通过程序的功能设计测试用例, 白盒测试根据被测程序的内容结构设计测试用例,测试者需事先了解被测程序的结构。

(四)黑盒测试和白盒测试

1.黑盒测试

也称之为功能测试,根据被测功能来进行测试。黑盒测试是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的。很明显,如果外部特性本身设计有问题或规格说明的规定有误,用黑盒测试方法是发现不了的。

(1)等价分类法

所谓等价分类,就是把输入数据的可能值划分为若干等价类,使每类中的任何一个测试用例,都能代表同一等价类中的其他测试用例。换句话说,如果从某一等价类中任意选出一个测试用例未能发现程序的错误,就可以合理地认为使用该类中的其他测试用例也不会发现程序的错误。

采用这一技术要注意以下两点:

  • 1.划分等价类不仅要考虑代表有效输入值 的有效等价类,还需考虑代表无效输入值的无效等价类;

  • 2.每一无效等价类至少要用一个测试用例,不然就可能漏掉某一类错误,但允许若干有效等价类合用同一个测试用例,以便进一步减少测试的次数。

  • 实例分析:

某工厂公开招工,规定报名者年龄应在16 周岁至35周岁之间(到2008年3月止)。若出生年月不在上述范围内,将拒绝接受,并显示"年龄不合格"等出错信息。试用等价分类法设计对这一程序功能的测试用例。

第一步: 划分等价类。 假定已知出生年月由6位数字字符表示,前4位代表年后2位代表月,则可以划分为3个有效等价类、7个无效等价类。


第二步: 设计有效等价类需要的测试用例 。①⑤⑧等3个有效等价类可以共用一个测试用例。

第三步为每一无效等价类至少设计一个测试用例。本例具有7个无效等价类,至少需要7个测试用例。

(2)边界值分类法

选择恰当的测试用例,在处理边界情况时,使得被测程序能在边界值及其附近运行,从而更有效的暴露程序中隐藏的错误。

我们以出生年月为例,如果以边界值分析法来确定的话

(3)错误猜测法

就是猜测被测程序在哪些地方容易出错,然后针对可能的薄弱环节来设计测试用例

2.白盒测试

白盒测试以程序的结构为例,所以称之为结构测试,早期阶段的白盒测试把注意力放在流程图的各个判定框,**使用不同的逻辑覆盖标准表达对程序进行测试的详尽程度。**随着技术的发展,人们认为越来越重视对程序执行路径的考察。用程序图代替流程图来设计测试用例。产生了以下两种方法:

(1)逻辑覆盖测试

用相关流程图设计测试用例,重点是判定框,以下是逻辑覆盖测试的标准:



(2)路径测试

引导人们把注意力集中在某个程序的判定部分,抓住了结构测试的重点

三、多模块程序的测试策略

(一)测试的层次性


1.单元测试

动态测试是单元测试的最后步骤,重点是发现单元的功能性错误。可用选用白盒/黑盒测试方法。动态测试是单元测试的最后步骤,重点是发现单元的功能性有误。

2.集成测试

(1)自顶向下测试

先广后深或先深后广

(2)由底向上测试

由下向上逐步添加新模块,组成子系统或模块群,挨个完成子系统

(3)混合方式测试

上层模块采用自顶向下,关键模块/子系统采用由底向上

(4)几种测试的比较
维度 自顶向下测试 (Top-Down) 由底向上测试 (Bottom-Up) 混合测试 (Sandwich/混合)
核心思想 顶层 模块开始,逐步集成下层模块 底层 模块开始,逐步集成上层模块 结合两者,通常两头向中间推进
集成顺序 主控模块 → 深度或广度优先集成子模块 叶子/原子模块 → 逐层向上形成子系统 → 最终集成主控模块 对顶层关键模块采用自顶向下 ,同时对底层关键模块采用由底向上
需要什么模块 需要大量桩模块 (Stub) 模拟下层 需要大量驱动模块 (Driver) 模拟上层调用 两者都需要,但数量可能减少
主要优点 1. 早期验证主要控制和决策点 2. 较早呈现完整系统框架 3. 支持深度优先,可早期实现关键功能 1. 早期验证底层实用模块 2. 故障定位相对容易 3. 并行测试程度高,适合大型项目 1. 结合两者优势 2. 测试效率高 ,缩短周期 3. 适合大型复杂系统,可灵活应对
主要缺点 1. 桩模块开发量大 ,成本高 2. 底层验证推迟 ,可能掩盖底层严重缺陷 3. 测试环境与实际有差距 1. 驱动模块开发量大 2. 顶层设计缺陷发现晚 3. 无法早期呈现完整系统形象 1. 策略复杂 ,管理难度增加 2. 中间层模块可能被重复测试 3. 需要精心规划集成顺序
关键适用场景 1. 产品型/结构清晰的软件 2. 需要早期原型演示 3. 主要控制风险在上层的系统 1. 底层接口明确且稳定 的系统 2. 算法密集、底层复杂度高的系统 3. 重用模块多的情况 1. 大型、复杂 的软件系统 2. 开发团队较多,需要高度并行 3. 对开发周期有严格要求
高频考点 桩模块的作用、优缺点、何时体现"早期框架" 驱动模块的作用、优缺点、底层验证优势 混合策略的核心折中思想、适用场景、管理复杂度

3.确认测试

(1)有效性测试

(黑盒测试)和配置复审,确认组装完毕的程序是否满足SRS的要求

(2)验收测试

由用户而非开发者完成(面向客户)

(3)α与β测试

α测试是在受控环境下用户在开发者指导下进行测试。(开发者在场)

β测试是最终用户在自己的场所进行。(开发者不在场)

4.终止测试

  • 规定测试策略和应达目标
  • 规定至少要查出的错误数量

5.面向对象测试和传统测试的区别:

  • 面向对象的单元是封装的类和对象,传统单元测试的单元是程序模块。
  • 传统集成测试是自上而下或自下而上或两头逼近,面向对象程序无层次控制结构,只进行基于黑盒方法的集成测试。
  • 面向对象软件的确认测试忽略类连接的细节,采用黑盒法对系统分析阶段用例描述的用户交互进行测试。系统测试搭建与用户实际使用环境相同的测试平台。

测试最晚开始时间:需求分析的时候

6.测试驱动开发的基本流程是什么

测试驱动开发(TDD)的基本流程是一个循环迭代的过程,核心遵循"红-绿-重构"三个阶段,旨在通过测试驱动代码设计和实现。‌

  • 红(Red)阶段:‌ 首先,编写一个针对特定功能需求的测试用例,此时由于功能尚未实现,测试会‌运行失败‌,以明确期望的行为或边界条件。‌
  • 绿(Green)阶段:‌ 接着,编写‌最简化的实现代码‌,仅用于使当前测试通过,此阶段不追求代码优化,而是快速验证逻辑可行性。‌
  • 重构(Refactor)阶段:‌ 在测试通过后,对代码进行‌结构优化‌,如消除重复、提升可读性和可维护性,同时确保所有测试仍能通过,以保持功能完整性。‌
  • 这一循环持续进行,逐步累积功能,最终形成高质量、可维护的代码。‌

7.什么是版本控制系统,常见的版本控制系统有哪些?

版本控制系统是一种用于管理文件、代码或文档等软件资产修改历史的技术,它记录每次更改的细节(如更改内容、时间及操作者),支持版本追溯、回滚、备份和团队协作,从而提升开发效率和项目可维护性。

Git和SVN


总结

本文概述了软件编码与测试的核心内容。编码阶段将设计模型转化为可执行程序,强调编码风格应注重清晰性、文档化和用户友好性。测试部分区分了测试与调试,指出测试是系统性发现错误的过程,具有挑剔性、复杂性、不彻底性和经济性特点。文章详细介绍了黑盒测试(功能测试)和白盒测试(结构测试)的方法,包括等价分类法、边界值分析法和逻辑覆盖测试等。测试作为软件开发的关键环节,需平衡全面性与经济性,通过科学方法确保软件质量。

相关推荐
Justice Young18 小时前
软件工程第二章:软件生存周期与软件过程
软件工程
行业探路者18 小时前
二维码制作工具使用指南:如何利用电脑摄像头轻松扫描和生成图片二维码
大数据·人工智能·学习·产品运营·软件工程
雾江流18 小时前
GrokAI1.0.94 | 实测可无敏感生图,可生成视频
软件工程
Justice Young21 小时前
软件工程第九章、第十章:软件维护、软件重构、软件复用
重构·软件工程
Justice Young21 小时前
软件工程第六章、第七章:面向对象分析及设计
软件工程
帅次1 天前
系统设计方法论全解:原则、模型与用户体验核心要义
设计模式·流程图·软件工程·软件构建·需求分析·设计规范·规格说明书
manuel_897572 天前
七 软件工程
软件工程
程序漫游人4 天前
苹果IOS App Store加快审核进度
android·ios·软件工程·iphone
832301207张泽瑞4 天前
智能学习资源管理平台 - Beta冲刺总结
学习·软件工程