测试技术体系
一. 测试技术体系简介与价值软件技术体系是软件开发中所有技术与工具的集合涵盖了从编程语言、开发框架、数据库、服务器、版本控制工具、开发工具以及测试工具等的全链路。掌握这一体系对测试人员至关重要其核心价值在于提升效率与质量通过自动化工具和科学方法更快、更全面地发现缺陷。促进团队协作统一的技术语言和流程让开发与测试沟通更顺畅。增强个人竞争力全面的技术视野是测试工程师职业发展的核心优势。二、软件测试分类基础概念软件测试的核心在于验证软件能否稳定、可靠地运行。为了全方位排查潜在隐患测试工作通常会从不同维度划分为多种类型。掌握这些分类方法能帮助测试人员从各个角度审视产品精准定位并解决缺陷最终保障软件质量提升用户体验。软件测试可以从不同维度进行分类以应对多样化的测试场景。2.1 按开发阶段分类这是最常见的分类方式体现了测试从局部到整体的过程。单元测试测试代码的最小单元如函数、方法确保其独立功能正确。通常由开发人员完成。集成测试测试多个单元或模块组合在一起时接口和交互是否正常。系统测试将整个软件系统作为一个整体进行测试验证其是否满足所有需求规格。验收测试由最终用户或客户执行确认软件是否满足业务需求决定是否接收。系统测试分类功能测试验证系统的每个功能是否按照需求规范运行。兼容性测试验证系统在不同环境、操作系统、浏览器和设备上的兼容性。性能测试评估系统的性能表现如响应时间、吞吐量和资源使用情况。安全测试识别系统中的安全漏洞确保系统能够抵御攻击。验收测试分类α 测试由内部人员在开发环境中进行的测试主要在软件开发的早期阶段进行。β 测试由实际用户在真实环境中进行的测试通常在软件发布之前进行以获取用户反馈。2.2 按是否查看代码分类黑盒测试黑盒测试又称数据驱动测试。其不关心内部代码只关注输入和输出。测试人员像普通用户一样根据需求文档验证功能。白盒测试深入了解代码内部逻辑和结构测试代码路径、条件和循环。单元测试是典型的白盒测试。灰盒测试介于黑盒和白盒之间。测试人员了解部分内部结构如架构、数据库设计但测试时仍以用户视角为主设计更有针对性的用例。灰盒测试的核心在于测试人员对被测系统拥有部分、有限的内部知识。这些知识可能包括系统架构图、组件交互方式数据库表结构、数据流向API接口定义和协议关键算法或业务逻辑的概要测试人员利用这些信息从用户角度出发设计出比纯黑盒测试更深入、更有针对性的测试用例但并不像白盒测试那样深入到逐行代码的层面。2.3 按测试执行方式分类这个维度关注测试活动是否需要运行程序。静态测试静态测试是在不运行程序代码的情况下进行的测试通过检查代码、文档和设计等来发现潜在的问题。代码审查、静态分析、走查、技术评审、同行评审等。动态测试动态测试是在运行程序代码的情况下进行的测试通过实际执行代码来验证软件的功能和性能。单元测试、集成测试、系统测试、验收测试等。2.4 按是否手工执行划分分类这个维度关注测试用例是由人还是由机器来执行。手工测试由测试人员手动执行测试用例适用于探索性测试和一些复杂的测试场景。自动化测试使用测试工具和脚本自动执行测试用例适用于重复性高、容易自动化的测试。2.5 其他分类冒烟、回归、探索性测试冒烟测试对新版本进行的基础功能验证确保核心流程可用决定是否接受该版本进行更深入的测试。作为软件质量的第一道防线若核心流程受阻通常意味着版本存在严重缺陷后续的系统测试等深度验证将直接终止避免无效的资源消耗。回归测试在代码修改后重新执行相关测试确保新改动没有破坏原有功能。探索性测试探索性测试是一种非正式的、同时进行测试设计和执行的测试方法。测试人员根据自己的经验和直觉在测试过程中不断调整和设计新的测试用例动态探索软件系统的行为和缺陷。三、自动化分层测试体系分层测试是一种系统化的策略它将测试任务划分为不同层次。每个层次针对特定的测试目标和需求进行测试。这样可以确保软件质量通过多层次的测试全面覆盖各种测试场景和需求。70% 单元测试20% 服务测试10% 用户界面测试1.低层测试高频率根据测试金字塔模型低层次的测试如单元测试应当更频繁地执行因为这些测试运行速度快且能够以较低的成本发现问题。随着测试层级的提升测试的频率可以逐步降低。2.早期测试策略测试应当尽早开始以便尽快发现问题。这意味着在代码编写阶段就要开始进行单元测试确保早期捕捉和解决缺陷。3.全面覆盖测试每个层次的测试都需要全面覆盖其关注的方面。例如UI 测试应覆盖所有用户界面元素系统测试则应覆盖所有业务逻辑确保所有功能都经过充分测试。4.测试独立性原则各层次的测试应保持独立不依赖其他层次的测试。单元测试应只关注被测单元不应依赖于UI或数据库等其他组件以确保测试的准确性和可维护性。3.1 单元测试针对代码最小单元如函数、类进行的测试是保证代码质量的基石。执行单元测试框架JavaJUnit:JUnit是Java最流行的单元测试框架之一用于编写和运行重复的测试。它提供了许多有用的注解和断言方法。TestNG:TestNG是一个功能强大的测试框架设计灵活支持单元测试、集成测试和端到端测试。Pythonunittest:unittest是Python的内建单元测试框架灵感来自于JUnit提供了编写和执行测试的基本工具。pytest:pytest是一个流行的Python测试框架以其简洁的语法和强大的功能而著称。它支持更复杂的测试需求和插件。3.2 接口测试什么是接口软件分为前端和后端前端负责视觉页面展示也就是用户可以看到的部分后端负责提供数据和业务逻辑处理也就是接口。接口全称是Application Programming Interface一般称作API通常以Http或者Https的形式存在。而接口就是一套前后端交互的“规则”或“契约”。它规定了两个不同的软件程序、系统或组件之间应该如何互相沟通、传递数据。接口测试是什么通过Http或者Https对api 是针对软件对外提供服务的接口的输入输出进行测试。检查接口参数传递的正确性接口功能实现的正确性输出结果的正确性以及对各种异常情况的容错处理的完整性和合理性。选择合适的工具可以帮助更高效地进行接口测试确保 API 的功能、性能和安全性。执行接口测试的相关工具Charles:Charles是一款HTTP代理工具提供了流量监控和调试功能。可以用来捕获、分析和修改HTTP和HTTPS请求。Fiddler:Fiddler是一个功能强大的HTTP调试代理可以捕获和分析网络流量。postman:Postman是一个流行的API客户端用于设计、测试和文档化 API。Jmeter:JMeter是一个开源的负载测试工具可以用于性能测试和功能测试。loadRunner:LoadRunner是一个企业级负载测试工具用于测试应用程序的性能和可伸缩性。python 提供的接口操作库Requests:requests 是一个流行的 Python HTTP 库用于发送 HTTP 请求和处理响应。代码示例importrequests# 1. 构造 GET 请求并带上查询参数params{city:成都}responserequests.get(https://api.example.com/weather,paramsparams)# 2. 打印状态码和解析后的 JSON 数据print(f状态码:{response.status_code})print(f天气数据:{response.json()})HttpRunner:HttpRunner 是一个基于 Python 的开源 API 测试工具支持接口测试、性能测试和测试自动化。HttpRunner 的核心优势是无需写复杂的 Python 代码只需编写一个清晰的 YAML 文件就能定义完整的测试用例非常适合在 CI/CD 流水线中运行代码示例# testcase_add_pet.ymlconfig:name:新增宠物接口测试 base_url:https://petstore.swagger.io teststeps:-name:新增一只名为旺财的宠物 request:method:POST url:/v2/pet headers:Content-Type:application/json json:id:1name:旺财 status:available validate:-eq:[status_code,201]# 验证状态码-eq:[body.name,旺财]# 验证返回的宠物名字(在命令行运行 hrp run testcase_add_pet.yml 即可执行测试并生成 HTML 报告)Java 提供的接口操作库HttpClientHttpClient 是 Apache 提供的一个用于发送 HTTP 请求和处理响应的 Java 库。代码示例importorg.apache.http.client.methods.CloseableHttpResponse;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.util.EntityUtils;publicclassWeatherClient{publicstaticvoidmain(String[]args)throwsException{// 1. 创建 HttpClient 实例try(CloseableHttpClienthttpClientHttpClients.createDefault()){// 2. 构造 GET 请求 (假设这是一个模拟的天气接口)HttpGethttpGetnewHttpGet(https://api.example.com/weather?city成都);// 3. 执行请求并获取响应try(CloseableHttpResponseresponsehttpClient.execute(httpGet)){// 4. 打印状态码和响应内容System.out.println(状态码: response.getStatusLine().getStatusCode());StringbodyEntityUtils.toString(response.getEntity(),UTF-8);System.out.println(天气数据: body);}}}}RestAssuredRestAssured 是一个用于 Java 的库用于测试 RESTful Web 服务。代码示例importio.restassured.RestAssured;importstaticio.restassured.RestAssured.*;importstaticorg.hamcrest.Matchers.*;publicclassPetStoreTest{publicstaticvoidmain(String[]args){// 设置基础路径RestAssured.baseURIhttps://petstore.swagger.io;// 构造测试请求体StringnewPetJson{\id\: 1, \name\: \旺财\, \status\: \available\};given().contentType(application/json).body(newPetJson)// 设置请求头.when().post(/v2/pet)// 当发送 POST 请求.then().statusCode(201)// 那么验证状态码是否为 201.body(name,equalTo(旺财));// 且验证返回的 name 字段是否为“旺财”}}3.3 UI测试UI 测试用户界面测试是软件测试的一种类型专注于验证应用程序的用户界面是否符合预期。它确保用户界面的各个方面如布局、功能、交互、以及视觉效果按照设计规范进行实现。UI 测试方法人工方法人工查看:测试人员手动检查应用程序的用户界面以确认所有元素按钮、输入框、菜单等是否按照需求规格正确显示和布局。人工操作:测试人员手动执行操作如点击、输入、滚动等以验证用户界面的功能是否符合预期。自动化方法webSelenium适用于各种 Web 浏览器和操作系统。appAppium适用于 Android 和 iOS 移动应用。
