《软件测试52讲》——测试基础知识篇

news2024/11/24 11:09:50

1 你真的懂测试吗?从“用户登录”测试谈起

从“用户登录”测试谈起,“用户登录”功能作为测试对象

  作为测试工程师,你的目标是要保证系统在各种应用场景下的功能是符合设计要求的,所以你需要考虑的测试用例就需要更多、更全面。

  等价类划分方法,是将所有可能的输入数据划分成若干个子集,在每个子集中,如果任意一个输入数据对于揭露程序中潜在错误都具有同等效果,那么这样的子集就构成了一个等价类。后续只要从每个等价类中任意选取一个值进行测试,就可以用少量具有代表性的测试输入取得较好的测试覆盖结果。

  边界值分析方法,是选取输入、输出的边界值进行测试。因为通常大量的软件错误是发生在输入或输出范围的边界上,所以需要对边界值进行重点测试,通常选取正好等于、刚刚大于或刚刚小于边界的值作为测试数据。

基于等价类划分和边界值分析方法,设计的测试用例

现在,针对“用户登录”功能,基于等价类划分和边界值分析方法,我们设计的测试用例包括:

  1. 输入已注册的用户名和正确的密码,验证是否登录成功;
  2. 输入已注册的用户名和不正确的密码,验证是否登录失败,并且提示信息正确;
  3. 输入未注册的用户名和任意密码,验证是否登录失败,并且提示信息正确;
  4. 用户名和密码两者都为空,验证是否登录失败,并且提示信息正确;
  5. 用户名和密码两者之一为空,验证是否登录失败,并且提示信息正确;
  6. 如果登录功能启用了验证码功能,在用户名和密码正确的前提下,输入正确的验证码,验证是否登录成功;
  7. 如果登录功能启用了验证码功能,在用户名和密码正确的前提下,输入错误的验证码,验证是否登录失败,并且提示信息正确。

现在,我跟你分享一下有经验的测试工程师会再增加的测试用例:

  1. 用户名和密码是否大小写敏感;
  2. 页面上的密码框是否加密显示;
  3. 后台系统创建的用户第一次登录成功时,是否提示修改密码;
  4. 忘记用户名和忘记密码的功能是否可用;
  5. 前端页面是否根据设计要求限制用户名和密码长度;
  6. 如果登录功能需要验证码,点击验证码图片是否可以更换验证码,更换后的验证码是否可用;
  7. 刷新页面是否会刷新验证码;
  8. 如果验证码具有时效性,需要分别验证时效内和时效外验证码的有效性;
  9. 用户登录成功但是会话超时后,继续操作是否会重定向到用户登录界面;
  10. 不同级别的用户,比如管理员用户和普通用户,登录系统后的权限是否正确;
  11. 页面默认焦点是否定位在用户名的输入框中;
  12. 快捷键Tab和Enter等,是否可以正常使用。

显式功能性需求和非功能性需求

  显式功能性需求:软件本身需要实现的具体功能

  非功能性需求:安全性、性能、兼容性

安全性测试用例包括:

  1、用户密码后台存储是否加密;

  2、用户密码在网络传输过程中是否加密;

  3、密码是否具有有效期,密码有效期到期后,是否提示需要修改密码;

  4、不登录的情况下,在浏览器中直接输入登录后的URL地址,验证是否会重新定向到用户登录界面;

  5、密码输入框是否不支持复制和粘贴;

  6、密码输入框内输入的密码是否都可以在页面源码模式下被查看

  7、用户名和密码的输入框中分别输入典型的“SQL注入攻击”字符串,验证系统的返回页面;

  8、用户名和密码的输入框中分别输入典型的“XSS跨站脚本攻击”字符串,验证系统行为是否被篡改;

  9、连续多次登录失败情况下,系统是否会阻止后续的尝试以应对暴力破解;

  10、同一用户在同一终端的多种浏览器上登录,验证登录功能的互斥性是否符合设计预期;

  11、同一用户先后在多台终端的浏览器上登录,验证登录是否具有互斥性。

性能压力测试用例包括:

  1、单用户登录的响应时间是否小于3秒;

  2、单用户登录时,后台请求数量是否过多;

  3、高并发场景下用户登录的响应时间是否小于5秒;

  4、高并发场景下服务端的监控指标是否符合预期;

  5、高集合点并发场景下,是否存在资源死锁和不合理的资源等待;

  6、长时间大量用户连续登录和登出,服务器端是否存在内存泄露。

