01 前言
开发人员必须具有基本的测试意识和能力,这是保证自己交付的代码是可用的前提,也是保证代码质量的最低要求。
02 为什需要自测?
我们来看一个场景的场景:面对一个在限定时间内必须完成的需求,我们经过了紧张的编码后,然后来来回回读了好几遍代码,程序的运行逻辑在自己的大脑中跑了好几个来回,然后就匆匆地提交了自己的代码。然而,当测试人员测试时,却发现程序压根就跑不起来。然后,测试提出bug,开发人员拿到bug以后,根据bug的表现,去debug自己的代码,发现自己当初编码时的错误(有可能是非常愚蠢的低级错误),修改bug,再提交自己的代码,再交给测试人员测试,直至代码能够良好的运行。虽然最终解决了这个问题,但是,整个过程是非常低效的!
03 如何做好自测?
3.1 研发流程
研发人员对自己开发的模块进行自测是最基本的要求,不需要另行强调。研发的工作是团队协作中的一环,和环上的所有人一样,都应该对自己所做的工作负责,这样对于环上的其他人才是公平的、有效的,团队的整体效率才能提高。
3.2 自测的标准
-
功能测试:确保代码能够满足需求规格说明书中定义的所有功能(满足不了的功能应该在需求评审的时候就被毙掉)。
-
性能测试:确保代码能够满足性能要求,例如响应时间、吞吐量等。
-
安全测试:确保代码没有安全漏洞(在研发自身内的安全问题应该被处理)。
-
兼容性测试:确保代码能够在不同的环境下正常运行,具备可测试性。
-
自测报告:需要包含研发自测时的测试用例。
3.3 自测的一些方法
3.3.1 构造请求
在测试的时候构造请求的方法主要有以下几种:
-
手动构造:直接在浏览器中输入请求地址和参数,然后发送请求。
-
使用工具:使用专门的工具来构造请求,例如 Postman
-
使用代码:使用编程语言来构造请求,例如 Python等。
-
使用debug包
在构造请求时,需要注意以下几点:
-
请求地址:请求地址是请求的目标地址。
-
请求参数:请求参数是请求的数据。
-
请求头:请求头是请求的附加信息。
-
请求方法:请求方法是请求的类型。
在测试的时候,可以通过构造不同的请求来测试软件的不同功能。例如,可以构造正常请求来测试软件的正常功能,也可以构造异常请求来测试软件的异常情况。以下是一些构造请求的常见技巧:
-
使用默认值:如果请求参数没有指定值,可以使用默认值。
-
使用随机值:如果请求参数可以使用随机值,可以使用随机数生成器来生成随机值。
-
使用边界值:如果请求参数有边界值,可以使用边界值来测试软件的边界情况。
-
使用负值:如果请求参数可以使用负值,可以使用负值来测试软件的负值情况。
通过掌握这些技巧,可以帮助我们构造更有效的请求,从而提高测试的效率和准确性。
3.3.2 抓包
在测试的时候对请求进行抓包,可以帮助我们:
-
了解请求的详细信息:抓包可以让我们查看请求的地址、参数、头部等信息,从而了解请求的详细情况。
-
定位问题:如果测试过程中出现问题,可以通过抓包来定位问题的源头,例如请求地址错误、参数错误、头部错误等。
-
模拟用户行为:可以使用抓包来模拟用户的行为,例如更改请求参数、修改请求头等。
-
进行性能测试:可以使用抓包来获取请求的响应时间、带宽等信息,从而进行性能测试。
以下是一些常见的抓包测试场景:
-
接口测试:在接口测试中,可以使用抓包来验证接口的正确性,例如请求参数是否正确、响应数据是否正确等。
-
安全测试:在安全测试中,可以使用抓包来检查敏感数据是否泄露,例如用户名、密码、信用卡号等。
-
性能测试:在性能测试中,可以使用抓包来获取请求的响应时间、带宽等信息,从而评估系统的性能。
在进行抓包测试时,需要注意以下几点:
-
选择合适的抓包工具:抓包工具有很多种,需要根据测试需求选择合适的工具。
-
掌握抓包工具的使用方法:需要掌握抓包工具的基本使用方法,例如设置过滤条件、分析数据等。
-
注意数据安全:抓包工具可以获取到敏感数据,需要注意数据安全。
通过掌握抓包测试技巧,可以帮助我们提高测试的效率和准确性。
常用的抓包手段主要有以下几种:
分类 | 详情 |
---|---|
物理抓包 | 物理抓包是指在网络中安装抓包设备,直接截取网络数据包。物理抓包可以捕获所有通过网络传输的数据包,包括本地发送和接收的数据包。 |
软件抓包 | 软件抓包是指在计算机上安装抓包软件,通过软件来捕获网络数据包。软件抓包只能捕获本地发送和接收的数据包。 |
浏览器抓包 | 浏览器抓包是指使用浏览器自带的抓包功能来捕获网络数据包。浏览器抓包只能捕获浏览器发送和接收的数据包。 |
代理抓包 | 代理抓包是指在计算机上设置代理服务器,然后通过代理服务器来访问网络。代理抓包可以捕获所有通过代理服务器访问的网络数据包。 Whistle 抓包代理 HTTPS 请求的原理是使用中间人攻击。中间人攻击是一种网络攻击,攻击者在目标客户端和目标服务器之间建立一个中间代理,并截获、修改、重定向客户端和服务器之间的通信。 Whistle 使用中间人攻击的方式如下:
|
以下是一些常用的抓包工具:
工具 | 详情 |
---|---|
Wireshark | Wireshark 是一个开源的网络抓包工具,支持多种网络协议,功能强大。 |
tcpdump | tcpdump 是一个命令行工具,功能强大,但使用起来比较复杂。 |
Fiddler | Fiddler 是一个 Windows 平台的抓包工具,操作简单,适合初学者使用。 |
Charles | Charles 是一个 Mac 平台的抓包工具,功能强大,适合专业人士使用。 |
whistle |
在选择抓包工具时,需要根据测试需求来选择合适的工具。如果需要捕获所有通过网络传输的数据包,则可以选择物理抓包设备。如果只需要捕获本地发送和接收的数据包,则可以选择软件抓包工具。如果需要捕获浏览器发送和接收的数据包,则可以使用浏览器抓包功能。如果需要捕获通过代理服务器访问的网络数据包,则可以使用代理抓包工具。 |
3.3.3 抓包
代理请求是指通过代理服务器发送的请求。代理服务器是一个中间服务器,它可以代替客户端向目标服务器发送请求。
在测试中,代理请求可以用于以下场景:
-
模拟用户所在的不同位置进行测试:通过代理请求,可以将请求发送到不同的位置,从而模拟用户所在的不同位置进行测试。例如,可以使用代理请求来模拟用户在不同国家或地区进行访问。
-
绕过防火墙或其他网络限制:如果目标服务器使用了防火墙或其他网络限制,可以通过代理请求来绕过这些限制。例如,如果目标服务器使用了防火墙来限制来自某些 IP 地址的访问,可以使用代理请求来绕过这些限制。
-
测试软件的跨地域访问能力:通过代理请求,可以测试软件在不同地域的访问能力。例如,可以使用代理请求来测试软件在不同国家或地区的访问速度和稳定性。
使用代理请求进行测试时,需要注意以下几点:
-
选择合适的代理服务器或代理库。
-
检查代理的有效性和稳定性。
-
了解代理的限制。
以下是一些常见的代理测试场景:
-
接口测试:在接口测试中,可以使用代理请求来模拟用户在不同位置进行访问,从而测试软件的跨地域访问能力。
-
安全测试:在安全测试中,可以使用代理请求来绕过防火墙,从而测试软件的防火墙绕过能力。
-
性能测试:在性能测试中,可以使用代理请求来模拟不同地域的访问,从而测试软件的负载均衡能力和流量控制能力。
通过掌握代理测试技巧,可以帮助我们提高测试的效率和准确性。
3.3.4 Mock
Mock 数据是指用于模拟真实数据的虚拟数据。通常在开发软件时,为了测试程序的正确性和稳定性,需要模拟各种场景下的数据。如果使用真实的数据进行测试,可能会涉及到隐私、安全等问题,同时也会受到数据来源、数量、多样性等方面的限制。为了解决这些问题,开发人员通常会使用 Mock 数据来代替真实数据。Mock 数据具有以下意义:
-
提高测试效率:Mock 数据可以快速生成,不需要等待真实数据准备好,从而提高测试效率。
-
降低测试成本:Mock 数据可以避免使用真实数据,从而降低测试成本。
-
提高测试安全性:Mock 数据可以避免使用真实数据,从而提高测试安全性。
-
扩展测试范围:Mock 数据可以模拟各种场景下的数据,从而扩展测试范围。
Mock 数据可以应用于各种软件测试场景,包括单元测试、集成测试、系统测试等
-
在单元测试中,Mock 数据可以用于模拟外部依赖,例如数据库、网络等。这样可以使单元测试更加独立,并提高测试效率。
-
在集成测试中,Mock 数据可以用于模拟其他模块的输出。这样可以使集成测试更加准确,并提高测试效率。
-
在系统测试中,Mock 数据可以用于模拟真实环境。这样可以使系统测试更加全面,并提高测试效果。
总之,Mock 数据是软件测试中的重要工具,可以有效提高测试效率、降低测试成本、提高测试安全性和扩展测试范围。
3.3.5 Debug
调试是软件开发的一个核心部分,调试的意义在于,它可以帮助开发人员找到代码中的错误、理解并解决它们。调试可以帮助开发人员更快地找到问题并解决它们,从而提高开发效率。在研发过程中,调试可以帮助开发人员更好地理解代码,并找到代码中的错误。调试还可以帮助开发人员更好地了解代码的运行方式,从而更好地优化代码。
3.3.6 压力测试
压力测试是针对特定系统或是组件,为要确认其稳定性而特意进行的严格测试。会让系统在超过正常使用条件下运作,然后再确认其结果。进行压力测试的原因可能包括:
-
确认系统在什么条件下会损坏,以及安全使用条件。
-
确认预测系统在什么条件下会损坏或其安全使用条件的数学模型是否准确
-
确认是否符合预期的规格
-
确认失效原因
压力测试可以帮助我们了解系统的性能和稳定性,并发现系统在高负载下的潜在问题。压力测试通常会使用自动化测试工具来进行,以提高测试效率和准确性。
压力测试的流程一般包括以下几个步骤:
-
测试计划:确定测试目标、测试环境、测试数据、测试用例等。
-
测试工具:选择合适的测试工具,如ab、Jemeter等。
-
测试数据:准备测试数据。
-
测试用例:编写测试用例。
-
测试执行:执行测试。
-
测试结果分析:分析测试结果,并发现问题。
压力测试的类型有很多种,常见的压力测试类型包括:
-
负载测试:测试系统在一定负载下的性能。
-
容量测试:测试系统在最大负载下的性能。
-
稳定性测试:测试系统在长时间高负载下的稳定性。
-
可靠性测试:测试系统在高负载下发生故障的概率。
压力测试是软件测试中的重要环节,可以帮助我们确保系统在高负载下能够正常运行。
04 自测实践
下面对几种自测工具或方法简单介绍,并非是自测工具或方法的详细教程,目的在于让读者有一个粗略的印象:我们在不同的自测场景中有哪些工具可以拿来使用?
4.1 构造请求
4.1.1 使用python代码构造请求
-
使用request包提交请求
import requests
# 发送 GET 请求
response = requests.get("https://xxxxxxx.com")
# 检查响应状态码
if response.status_code == 200:
# 响应成功
print("响应成功")
else:
# 响应失败
print("响应失败")
# 获取响应内容
content = response.content
# 打印响应内容
print(content)
4.1.2 使用postman构造请求
-
postman可以将构造的请求文件以json格式导出用于保存和共享。
4.2 基于whistle抓包、代理和Mock
4.2.1 测试环境的搭建
步骤 | 详情 |
---|---|
安装 | 见文档:https://wproxy.org/whistle/ |
HTTPS配置 | https://wproxy.org/whistle/webui/https.html
|
开启代理 | 见文档:https://wproxy.org/whistle/ |
4.2.2 抓包、代理、Mock
分类 | 场景 | 方法 | 效果 |
---|---|---|---|
抓包 |
| 使用Network Record即可抓取到响应请求。 | 抓取到产品某一功能对应的接口。 |
代理 |
|
|
|
mock | 替换响应数据 | 自定义values,使用resBody引用自定义的value
|
|
替换请求参数 | | 使用whistle可以直接修改参数后进行代理 | |
延迟请求时间(模拟差的网络环境) | 使用reqDelay、resDelay 将文档https://wproxy.org/whistle/rules/resDelay.html | 略 |
4.3 基于AB、Jemeter压测
4.3.1 基于AB进行压力测试
ab 命令是 ApacheBench 的缩写,是 Apache 服务器自带的一个压力测试工具。ab 命令可以模拟多个并发用户对目标服务器进行访问,从而测试目标服务器的性能。ab 命令的语法如下:
ab [options] [URL]
options 选项可以指定 ab 命令的行为,URL 参数指定要测试的目标 URL,ab 命令的常用选项如下:
-
-c:指定并发用户数。
-
-n:指定总请求数。
-
-t:指定测试持续时间。
-
-r:指定随机请求间隔。
-
-H:指定 HTTP 头部。
-
-p:指定 POST 数据。
-
-T:指定 HTTP 方法。
例如,以下命令将模拟 100 个并发用户,发送 1000 个请求,测试目标 URL 的性能:
ab -c 100 -n 1000 http://www.example.com
ab 命令的输出结果如下:
Server Software: nginx/1.17.12
Server Hostname: www.example.com
Server Port: 80
Document Path: /
Document Length: 659 bytes
Concurrency Level: 100
Time taken for tests: 5.009 seconds
Complete requests: 1000
Failed requests: 0
Total transferred bytes: 659000
HTML transferred bytes: 659000
Requests per second: 199.70 [#/sec] (mean)
Time per request: 50.089 [ms] (mean)
Time per request: 0.501 [ms] (mean, across all concurrent requests)
Transfer rate: 131.74 [Kbytes/sec] received
Connection Times (ms):
Mean: 50.089
Min: 1.000
Max: 130.000
Stddev: 10.117
ab 命令的输出结果可以帮助我们分析目标服务器的性能,例如:
-
并发用户数:并发用户数越大,对目标服务器的压力越大。
-
总请求数:总请求数越大,对目标服务器的负载越大。
-
测试持续时间:测试持续时间越长,对目标服务器的压力越大。
-
请求成功数:请求成功数越大,表明目标服务器的性能越好。
-
请求失败数:请求失败数越大,表明目标服务器的性能越差。
-
平均响应时间:平均响应时间越短,表明目标服务器的性能越好。
-
最大响应时间:最大响应时间越短,表明目标服务器的性能越好。
ab 命令是一个简单易用的压力测试工具,可以帮助我们快速了解目标服务器的性能。
4.3.2 基于Jemeter进行压力测试
JMeter 是一个功能强大、易于使用的压力测试工具,可以用于各种类型的系统。JMeter 的特性可以帮助我们进行全面、有效的压力测试。JMeter 的特性主要包括以下几点:
-
功能强大:JMeter 支持多种类型的测试,包括负载测试、容量测试、稳定性测试、可靠性测试等。
-
易于使用:JMeter 的使用界面直观,使用起来比较简单。
-
可扩展性强:JMeter 可以通过插件来扩展其功能。
JMeter 的具体特性可以分为以下几个方面:
-
测试类型:JMeter 支持多种类型的测试,包括:
(1)负载测试:测试系统在一定负载下的性能。
(2)容量测试:测试系统在最大负载下的性能。
(3)稳定性测试:测试系统在长时间高负载下的稳定性。
(4)可靠性测试:测试系统在高负载下发生故障的概率。
-
测试用例:JMeter 可以使用脚本语言或 GUI 来编写测试用例。
-
数据生成:JMeter 可以生成随机数据或特定的数据来进行测试。
-
结果分析:JMeter 可以提供多种方式来分析测试结果,例如图表、报表等。
-
插件支持:JMeter 可以通过插件来扩展其功能,例如支持新的测试类型、提供新的测试用例编写方式等。
4.3.3 压力测试报告
以下是一个压力测试报告的示例:
标题 | 详情 |
---|---|
测试概述 | 测试项目名称:系统性能测试 测试目的:测试系统在高并发场景下的性能 测试范围:系统核心接口 测试对象:系统服务器 |
测试计划 |
|
测试环境 |
|
测试方法 |
|
测试结果 | |
结论和建议 | 系统在高并发场景下能够稳定运行,满足设计要求。建议在实际使用中,根据业务需求调整并发用户数量。 压力测试报告是压力测试过程的重要产物,它可以帮助我们了解系统的性能瓶颈,并采取措施进行改进。在编写压力测试报告时,应注意以下几点:
|
4.4 Java/Go项目调试
Java | GO | |
本地调试 | (1) Java调试神器Arthas: https://arthas.aliyun.com/ (2) 断点:Java程序是运行在JVM上的,调试java程序,事实上就是向虚拟机请求其当前的运行状态等,JPDA就是虚拟机提供的一整套用于java调试的工具和接口。 | 断点调试 |
远程调试 | dlv + GoLand 远程调试 | |
备注 | 在断点调试的时候,是可以通过"set value" 给变量重新赋值的,曾经见一个5年+的Java程序员竟然不知道。事实上,很多被认为是“常识性”的东西也容易成为“盲点”,可见本文所介绍的内容是有意义的。 |
05 总结
综上,研发工程师掌握一些测试技巧是十分必要的。测试是软件开发过程中必不可少的环节,是保证软件质量的重要手段。服务端软件工程师掌握一些测试技巧,可以做到:
-
提高软件质量:测试可以发现软件中的缺陷和错误,从而帮助提高软件的质量。
-
缩短开发周期:测试可以帮助发现软件中的潜在问题,从而避免在后续的开发过程中重复修复。
-
降低开发成本:测试可以帮助发现软件中的缺陷和错误,从而避免在后续的维护过程中进行昂贵的修复。
本文并非是指导研发人员进行自测的详细教程,各位同学在不断的实践探索中终究会掌握提升自己的测试技能。
ps. 部分内容由gemini.google.com生成。
06 参考资料
[1] whistle: https://wproxy.org/whistle/
[2] ab - Apache HTTP server benchmarking tool: https://httpd.apache.org/docs/2.4/programs/ab.html
[3] jmeter: https://jmeter.apache.org/
[4] Arthas: https://arthas.aliyun.com/
[5] postman: https://web.postman.com/
封面故事
2023年国庆,雨中的恩施大峡谷。