接口测试是软件测试中的一项重要工作,它涉及到系统与系统之间的交互点。接口可以是外部接口,也可以是内部接口,包括上层服务与下层服务接口以及同级接口。在接口测试中,我们需要确保接口能够按照预期的方式进行通信和交互,并且能够正确处理输入和输出数据。
接口是具有特定输入和输出的一套逻辑处理单元,它不需要了解内部的实现逻辑,可以看作是黑盒处理逻辑。接口可以是外部系统与系统之间的交互点,也可以是系统内部不同子系统之间的交互点。
首先,尝试使用 HTTP 和 HTTPS 分别进行登录。如果使用 HTTPS 可以正常登录,并且浏览器地址栏显示一个锁头图标,说明该网站已经部署了 SSL。如果 HTTP 和 HTTPS 都可以正常登录,进一步说明该网站没有设置强制使用 HTTPS 登录,或者没有设置 HTTP 自动跳转到 HTTPS。
如果使用 HTTP 登录后跳转到 HTTPS 页面,说明该网站已经部署了 SSL,并且设置了 HTTP 自动跳转到 HTTPS。
根据实际情况和需求,可以调整测试方案并相应地修改模块的请求方式。
常用的 HTTP 协议调试代理工具包括 Fiddler、Charles、Postman 等。以下以 Fiddler 为例,详细说明抓取 HTTPS 协议的设置过程:
打开 Fiddler 工具,在菜单栏选择 “Tools”,然后选择 “Options”。
在 “Options” 窗口中,选择 “HTTPS” 选项卡,并勾选 “Capture HTTPS CONNECTs” 和 “Decrypt HTTPS traffic” 选项。
根据需要选择要解密的来源,可以选择 “All Processes” 或者手动添加需要解密的进程。
可选择是否忽略服务证书错误,根据测试需求进行设置。
完成以上设置后,可以在浏览器中设置代理地址为 “IP:8888”,然后安装 Fiddler 提供的证书,即可在浏览器中抓取 HTTPS 协议的数据流量。
利用数据库操作进行数据的增删改查,通过造数据和数据清理来处理垃圾数据。
在测试用例的前置操作中,可以使用 setUp 方法进行数据准备。
在后置操作中,可以使用 tearDown 方法进行数据清理。
在执行测试前整库备份,测试完毕,备份还原(不推荐)
搭建一个模拟服务,以模拟第三方接口的返回数据。例如,可以使用 Moco 这样的开源框架来搭建模拟服务。搭建模拟服务需要熟悉相关工具和框架,并能够掌握如何模拟返回的数据、数据格式以及请求方式等。
利用一些模拟工具(如 JSON Server、EasyMock)来模拟第三方接口的数据返回,以尽可能减少对第三方数据接口的依赖。
测试数据的存放位置可以根据实际情况和需求来决定。以下是一些常用的测试数据存放方法:
对于登录账户数据、注册账户数据、接口参数以及邮箱配置数据等不同类型的数据,可以根据其特点进行存放。例如,登录账户数据和注册账户数据可以使用配置文件(如 INI 文件)存放;接口参数可以使用 YAML、JSON、Excel 等格式进行存放。
对于一些需要多组测试参数的接口,可以采用参数化的方式进行数据存放。可以使用 YAML、文本、JSON、Excel 等文件来管理参数化数据。
对于需要反复使用的数据,例如订单状态数据,可以将其存放到数据库中,在每次数据初始化之后使用,并在使用完毕后进行清理。
对于少量的静态数据,如单个接口的测试数据,可以将其写入到脚本的开头部分,或者使用全局变量进行存储。
数据驱动是一种测试方法,通过将测试数据和测试逻辑分离,实现对测试数据的灵活管理和重复使用。参数化是数据驱动的一种常见方式,它通过在测试用例中引入参数,根据不同的参数生成多个测试用例。
在接口测试中,数据驱动和参数化的概念非常重要,可以提高测试效率和覆盖率。以下是一些常用的数据驱动和参数化的实现方式:
在 Python 的 unittest 框架中,可以使用 ddt 模块来实现数据驱动和参数化。通过使用 @ddt 和 @data 这两个装饰器,可以在测试用例中传入不同的参数,并生成对应的测试用例。
在 pytest 框架中,可以使用 @pytest.mark.parametrize 装饰器实现参数化。通过传入不同的参数组合,生成对应的多个测试用例。
将不同的接口封装为不同的函数或方法,让其返回所需的数据。使用一个中间变量来接收上一个接口返回的数据,并将其传递给下一个接口。可以使用全局变量或者测试类的属性来保存中间数据或者数据库等等。
对于单接口测试中,如果依赖接口只需要在测试开始执行一次,可以将依赖接口的请求放在类级别的前置方法中,并通过全局变量或者当前用例类的属性来传递依赖数据。例如,使用类属性 cls.token = data[‘token’] 来保存依赖的 token 数据。
对于单接口测试中,如果依赖接口需要在每个用例前执行,可以将依赖接口的请求放在方法级别的前置方法中,并通过用例对象的属性来传递依赖数据。例如,使用实例属性 self.order_id= res[‘id’] 来保存依赖的 ID 数据。
对于多接口的业务流测试,可以通过当前用例类的属性来传递下一个接口所需的依赖数据。例如,使用类属性 self.class.order_id = self._response.json()[‘data’][‘id’] 来传递下一个接口需要的数据。
对于需要 token 的登录接口,可以在登录后将 token 存储到一个 YAML、JSON 文件中,或者直接使用全局变量或测试类的属性进行保存。后续的请求可以从存储的位置获取 token 并使用。
对于需要 cookies 参数的接口,可以使用 requests.session() 创建一个会话对象,并在后续的请求中使用该会话对象进行自动关联 cookies。通过 s.get() 和 s.post() 方法发送请求,会话对象会自动关联 cookies。
发送接口请求:使用合适的工具或框架发送请求,并携带请求参数。
测试接口获取返回值:获取接口返回的数据,包括响应状态码、响应头和响应体等。
断言:根据预期结果,对接口返回的数据进行断言判断,验证实际结果是否符合预期。
在测试开始前先进行登录操作,获取有效的登录凭证(如 token 或 cookies)。
在每个需要登录状态的接口测试用例中,先进行登录操作,并获取登录凭证。
将获取的登录凭证保存在全局变量、测试类的属性或者配置文件中,以便在后续的请求中使用。
在发送请求时,将登录凭证作为请求参数或者请求头的一部分进行携带。
在接口返回结果中验证登录状态相关的信息,确保接口正确处理了登录状态。
SOAP代表简单对象访问协议(Simple Object Access Protocol),它是一种基于XML的协议,用于在计算机之间交换结构化信息。SOAP被设计用于不同的应用程序和操作系统之间的通信,它使用XML格式来定义消息的结构和内容,并使用HTTP、SMTP等协议进行消息的传输。SOAP通常用于Web服务之间的通信,通过SOAP协议,应用程序可以以标准的方式进行远程过程调用(RPC)。
REST API是一组用于实现网络应用程序之间通信的功能集合。REST代表表现层状态转移(Representational State Transfer),它是一种基于HTTP协议的设计风格,被广泛应用于构建分布式系统和互联网应用。REST API使用HTTP方法(GET、POST、PUT、DELETE等)来实现对资源的访问和操作,并使用URL来定位资源。相比于SOAP等复杂的协议,REST API更加简单、轻量且易于理解,它已成为创建Web服务和移动应用程序的常用标准。
缺少或重复的功能:API未实现某些功能或存在重复的功能。
无法正常处理错误条件:API未能正确处理错误情况,如无效的输入、异常情况等。
可靠性:API在高负载、并发或异常网络情况下的表现不稳定或不可靠。
安全:API存在安全漏洞,如未经身份验证的访问、敏感数据泄露等。
未使用的标志:API中存在未使用或废弃的标志或参数。
未实现错误:API中存在未实现或未正确实现的功能。
错误处理不一致:API对不同的错误条件没有统一的处理方式或错误信息不一致。
性能:API在处理大数据量或高并发情况下性能下降或出现延迟。
多线程问题:API在多线程环境下出现数据竞争、同步问题等。
错误不正确:API返回的错误信息或状态码与预期结果不符。
测试的接口属于服务器接口,即基于HTTP协议的接口。这类接口通常是B/S架构的,由客户端(如浏览器)调用或模拟客户端调用服务器提供的请求接口,服务器完成处理并返回响应。例如,Web服务接口、HTTP接口、JMS接口、Hessian接口等都属于这一类别。
Cookie可以保存在不同的位置,具体取决于是否设置了过期时间:
如果设置了过期时间,Cookie将保存在客户端的硬盘中,即存储在浏览器的Cookie文件中。
如果没有设置过期时间,Cookie将保存在客户端的内存中,即存储在浏览器的内存中。这种类型的Cookie通常称为会话Cookie,它只在浏览器会话期间有效,关闭浏览器后会被删除。
GET:用于请求获取指定资源的表示。通过URL传递参数,通常用于获取数据。
POST:用于向指定资源提交数据,通常用于提交表单或进行资源创建。
PUT:用于向指定资源位置上传新的表示,通常用于资源的更新。
DELETE:用于请求删除指定的资源。
OPTIONS:用于获取目标资源所支持的通信选项。
HEAD:类似于GET请求,但只返回响应头部信息,不返回响应体。
PATCH:对资源进行部分修改。
需求分析:了解接口的功能和需求,明确测试的目标和范围。
用例设计:根据需求编写测试用例,包括正向测试、边界测试、异常测试等不同场景的测试用例。
脚本开发:使用合适的编程语言和测试框架编写自动化测试脚本,实现接口的请求和响应验证等功能。
测试执行:执行自动化测试脚本,发送接口请求并获取响应结果。
结果分析:对测试结果进行分析和比对,判断接口是否符合预期结果。
缺陷跟踪:如果发现接口存在缺陷,及时记录并跟踪缺陷,确保问题得到解决。
报告生成:生成测试报告,包括测试覆盖率、测试结果、缺陷统计等信息,供团队和管理层查阅。
必填字段:测试请求参数的必填项和可选项。
合法性:验证输入和输出数据的合法性,包括合法的参数值、数据类型等。
边界:测试请求参数的边界值,例如最大值、最小值、临界值等。
容错能力:测试接口在大容量数据、频繁请求、重复请求等异常情况下的处理能力。
响应数据校验:对接口的响应数据进行断言和校验,验证返回结果是否符合预期。
逻辑校验:测试不同接口之间的逻辑关系,如某些请求需要按严格的先后顺序调用。
性能:进行接口的并发测试,逐步增加负载,分析系统的性能瓶颈点。
安全性:测试接口的安全性,如输入恶意字符、注入攻击、敏感信息泄露等。
异常处理:测试接口在各种异常情况下的处理能力,如网络异常、服务器错误等。
目标、方法、技术。
UI级别测试(User Interface Testing)关注于测试应用程序的用户界面,验证用户如何与应用程序进行交互,测试应用程序元素的外观和行为,例如按钮、表单、布局等。UI级别测试主要关注应用程序的外观和用户体验。
API测试(Application Programming Interface Testing)关注于测试应用程序接口,验证接口的功能、性能、可靠性等。API测试主要关注应用程序的功能和内部逻辑,独立于用户界面。API测试可以通过直接调用接口发送请求并验证响应结果来进行,无需依赖UI界面。
UI级别测试和API测试是在不同层面上进行的测试,UI级别测试更加关注应用程序的外观和用户交互,而API测试更加关注应用程序的功能和内部实现。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!