兼容性测试用例包括:

  1、不同浏览器下,验证登录页面的显示以及功能正确性;

  2、相同浏览器的不同版本下,验证登录页面的显示以及功能正确性;

  3、不同移动设备终端的不同浏览器下,验证登录页面的显示以及功能正确性;

  4、不同分辨率的界面下,验证登录页面的显示以及功能正确性。

   测试的不可穷尽性,即绝大多数情况下,是不可能进行穷尽测试的。“穷尽测试”,是指包含了软件输入值和前提条件所有可能组合的测试方法,完成穷尽测试的系统里应该不残留任何未知的软件缺陷。

  在绝大多数的软件工程实践中,测试由于受限于时间成本和经济成本,是不可能去穷尽所有可能的组合的,而是采用基于风险驱动的模式,有所侧重地选择测试范围和设计测试用例,以寻求缺陷风险和研发成本之间的平衡。

2 如何设计一个“好的”测试用例“

好的”测试用例必须具备哪些特征?

   在具体的用例设计时,首先需要搞清楚每一个业务需求所对应的多个软件功能需求点,然后分析出每个软件功能需求点对应的多个测试需求点,最后再针对每个测试需求点设计测试用例。

具体到测试用例设计本身的设计,两个关键的点:

  1、从软件功能需求出发,全面地、无遗漏地识别出测试需求是至关重要的,这将直接关系到用例的测试覆盖率。

  2、对于识别出的每个测试需求点,需要综合运用等价类划分、边界值分析和错误推测方法来全面地设计测试用例。

用例设计的其他经验

  1、只有深入理解被测试软件的架构,你才能设计出”有的放矢“的测试用例集,去发现系统边界以及系统集成上的潜在缺陷。

  2、必须深入理解被测软件的设计与实现细节,深入理解软件内部的处理逻辑。

  3、需要引入需求覆盖率和代码覆盖率来衡量测试执行的完备性,并以此为依据来找出遗漏的测试点。

3 什么是单元测试?如何做好单元测试

单元测试

  单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类。

如何做好单元测试?

  第一,代码的基本特征与产生错误的原因

  第二,单元测试用例详解(单元测试的用例是一个“输入数据”和“预计输出”的集合。)

  第三,驱动代码,桩代码和Mock代码(驱动代码是用来调用被测函数的,而桩代码和Mock代码是用来代替被测函数调用的真实代码的。)

驱动代码、桩代码和Mock代码三者的逻辑关系。

        

  驱动代码(Driver)指调用被测函数的代码,在单元测试过程中,驱动模块通常包括调用被测函数前的数据准备、调用被测函数以及验证相关结果三个步骤。

  桩代码(Stub)是用来代替真实代码的临时代码。

   Mock代码和桩代码的本质区别是:测试期待结果的验证(Assert and Expectiation)

实际项目中如何开展单元测试?

  1、并不是所有的代码都要进行单元测试,通常只有底层模块或核心模块的测试中才会采用单元测试。

  2、你需要确定单元测试框架的选型,这和开发语言直接相关。Java(Junit和TestNG),Python(Pytest、Unitest)

  3、为了能够衡量单元测试的代码覆盖率,通常你还需要引入计算代码覆盖率的工具。Java(JaCoCo)

  4、最后你需要把单元测试执行、代码覆盖率统计和持续集成流水线做成集成,以确保每次代码递交,都会自动触发单元测试,并在单元测试执行过程中自动统计代码覆盖率,最后以“单元测试通过率”和“代码覆盖率”为标准来决定本次代码递交是否能够被接受。

4 为什么要做自动化测试?什么样的项目适合做自动化测试

自动化测试

  自动化测试是,把人对软件的测试行为转化为由机器执行测试行为的一种实践

什么样的项目适合自动化测试?

  第一,需求稳定,不会频繁变更

  第二,研发和维护周期长,需要频繁执行回归测试

  第三,需要在多种平台上重复运行相同测试的场景

  第四,某些测试项目通过手工测试无法实现,或者手工成本太高

  第五,被测软件的开发较为规范,能够保证系统的可测试性

  第六,测试人员已经具备一定的编程能力

5 你知道软件开发各阶段都有哪些自动化测试技术吗?

单元测试的自动化技术

  第一,用例框架代码生成的自动化

  第二,部分测试输入数据的自动化生成

  第三,自动桩代码的生成

  第四,被测代码的自动化静态分析

 静态分析主要指代码的静态扫描,目的是识别出违反编码规则或编码风格的代码行。目前比较常用的代码静态分析工具有Sonar和Coverity等

  第五,测试覆盖率的自动统计与分析

Web Service测试的自动化技术

  Web Service测试,主要是指SOAP API和REST API这两类API测试,最典型的是采用SoapUI或Postman等类似的工具。但这类测试工具基本都是界面操作手动发起Request并验证Response,

所以难以和CI/CD集成,于是就出现了API自动化测试框架。

Web Service测试自动化包括:

  第一,测试脚本架代码的自动化生成

  第二,部分测试输入数据的自动生

  第三,Response验证的自动化

    Response验证自动化的核心思想是自动比较两次相同API调用的返回结果,并自动识别出有差异的字段值,比较过程可以通过规则配置去掉诸如时间戳、会话ID(Session ID)等动态值。

  第四,基于SoapUI或者Postman的自动化脚本生成

GUI测试的自动化技术

  GUI自动化测试主要分为两大方向:传统Web浏览器和移动端原生应用(Native Appp)的GUI自动化。附加(小程序)

  传统Web浏览器的GUI自动化测试:Selenium、Puppteer

  移动端原生应用:Appium

6 你真的懂测试覆盖率吗?

测试覆盖率

  测试覆盖率通常被用来衡量测试的充分性和完整性,从广义的角度来讲,测试覆盖率主要分为两大类,一类是面向项目的需求覆盖率,另一类是更偏向技术的代码覆盖率。

需求覆盖率

  需求覆盖率是指测试对需求的覆盖程度,通常的做法是将每一条分解后的软件需求和对应的测试建立一对多的映射关系,最终目标是保证测试可以覆盖每个需求,以保证软件产品的质量。

代码覆盖率
  代码覆盖率是批至少被执行了一次的条目数占整个条目数的百分比。

三种代码覆盖率指标

 代码覆盖率的价值

  统计代码覆盖率的根本目的是找出潜在的遗漏测试用例,并有针对性的进行补充,同时还可以识别出代码中那些由于需求变更等原因造成的不可达的废弃代码。

代码覆盖率的局限性

  总结来讲,高的代码覆盖率不一定能保证软件的质量,但是低的代码覆盖率一定不能保证软件的质量。

代码覆盖率工具

  JaCoCo是一款Java代码的主流开源覆盖率工具

  Javascript的代码覆盖率:JSCoverage和Istanbul

7 如何高效填写软件缺陷报告?

一份高效的缺陷报告主要由哪些部分组成及各部分的关键点。

  1、缺陷标题  

 缺陷标题通常是别人最先看到的部分,是对缺陷的概括性描述,通常采用“在什么情况下发生了什么问题”,的模式。

  2、缺陷概述

  缺陷概述通常会提供更多概括性的缺陷本质与现象的描述,是缺陷标题的细化。

  3、缺陷影响

  4、环境配置

  5、前置条件

  6、缺陷重现步骤

  7、期望结果和实际结果

  8、优先级(Priority)和严重程度(Severity)

  9、变通方案(Workaround)

  10、根原因分析(Root Cause Analysis)

  11、附件(Attachment)

8 以终为始,如何才能做好测试计划?

一份好的测试计划要包括:

1、测试范围

  明确“测什么”和“不测什么”

2、测试策略

  明确“先测什么后测什么”和“如何来测”

  (1)功能测试(2)兼容性测试(3)性能测试 等

        (1)功能测试: 主干业务流程的测试自动化

        (2) Web测试: 覆盖的浏览器类型和版本 , 移动测试: 覆盖的设备类型和具体iOS/Android的版本等

       (3)性能测试:  对于性能测试,需要在明确了性能需求(并发用户数、响应时间、事务吞吐量等)的前提下,结合被测系统的特点,设计性能测试场景并确定性能测试框架。

3、测试资源

  明确“谁来测”和“在哪里测”

4、测试进度

  明确开始时间、所需工作量、预计完成时间、上线发布时间

  行为驱动开发,BDD,最典型的框架是“Cucumber”

5、测试风险预估

  明确如何有效应地各种潜在的变化

9 软件测试工程师的核心竞争力是什么?

  测试开发岗位的核心其实是“测试”,“开发”的目的是更好地服务于测试

传统测试工程师的核心竞争力

  1、测试策略设计能力

    (1)测试要具体执行到程度;

    (2)测试需要借助于什么工具;

    (3)如何运用自动化测试以及自动测试框架,以及如何选型;

    (4)测试人员资源如何合理分配;

    (5)测试进度如何安排;

    (6)测试风险如何应对。

        测试策略设计能力是功能测试工程师最核心的竞争力,也是最难培养的

  2、测试用例设计能力

 提高测试用例设计能力,平时要多积累,对常见的缺陷模式、典型的错误类型以及遇到过的缺陷,不断总结、归纳、举一反三。

  3、快速学习能力

  4、探索性测试思维

  5、缺陷分析能力

  6、自动化测试技术

  7、良好的沟通能力

测试开发工程师的核心竞争力

  1、测试系统需求分析能力

  2、更宽广的知识体系

10 软件测试工程师需要掌握的非测试知识有哪些?

1、网站架构的核心知识

2、容器技术

  Docker和Kubernetes

3、云计算技术

  Sauce Labs 测试执行环境公有云服务

  Appium+Selenium Grid集群 搭建移动终端设备的测试执行私有云

4、DevOps思维

  Jenkins

5、前端开发技术

11 互联网产品的测试策略应该如何设计?

  发布流程通常包含了代码静态扫描、单元测试、编译、打包、上传、下载、部署和测试的全流程

传统软件产品的测试策略设计

 互联网产品的测试策略设计

 互联网产品的菱形测试策略(重量级API测试、轻量级GUI测试、轻量级单元测试)

  1、以中间层的API测试为重点做全面的测试。

  2、轻量级的GUI测试,只覆盖最核心直接影响主营业务流程的E2E场景。

  3、最上层的GUI测试通常利用探索式测试思维,以人工测试的方式发现尽可能多的潜在问题。

  4、单元测试采用“分而治之”的思想,只对那些相对稳定并且核心的服务和模块开展全面的单元测试,而应用层或者上层业务只会做少量的单元测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1830452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java I/O操作

引言 在Java编程中,输入和输出(I/O)操作是必不可少的部分。Java I/O通过一系列流(Stream)类和方法,支持文件操作、控制台输入输出、网络I/O等多种I/O操作。本文将详细介绍Java I/O的基础概念、文件操作、字…

SQL注入攻击

网站是什么工作的? php写的代码电脑不认识,脚本引擎就是做翻译的,把高级代码翻译为机器语言 访问网站的地址,不同的新闻的id是不一样的,就是对应数据库的不同位置 这里面一个ip地址对应三个网站(怎么能对应…

JavaScript领域的五大AI工程利器

五大引领AI工程的JavaScript工具,为欲将LLM融入项目的开发者提供关键资源。 译自Top 5 JavaScript Tools for AI Engineering,作者 Alexander T. Williams。 传统上以在网页开发中扮演角色而闻名的JavaScript,令许多人惊讶的是,它…

CAN测试工具——BUSMASTER

文章目录 推荐理由一、菜单栏Transmit WindowDiagnostics二、Tools推荐理由 BUSMASTER是一个用于设计,监测,分析与模拟CAN网络的开源的开放式总线PC软件. 1) 可以和十几种常用CAN总线硬件兼容。比如:IXXAT、PEAK、Kvaser、CANcase XL等。 2)免费,开源 https://rbei-etas.g…

pandas获取某列最大值的所有数据

第一种方法: 按照某列进行由大到小的排序,然后再进去去重,保留第一个值,最终保留的结果就是最大值的数据 # 由大到小排序 data_frame data_frame.sort_values(bycolumn_a, ascendingFalse)# 按照column_b列去重保留第一条&#…

人工智能在数字病理领域的最新进展|顶刊速递·24-06-14

小罗碎碎念 文献主题:人工智能在【数字病理】领域的最新进展 今天在写这篇推文的时候,脑子里就一个念头——大模型的风,终于还是卷到了病理学领域。 这是一个好事哈,如果我们搞病理研究的,也能有一个像Chatgpt一样的工…

如何使用 pip 卸载所有已安装的 Python 包?

在开发过程中,我们可能会安装许多 Python 包,有时需要彻底清理环境,以便从头开始或者解决冲突问题。下面将介绍如何使用 pip 命令卸载所有已安装的 Python 包。 一、列出所有已安装的包 首先,需要列出当前环境中所有已安装的包。…

开源模型应用落地-LangChain高阶-LCEL-表达式语言(七)

一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么&…

树状数组练习

先看一下最后一题&#xff0c;这是一个树状数组的题目&#xff0c;那就水一下吧,但是由于没有注意问题&#xff0c;wa了很多次 const int N (int)1e5 5; int n; int flag[N]; int dp[N]; class Solution { public:vector<int> countOfPeaks(vector<int>& num…

【秋招突围】2024届秋招笔试-小红书笔试题-第二套-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

意大利罗马3日自由行攻略

欢迎关注「苏南下」 在这里分享我的旅行和影像创作心得 今天来和大家聊聊我个人很喜欢的一座城市—意大利罗马。 作为意大利的首都&#xff0c;罗马自公元前753年建成至今&#xff0c;有超过2700年的历史&#xff0c;被誉为“永恒之城”。走在罗马街头&#xff0c;几乎看不到一…

使用 Python 进行测试(3)pytest setup

总结 我们前进到更真实的项目&#xff1a; less_basic_project ├── my_awesome_package │ ├── calculation_engine.py │ ├── __init__.py │ ├── permissions.py ├── pyproject.toml └── tests├── conftest.py├── test_calculation_engine.p…

283. 移动零 (Swift版本)

题目描述 最容易想到的解法 从后向前遍历, 发现0就通过交换相邻元素将0移动到最后 class Solution {func moveZeroes(_ nums: inout [Int]) {for index in (0..<nums.count).reversed() {if nums[index] 0 {moveZeroes(&nums, index)}}}func moveZeroes(_ nums: inout …

Mybatis plus join 一对多语法

一对多案例&#xff08;set集合&#xff09; 1. 实体类 题目 package co.yixiang.exam.entity;import co.yixiang.domain.BaseDomain; import co.yixiang.exam.config.CustomStringListDeserializer; import com.baomidou.mybatisplus.annotation.TableField; import com.fa…

youlai-boot项目的学习—本地数据库安装与配置

数据库脚本 在项目代码的路径下&#xff0c;有两个版本的mysql数据库脚本&#xff0c;使用对应的脚本就安装对应的数据库版本&#xff0c;本文件选择了5 数据库安装 这里在iterm2下使用homebrew安装mysql5 brew install mysql5.7注&#xff1a;记得配置端终下的科学上网&a…

PHP7 数组的实现

前提 PHP版本&#xff1a;php7.0.29使用到的文件 php-src/Zend/zend_types.hphp-src/Zend/zend_hash.hphp-src/Zend/zend_hash.cphp-src/Zend/zend_string.h 本文 是《PHP7底层设计和源码实现》第5章 数组的实现&#xff0c;学习笔记 功能分析 整体结构 bucket 里面增加h字段…

android studio CreateProcess error=2, 系统找不到指定的文件

【问题记录篇】 在AndroidStudio编译开发jni相关工程代码的时候&#xff0c;编译遇到的这个报错&#xff1a; CreateProcess error2, 系统找不到指定的文件。排查处理步骤: 先查看Build Output的具体日志输出 2.了解到问题出在了NDK配置上&#xff0c;此时需要根据自己的gra…

RTOS实时操作系统

常见的RTOS有&#xff1a; VxWorks&#xff1a;广泛应用于工业、医疗、通信和航空航天领域。FreeRTOS&#xff1a;一个开源的RTOS&#xff0c;广泛用于嵌入式设备。uc/OS&#xff1a;一个适用于教育和小型商业项目的RTOS。QNX&#xff1a;主要应用于汽车和工业自动化领域。Win…

第 2 章:Spring Framework 中的 IoC 容器

控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;与 面向切面编程&#xff08;Aspect Oriented Programming&#xff0c;AOP&#xff09;是 Spring Framework 中最重要的两个概念&#xff0c;本章会着重介绍前者&#xff0c;内容包括 IoC 容器以及容器中 …

Android-茫茫9个月求职路,终于拿满意offer

线程和进程的区别&#xff1f;为什么要有线程&#xff0c;而不是仅仅用进程&#xff1f;算法判断单链表成环与否&#xff1f;如何实现线程同步&#xff1f;hashmap数据结构&#xff1f;arraylist 与 linkedlist 异同&#xff1f;object类的equal 和hashcode 方法重写&#xff0…